本篇文章将会对Java中字符串的相关操作进行总结
概念
Java中字符串是用双引号引起来的一串字符或unicode序列,例如:”hello”就是一个在字符串,Java中使用string类对字符串进行定义,例如:String str = “hello”即定义了一个在字符串str,且str的值是hello。
基本操作
取子串
substring(a,b)方法将字符串a位置开始起到b位置(不包含b位置)上的字符取出。
1 | System.out.println("Hello".substring(0,3));//将会返回Hel |
拼接
将两个甚至多个字符串拼接成一个字符串有一下三个方法:
a+b:将a和b两个字符串合并为一个字符串;当a、b中只有一个为字符串时,不为字符串的值也会转换为字符串
1
System.out.println("Hello"+ 10);//将会输出Hello10
join(a,b):将多个字符串进行拼接,并且以a在字符串作为分割;
1
System.out.println(String.join("! ","Hello","World"));//将会输出Hello!world
repeat(n):将字符串重复n遍
1
ystem.out.println("Hello".repeat(2));//将会输出HelloHello
修改字符串
在java中字符串实际上是不可变的,可以这样理解:虽然果篮里面可以放各种水果,但是苹果始终都是苹果,不会变成香蕉。这其实是java中的工作机制造成的。这将在文章中最后进行介绍。
既然Java中不允许对字符串的元素进行修改,那么我们从现有的字符串中选取出我们想要的在字符,然后再与其他的字符拼接字组成我们想要的字符串。
我们可以先用substring方法取处原字符串中需要保留的字符串,然后通过+将替换的字符串进行拼接。1
System.out.println("Hello".substring(0,3) + "p!");//将会返回Help!
判断字符串是否相等
在java中判断字符串是否不可以用==判断两个字符是否相等,这判断的时两个字符串是否存储同一位置。
在Java中判段两个字符串是否相等可以使用以下两种方法:s.equals(t):如果字符串s与t相等将会返回true,否则将会返回false(区分大小写)
s.equalsIgnoreCase(t):判断两个字符串是否相等,不区分大小写
1
System.out.println("Hello".equals("hello"));//返回falseSystem.out.println("Hello".equalsIgnoreCase("hello"));//返回true
判断字符串是否为空
在Java中定义一个空字符串有两种方式,对应了两种不同的判断空串的方法,他们之间的判断方法不可以错用。
“”:这种定义空串的方式,在计算机的“眼里”,他是有内容的(内容为空),有长度的(长度为0),所以这种空串有以下两种方式进行判断:
- if(str.length() == 0)//判断长度是否为0
- if(str.equals(“”))//判断内容是否为空
null:这种定义空串的方式,相当于告诉计算机,我要一个字符串,但是里面没有任何内容。这种方式定义的字符串可以使用:if(str == null)进行判断。
字符串的长度
由于java的char类型是一个采用UTF-16编码表示的unicode码点的代码单元。前面也说过虽然这种方式能够容纳更多的字符,但是随之类似与中文这样表意的字符的加入,这种编码方式依然被挤爆了。所以java中有些字符占了两个代码单元。
于是,很自然的,Java中有以下两种方式求字符串分别来求两种不同角度的字符串长度。length:返回字符串所需要的代码单元数量
1
System.out.println("world".length());//将会返回5
codePointCount(0,str.length()):返回实际的长度,即码点数量
1
System.out.println("world⊕".codePointCount(0,"world⊕".length()));//返回7,⊕字符需要使用两个代码单元
随机访问
charAt(n):返回位置n的代码单元
1
System.out.println("world".charAt(0));//将返回w
遍历
这里记录Java中三种方式对字符串进行遍历(当不止这三种方式)
方法一:charAt方法1
2
3
4for(int i=0;i < str.length();i++) {
System.out.println(str.charAt(i));
}方法二:substring方法
1
2
3
4
5for(int i=0;i < str.length();i++) {
System.out.println(str.substring(i,i+1));
}方法三:toCharArray方法,将字符串方法转换成字符数组。
1
2
3
4
5
6char[] c = str.toCharArray();
for(int i=0;i < c.length;i++) {
System.out.println(c[i]);
}
最后java中的string类有数千个方法,这里不可能逐个解释,也不需要对每一个都了如>指掌,有需要的时候可以访问java的额API文档进行了解: https://docs.oracle.com/javase/8/docs/api/
浅谈Java不可变类
在java中有很多的不可变类,例如Interger、Long、String。
Java将不可变类放到了一个公共的存储池中。我们定义一个字符串str,然后将它初始化为“hello”,实际上其过程可以理解为,计算机划分了一块空间,然后将str1指向它。这块空间里面的东西将无法改变,但是str在字符串确可以指向其他的在字符串

现在在定义一个字符串str2,其值也初始化为hello,进行==判断将会判断为true
1 | String str1 = "hello"; |
这是因为str2也指向了这个hello在字符串所在的空间

但是如果现在定义一个在字符串str3,虽然str3也初始化为hello,但是初始化的方式是
1 | String str2 = "hel"; |
现在分别进行==判断和用equals方法进行判断将会得到不同的结果:
1 | String str2 = "hel"; |
这是因为Java实际上只是共享了字符串的字面量(即hello这个值),但是对于+和substring等方法的得到的字符串却不会进行共享。

设计不可变类型的最大的好处就是当需要进行复制一个字符串变量是,只需要将这个变量指向共享的空间就可以了。但是也为诸如提取字串、拼接等带来了麻烦。但是java设计者认为共享空间带来的好处更大。
查看幕布版笔记请点击
本文链接: https://quandongli.github.io/post/eea9faf9.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
