每种语言都会有字符串的操作,因为字符串是我们平常开发使用频率最高的一种类型。今天我们来聊一下Java的字符串操作及在某些具体方法中与C#的不同,对于需要熟悉多种语言的人来说,作为一种参考。进行诫勉

首先,什么是字符串?

字符串是字符的序列,是作为一种对象而存在。说的直白点,字符串就是一些字符的组合,从而构成字符串,例如“abc”就是字符串,"郭志奇"也是一种赐福穿。

我们知道,Java是一种面向对象的高级程序语言。所有事物均为对象,字符串也不例外,也是一种对象,其对应类型为String。

下面,我们分几种情况来进行说明字符串:

  1. 字符串的创建
  2. 字符串操作
    1. 字符串连接
    2. 字符串长度
    3. 字符串查找
    4. 获取指定索引的字符
    5. 去重空格
    6. 判断相等
    7. 大小写转换
    8. 字符串分隔
    9. 字符串比较

字符串创建

字符串必须先声明并进行初始化,才能使用,否则编译器会报出 变量未初始化错误。

请注意:Java中字符串定义的类型为String(第一个字母大写),对于C#程序员来说,看着不太舒服,因为c#中字符串定义为string (第一个字母小写),但C#中也是有String类的

创建字符串也分几种方式,可以根据需求灵活组织:

String(char a[])--Java代码

         char a[] = { 'a', 'b', 'c' };
String source = new String(a);
System.out.println(source);//输出结果为abc

String(char a[],int offset,int length)--Java代码

         char a[] = { 'a', 'b', 'c' };
String source = new String(a, 1, 2);
System.out.println(source);//输出为bc

字符串常量:

String source=“郭志奇”;

         String source = "郭志奇";
String source1 = "郭志奇";
System.out.println(source == source1);// 输出true
System.out.println(source.equals(source1));// 输出true

此处简单提一下,Java中双等号== 表示的是引用是否相同,equals比较的是实际的字符串值。

对应的C#代码

             string source = "郭志奇";
string source1 = "郭志奇";
Console.WriteLine(source==source1);//输出True
Console.WriteLine(source.Equals(source1));//输出True
Console.WriteLine(string.ReferenceEquals(source,source1));//输出True
Console.Read();

在C#中双等号以及equals比较的是实际的值,而refreshEquals比较的是引用是否相同。和Java略有不同。

