一 String的内存 1)String 声明为final 不可继承; 2)String实现了Serializable接口,表示String可以比较大小 实现了Compareble接口,表示String可以比较大小 3)String内部定义了final char[] value用于存储字符串数据,具有不可变性 总结:一个值,一个内存区域地址,且不存相同值,是一 一映射 体现:1当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值 2 当对现有的字符串进行连接操作时候,也需要重新指定内存区域赋值,不能使用原有的value进行赋值 3.当调用String的replace修改指定的字符或字符串时,也需要重新指定内存区域进行赋值***
public class JavaTest {
public static void main(String[] args) {
String s1="abc";
String s2="abc";
System.out.println(s1==s2);
}
}
4)通过字面量的方式给一个字符串赋值,此时字符串声明在字符串常量池中 5)字符串常量池是不会存储相同内容的字符串的(所有上面二者在同一个地址,因为只存一次) 详情见https://editor.csdn.net/md/?articleId=120342865 例题 String test=“javaandpython”; String str1=“java”; String str2=“and”; String str3=“python”; System. out. println(test==“java”+“and”+“python”): System. out. println(test ==str1 + str2 + str3); 对于上面这段代码,结果是true false 这是因为字符串字面量拼接操作是在Java编译器编译期间就执行了,也就是说编译器编译时,直接把"java"、“and"和"python"这三个字面量进行”+“操作得到一个"javaandpython” 常量,并且直接将这个常量放入字符串池中,这样做实际上是一种优化,将3个字面量合成一个,避免了创建多余的字符串对象(只有一个对象"javaandpython",在字符串常量池中)。而字符串引用的"+“运算是在Java运行期间执行的,即str1 + str2 + str3在程序执行期间才会进行计算,它会在堆内存中重新创建一个拼接后的字符串对象。且在字符串常量池中也会有str1,str2与str3,这里创建多少个新的对象与原来字符串常量池中有没有str1\str2\str3有关,如果之前存在就不会创建新的对象。 总结来说就是:字面量”+“拼接是在编译期间进行的,拼接后的字符串存放在字符串池中;而字符串引用的”+"拼接运算实在运行时进行的,新创建的字符串存放在堆中。 那么再来看这题,很明显只在编译期间在字符串常量池中创建了"welcometo360"一个字符串 6)基本数据类型传递数据 引用数据类型传递地址值
此图中 str引用了ex.str ,但是由于String的不可变性,str="test ok"则新指向一个地址,原来的ex.str不变 而char[]则是更改第一位 二 String的方法 chatAt (int index):返回某索引处的字符 trim()返回字符串的副本,忽略前导空白和尾部空白 equal(Object obj)比较字符串的内容是否相同 equalIsignoreCase(String anotherString)与euals类似忽略大小写 concat(String str)将指定字符串连接到此字符串的结尾 三 String-----与char的转换 String转换为char char[] charArray=str1.tocharArray char转换为String String str2=new String(arr) 四 String与byte[]之间的转换 String---->byte str.getBytes() byte---->String new String(bytes) 五 String StringBuffer StringBuilder String 不可变的字符序列 StringBuffer 可变的字符序列 线程安全 效率低 底层用char[](没有加final) StringBuffer sb2=new StringBuffer(“abc”);//char[] value=new char[“abc”.length()+16]; 底层是一个初始创造并多出了16个字节 //问题1:sb2.length()==3 //问题2:扩容问题:如果要添加的数据底层数据盛不下,那就需要扩容底层的数组 默认情况下,扩容为原来容量的2倍+2,同时将原有数组的元素复制到新的数组中 指导意义:建议使用StringBuffer(int capacity) StringBuilder 可变的字符序列 线程不安全 效率高 底层用char[] (没有加final) 六 StringBuffer的方法
|