大家好,我是Ziph!
String
- 字符串是常量,创建之后不可改变
- 字符串字面值存储在字符串池中,可以共享
- String s = “Hello”; 产生一个对象,字符串池中存储
- String s = new String(“Hello”); //产生两个对象,堆、池中各存储一个
- String类常用方法集合代码实例:点击String类方法集合
可变字符串
- StringBuffer:可变长字符串,JDK1.0提供,运行效率慢,线程安全
- StringBuilder:可变长字符串,JDK5.0提供,运行效率快,线程不安全
- 注意:jdk中Stringbuffer和Stringbuilder的所有功能都是一样的,同样也是一把双刃剑,不同的场景选择不同的可变字符串类型
jdk中StringBuilder调优以及intern();方法应用(main函数中)
注意:默认放在类(class)中的字符串是放在池中的,是不可以改变的
再次注意:需要拼接的时候jdk自动对字符串进行扩容调优,不管你拼接多少个字符串,最后只是一个字符串在不停的扩容、拼接,实际上只有一个地址(不会产生任何中间变量)
/**
* @author Ziph
* @date 2020年3月3日
* @Email mylifes1110@163.com
*
* intern();
* 手动在程序运行中,将字符串放在池中
* 要求:满足首次出现
*/
public class TestStringOptimize {
public static void main(String[] args) {
String ss1 = "www.";//直接声明、首次出现、且存储在池中
String ss2 = ss1 + "baidu.cn";//jdk自动优化StringBuilder.toString()得到一个一个新对象并存储在堆中
String ss3 = "www.baidu.cn";//直接声明、存储在池中
System.out.println(ss2 == ss3); //地址不同返回false
System.out.println("---------------------------");
String s1 = "www."; //直接声明、首次出现、且存储在池中
String s2 = s1 + "ziph.cn"; //jdk自动优化StringBuilder.toString()得到一个一个新对象并存储在堆中
s2.intern(); //手动将首次出现的字符串放在池中
//假如将这一句代码s2.intern();放在下一句的后面则将字符串放在池中失败,因为不满足字符串首次出现
String s3 = "www.ziph.cn"; //发现池中有不可改变的字符串,取出复用
System.out.println(s2 == s3); //因为都是池中的那个字符串,地址没有发生改变返回true
System.out.println("---------------------------");
//jdk调优过程就是相当于jdk创建了一个字符串缓冲区,省略了中间变量的空间,减少没有必要的内存占用
String sss1 = "abc";
String sss2 = sss1 + "def";//调用StringBuilder.append();
StringBuilder stringbuilder = new StringBuilder();//可变字符串(缓冲区)
stringbuilder.append("def");//StringBuilder类型的对象"abcdef"
String sss3 = stringbuilder.toString();//转换成对象
String sss4 = "abcdef";
System.out.println(sss3 == sss4); //返回false
System.out.println("---------------------------");
String str = "HelloWorld";
MyClass m = new MyClass();
System.out.println(m.string3 == str);//这时候类中的字符串存储在池中,直接取出,地址不变,返回true
}
}
class MyClass {
String string1 = "Hello";
String string2 = string1 + "World";
String string3 = "HelloWorld";
}
Ziph
发布了82 篇原创文章 · 获赞 138 · 访问量 2万+
私信
关注