String类常量池

mac2022-06-30  20

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版本之前 不可能有这个需求 效率低                            效率高

最新回复(0)