字符串操作

  1. 字符串连接
    通过加号+可以将两个字符串进行连接。请注意,字符串与其他类型连接,会自动调用其toString方法转换成字符串,然后进行拼接。
    Java代码:

             String source = "郭志奇";
    String source2 = "郭语晨";
    String source3 = source + source2;
    System.out.println(source3);// 输出郭志奇郭语晨
    String source4 = source + 521;// 字符串与数字拼接
    System.out.println(source4);//输出郭志奇521

    concat:字符串拼接

             String source = "郭志奇";
    String source2 = "郭语晨";
    String source5 = source.concat(source2);
    System.out.println(source5);// 输出郭志奇郭语晨
  2. 字符串长度
    通过length()方法获取字符串长度。请注意:包含字符串中空格的长度。
    Java代码:
             String source = "     郭志奇 ";//前缀包含一个空格及一个tab 后缀包含一个空格
    System.out.println(source.length());// 输出6

    C#代码:
    找茬:从C#输出的长度可以看到,Tab在Java中长度为1,而在C#长度为2. 英文tab

                 string source = "   郭志奇 ";
    Console.WriteLine(source.Length);//输出7
  3. 字符串查找
    两种字符串查找方法:
    indexOf():从字符串开始位置进行查找
             String source = "郭志奇";
    System.out.println(source.indexOf("郭"));// 输出0
    System.out.println(source.indexOf(""));// 输出0

    lastIndexOf()方法:从字符串结束位置开始查找

             String source = "郭志奇";
    System.out.println(source.lastIndexOf("郭"));// 输出0
    System.out.println(source.lastIndexOf(""));// 输出3

    找茬:indexOf查找空字符串,返回值是0。lastIndexOf方法查找空格,返回值是3.等于字符串的长度。
    查看lastIndexOf对应的C#代码实现:

                 string source = "郭志奇";
    Console.WriteLine(source.Length);//输出3
    Console.WriteLine(source.LastIndexOf(""));//输出2
    Console.Read();

    通过对比lastIndexOf查找空字符串,可以发现C#和Java的不同,Java返回的是字符串的长度,而C#返回的是字符串长度-1。个人认为C#的处理更符合目的。

  4. 获取指定索引的字符
    通过charAt方法获取指定索引的字符
             String source = "郭志奇";
    System.out.println(source.charAt(0));//输出郭
    System.out.println(source.charAt(source.length() - 1));//输出奇

    为了学习,我们就要思考,假如我输入了负数或大于字符串长度的索引会出现什么呢?代码验证

             String source = "郭志奇";
    System.out.println(source.charAt(-1));
    System.out.println(source.charAt(source.length() + 11));

    没错,代码执行出错了,抛出异常:java.lang.StringIndexOutOfBoundsException

  5. 去重空格
    通过trim方法移除字符串前后空格(包含tab)
             String source = " 郭志奇  ";// 前后都有空格
    String source1 = " 郭志奇 ";
    System.out.println(source.length());
    System.out.println(source.trim().length());
    System.out.println(source1.length());
    System.out.println(source1.trim().length());

    令人遗憾的是,Java没有提供只清空前缀空格或后缀空格的方法。而C#却有。

  6. 判断相等
    两种判断字符串相等的方法,双等号及equals、equalsIgnoreCase
    通过代码来进行说明:
             String source = new String("郭志奇A");
    String source1 = new String("郭语晨");
    String source2 = "郭志奇A";
    String source3 = "郭语晨"; String source4 = "郭志奇a"; System.out.println(source == source2);// false
    System.out.println(source.equals(source2));// true
    System.out.println(source1 == source3);// false
    System.out.println(source1.equals(source3));// true System.out.println(source == source4);// false
    System.out.println(source.equals(source4));// false
    System.out.println(source.equalsIgnoreCase(source4));// true

    双等号代表的是字符串引用是否相同,对于不同对象的字符串,双等号比较是不同的。
    equals比较的是字符串的值,但区分大小写
    equalsIgnoreCase:比较的是字符串的值,不区分大小写
    进行字符串比较,尽量避免使用双等号。

  7. 大小写转换
    toUpperCase转换成大写形式,toLowerCase转换成小写形式。但对于数字、空格则会忽略,不进行转换。比较简单
  8. 字符串分隔
    通过split方法进行字符串分隔,split参数是分隔符,返回值是分割后的字符串数组。较简单。
  9. 字符串比较
    通过compareTo方法进行字符串比较,
         String source = "ab";
String source1 = "ba";
String source2 = "ab";
System.out.println(source.compareTo(source1));//返回值-1
System.out.println(source.compareTo(source2));//返回值0
System.out.println(source1.compareTo(source2));//返回值1 System.out.println(source.compareToIgnoreCase(source1));//返回值-1
System.out.println(source.compareToIgnoreCase(source2));//返回值0
System.out.println(source1.compareToIgnoreCase(source2));//返回值1

compareTo方法会逐个字符进行比较,如果源字符串比目标字符串大,那么返回正整数;如果源字符串与目标字符串相同,那么返回0;如果源字符串比目标字符串小,那么返回负数。

请注意:

1、返回值为0,那么字符串通过equals比较会相同

2、返回值正整数、负数,是源字符串不同的字符相减所得。

字符串使我们日常开发使用频率最高的类型,因此要数量掌握字符串的各种操作,以及一些坑点,才能在编码中轻松、愉快的避免各种bug的出现。

本次说明只介绍了字符串的冰山一角,对于更重要的字符串格式化,本次没有涉及,因为蛋蛋字符串格式化,就可以单独写一篇更长的博文才能说明。下次再聊。

