String 类
String r
1.特殊的创建方法 2.为了优化,常量池的概念
String 用的非常多,如果每次都会为“hello”创建一个对象,对象非常多的解决方法
String p="hello"; String q="hello"; System.out.println(p.equals(q)); 对 System.out.println(p==q); 对,本改错,有常量池优化了 p==q的意思是这两个是否指向一个对象,一般应该是错的,但是对于这种是对的,表示p和q 指向同一个对象
1.凡事对于字面量字符串“hello”会进入常量池,属于优化部分 2.凡事字符串比较,统一用equals,即便==也可能是true 3.new String(..)在堆上创建对象,不会入池 为了达到优化效果,不要用String s=new String("hello");有两个对象,堆上一个,常量池上一个 堆上的是从常量池中拷贝来的 左边在堆上,右边在常量池
非要入池 String s=new String("hello").intern(); 只保留常量池中的对象 先看池里面有没有,有就把池里的引用给你,没有就把它入池,再给你引用
Integer i=127; Integer j=127; i.equals(j); i==j; 对 类似上面的,在[-128,127]内不会创建多余的地方来存储,类似于常量池的概念, 是它内部的属性
2.不可变对象 天生是线程安全的
String s="hello"; String p=p+"world"; 不是在原有的对象上修改,而是新创建了一个对象,用P引用去指向它
字符串拼接 String s=""; for(int i=0;i<10;i++){ s=s.concat(i); } 一共创建11个对象,但只要最后一个,所以浪费太多
可变对象 用StringBuilder StringBuilder sb=new StringBuilder();
for(int i=0;i<10;i++){ sb.append(i); } sb.toString();
1.String特殊类 1.构造方法有特殊性 2.入池的概念(String+基本数据类型) 常量池 1.字面量字符串一定入池 2.可以调用intern()手动入池 2.不可变对象 一旦被创建,其属性就无法被修改 1.属性引用无法转向其他对象 2.属性引用指向的对象值无法被修改 3.无法被继承
3.引出了StringBuilder类(可变对象) 解决拼接字符串过程中会创建太多临时性的垃圾对象 StringBuilder sb=new StringBuilder();
for(int i=0;i<10;i++){ sb.append(i); } sb.toString(); 为了尽可能优化,编译器会尝试把能用StringBuilderf代替的String+String
StringBuffer vs StringBuilder 老版本 新版本 线程安全 线程不安全 1.2版本之前 不可能有这个需求 效率低 效率高