String字符串的使用方式
直接赋值的方式:String str = “hello”;
生成对象的方法:String str = new String(“hello”);
两种方式的比较:
代码:
String str =new String("hello");
因为首先因为”hello”该字符串,需要在堆内存中开辟一块空间存放
有了”hello”已在堆内存的空间后,又去new 出 新的一块空间存放”hello”,再被str指向
而没有被指向的第一个的”hello”等待被回收。由此可知:
一般情况下,String str = new String(“hello”); 通过new方式来生成字符串对象实际上开辟了两个空间来储存字符串,而其中的一个是没用的。 所有使用直接赋值的方式比较多。
String字符串的比较方式
双等==的方式:比较两个字符串的内存空间的地址
equals的方式 : 比较两个字符串的内容
String字符串的内容不可更改
分清 引用/地址 与 内容 : String str = “hello” :”hello”为内容,str为引用/地址,str指向存储”hello”这块内存空间。
String str = “hello”; str = “hi”;由字符串的内容不可更改,堆内存开辟了两块空间,一块存”hello”一块存”hi”,而str先指向”hello”后指向”hi”.
一旦创建了String对象那么是不能改变的。如果有必要修改字符的字符串,那么应该使用 String Buffer & String Builder 类.
String字符串的常用方法
字符串的长度:length()方法
字符串转换为字符数组:toCharArray()方法
从字符串中取出指定位置的字符:charAt()方法 (这样一来,如果只是取字符,没必要先将它转为字符数组了)
字符串转换为byte数组:getBytes()方法
过滤字符串中存在的字符,判断有没有某字符,没有返回-1,有返回该字符在字符串中的位置。indexOf();
去掉字符串的前后空间:trim();方法:只针对字符串的前后空格。
连接字符串:
str = str1.concat(str2)
或str1 += str2
创建格式化字符串:
String fs; fs = String.format("The value of the float variable is " + "%f, while the value of the integer " + "variable is %d, and the string " + "is %s", floatVar, intVar, stringVar);
StringBuffer的使用
- StringBuffer字符串的缓冲区,其字符串内容是可以更改的(不需要开辟新的内存空间,不需要新的指向)。
StringBuffer strb = new StringBuffer("hi");
strb.append("hello"); //尾部追加方法
strb.reverse(); //颠倒方法
- 通过方法体可达到更改缓冲区中字符串内容的效果。
- 常用方法
public StringBuffer delete(int start, int end) //删除一定区间的字符
start -- 开始的索引(包括)。
end -- 结束索引(不包括)。
StringBuffer sb = new StringBuffer("abcdefghijk");
sb.insert(3,"123"); //插入方法,可规定插入的位置
System.out.println(sb);
StringBuffer sb = new StringBuffer("abcdefghijk");
sb.replace(3, 8, "ZARA");
//替换方法,end -- 结束索引(不包括)。实际先删除对应区间的字符,再进行插入字符串
System.out.println(sb);
- StringBuffer相比于String的优势
优势在于:一般情况下,用StringBuffer进行字符串的拼接时,不需要进行新开辟空间存在新的字符串,而String每次都要开辟新的内存空间存放新的字符串。
StringBuilder的使用
StringBuider跟StringBuffer是极其相像的,是一个可变的字符序列,该类设计作为StringBuffer的一个简易替换,用于字符串缓冲区被单个线程使用的时候。其速度比StringBuffer快。而涉及多线程/线程安全时,建议使用字符串缓冲区StringBuffer类.
单线程推荐使用StringBuilder,因为它比StringBuffer的速度更快。但是,如果线程安全是必要的最好的选择StringBuffer对象。
常用方法与StringBuffer的类似。
String总结
String 是一个final类,不能被继承,实例值不能被改变。
StringPool(字符串池)不会重复存在相同内容的字符串对象。
s.intern() == t.intern() <=> s.equals(t)String str = “aaa”
字面值赋值:检查字符串池里有没有对应内容的对象,没有就在池中创建新的字符串对象并返回新对象的地址;有就已经有的字符串对象地址返回。String str = new String(“aaa”) new
赋值:先在StringPool中查询有没有”aaa”内容的对象,有的话,再在堆中创建一个”aaa”对象,将在堆中创建的字符串对象地址返回;没有的话,首先在StringPool创建一个”aaa”对象,再在堆中创建一个”aaa”对象,将在堆中创建字符串对象的地址返回。java中字符串的拼接:+
拼接字符串时,会生成新的String对象,而不是向原有的对象追加内容,也不会去字符串池里查找
String s5 = s1+s2; //产生新的字符串
String s6 = “hel”+”lo”;//编译优化为 String s6 = “hello”,相当于字面值赋值。