Java字符串操作及与C#字符串操作的不同的更多相关文章

  1. Java初学者笔记三:关于字符串和自实现数组常见操作以及异常处理

    一.字符串常见的操作 1.结合我在python中对于字符串常见处理总结出下面三个应该能算是字符串造作的TOP 3 //字符串查找子串,存在返回index,不存在返回-1 等于python的find: ...

  2. Java实验项目三——递归实现字符串查找和替换操作

    Program:按照下面要求实现字符串的操作: (1)设计一个提供下面字符串操作的类 1)编写一个方法,查找在一个字符串中指定字符串出现的次数. 2)编写一个方法,参数(母字符串,目标字符串,替换字符 ...

  3. Lesson12——NumPy 字符串函数之 Part1:字符串操作函数

    NumPy 教程目录 1 NumPy 字符串函数 以下函数用于对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作. 它们基于 Python 内 ...

  4. javascript中字符串常用操作总结、JS字符串操作大全

    字符串的操作在js中非常频繁,也非常重要.以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊...今天就对字符串的一些常用操作做个整理,一者加深印象,二者方便今后温 ...

  5. IOS NS 字符串 数组 字典 文件 动态 静态 操作

    ios 常用字符串的操作   //将NSData转化为NSString        NSString* str = [[NSString alloc] initWithData:response e ...

  6. js--javascript中字符串常用操作总结、JS字符串操作大全

    字符串的操作在js中非常频繁,也非常重要.以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊...今天就对字符串的一些常用操作做个整理,一者加深印象,二者方便今后温 ...

  7. C风格字符串和C++ string 对象赋值操作的性能比较

    <<C++ Primer>> 第四版 Exercise Section 4.3.1 部分Exercise 4.2.9 习题如下: 在自己本机执行如下程序,记录程序执行时间: # ...

  8. PHP操作redis之String(字符串)、List(列表)(一)

    Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key – value 缓存产品有以下三个特点: Redis支持数据的持久 ...

  9. 【微软100题】定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。

    package test; /** * 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串abcdef左旋转2位得到字符串cdefab. 请实现字符串左旋转的函数. * ...

随机推荐

  1. Javascript模版引擎mustache.js简介

    背景 最近使用ELK的sentinl进行告警配置,sentinl的邮件通知支持mustache,借此机会学习了mustache相关知识,记录在此. mustache的思想 mustache的核心是标签 ...

  2. HBase最佳实践之Scan

    一.简介 HBase中Scan从大的层面来看主要有三种常见用法:ScanAPI.TableScanMR以及SnapshotScanMR.三种用法的原理不尽相同,扫描效率当然相差甚远,最重要的是这几种用 ...

  3. The concurrent snapshot for publication 'xxx' is not available because it has not been fully generated or the Log Reader Agent is not running to activate it

    在两台测试服务器部署了复制(发布订阅)后,发现订阅的表一直没有同步过来.重新生成过snapshot ,也重新初始化过订阅,都不能同步数据,后面检查Distributor To Subscriber H ...

  4. Linux学习历程——Centos 7 cat命令

    一.命令介绍 我们使用man cat命令,可以看到cat命令的用途是连接文件或标准输入并打印,简单来说cat命令是用来查看纯文本文件(通常为内容较少的文件),与重定向符号配合使用,可以实现创建文件与合 ...

  5. 2016某知名互联网公司PHP面试题及答案(续)

    1 写出mysql中,插入数据,读出数据,更新数据的语句 INSERT INTO 表名 VALUES ("",""): SELECT * FROM 表名:. U ...

  6. docker基础学习(一)

    操作演示: 1.查看一个容器的版本 [root@ELK-chaofeng08 ~]# docker version Client: Version: API version: 1.39 Go vers ...

  7. 手动搭建Docker本地私有镜像仓库

    实验环境:两个Centos7虚拟机,一个是Server,用作客户端,另一个是Registry,用作Docker私有镜像仓库. 基础配置 查看一下两台虚拟机的IP地址 Server的IP地址是192.1 ...

  8. June.19 2018, Week 25th Tuesday

    True love is visible not to the eyes but to the heart. 真爱不靠眼睛看,要用心感受. True love is visible not to th ...

  9. June 16. 2018, Week 24th. Saturday

    Success is the ability to go from one failure to another with no loss of enthusiasm. 成功,就是即使经历过一个又一个 ...

  10. 【2018.08.13 C与C++基础】网络通信:阻塞与非阻塞socket的基本概念及简单实现

    一.前言 最近在做Matalb/Simulink与C/C++的混合编程,主要是完成TCP.UDP.SerialPort等常见通信方式的中间件设计,为Simulink模型提供数据采集及解析模块. 问题在 ...