创建字符串
String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,下面是常用的:
1 | //直接创建 |
当n个字符串直接由+连接起来组成新的字符串时,不是分别创建n+1个String对象。而是直接将合成一个字符串,即只创建了一个字符串对象
1 | String a = "abc"+"123"+"567"; |
当分别创建字符串变量,然后使用+连接起来时
1 | String a = "abc"; |
注意:String是不可变字符串,如果需要对字符串做很多修改,那么应该选择使用 StringBuffer 和 StringBuilder 类
String的常用方法
length()
返回字符串的长度
concat
连接字符串,例如string1.concat(string2);
char charAt(int index)
返回指定索引处的 char 值。
boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束。
indexOf(…)
1 | int indexOf(int ch) |
intern()
转载这里
今天在看一本书的时候注意到一个String的intern()方法,平常没用过,只是见过这个方法,也没去仔细看过这个方法。所以今天看了一下。个人觉得给String类中加入这个方法可能是为了提升一点点性能,因为从常量池取数据比从堆里面去数据要快一些。(个人感觉)
API上的那几句关于这个方法,其实总结一句就是调用这个方法之后把字符串对象加入常量池中,常量池我们都知道他是存在于方法区的,他是方法区的一部分,而方法区是线程共享的,所以常量池也就是线程共享的,但是他并不是线程不安全的,他其实是线程安全的,他仅仅是让有相同值的引用指向同一个位置而已,如果引用值变化了,但是常量池中没有新的值,那么就会新开辟一个常量结果来交给新的引用,而并非像线程不同步那样,针对同一个对象,new出来的字符串和直接赋值给变量的字符串存放的位置是不一样的,前者是在堆里面,而后者在常量池里面,另外,在做字符串拼接操作,也就是字符串相”+”的时候,得出的结果是存在在常量池或者堆里面,这个是根据情况不同不一定的,我写了几行代码测试了一下。
先上结果:
- 直接定义字符串变量的时候赋值,如果表达式右边只有字符串常量,那么就是把变量存放在常量池里面。
- new出来的字符串是存放在堆里面。
- 对字符串进行拼接操作,也就是做”+”运算的时候,分2中情况:
i. 表达式右边是纯字符串常量,那么存放在栈里面。
ii. 表达式右边如果存在字符串引用,也就是字符串对象的句柄,那么就存放在堆里面。
1 | String str1 = "aaa"; |
结果:str1、str2、str3、str5都是存在于常量池,str4由于表达式右半边有引用类型,所以str4存在于堆内存,而str5表达式右边没有引用类型,是纯字符串常量,就存放在了常量池里面。
lastIndexOf(…)
1 | int (int ch) |
boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式
replaceXXX()
1 |
|
split()
转载菜鸟教程
split() 方法根据匹配给定的正则表达式来拆分字符串。
注意: . 、 | 和 * 等转义字符,必须得加 \。
注意:多个分隔符,可以用 | 作为连字符。
语法:
1 | public String[] split(String regex, int limit) |
实例:
1 | public class Test { |
以上程序执行结果为:
1 | - 分隔符返回值 : |
String trim()
返回字符串的副本,忽略前导空白和尾部空白。
substring(…)
1 | String substring(int beginIndex) |
更多Java String的方法见api