String 类
String s="hello"; //最常见
String r=new String("hello");
特殊:
1、特殊的创建方法 “”创建
2、为了优化 常量池的概念
String用的非常多,如果每次都为"hello"创建一个对象,对象非常多
解决办法:常量池
注意:
1、对于字面量字符串“hello”会进入到常量池,属于优化部分
2、凡是字符串比较,统一用equals,即便==可能也是true
3、new String(...)在堆上创建对象,不会入池
为了达到优化效果,不要用String s=new String("hello");
写成 String s="hello"
4、非要把堆上的字符串入池
String s=new String("hello");
把s指向的对象入池,intern()就会手动入池
String s=new String("hello").intern();
2、不可变对象
不可以被继承
String s="hello";
String p=s+"world"; 则常量池中有两个对象:“hello”和“hello world”
(final修饰的类才是不可变的类)
StringBuilder 新版本的只用这个
StringBuffer 老版本
字符串拼接:
java编译器兜底
1、String特殊的类
1、构造方法有特殊性(直接通过“”构造)
2、入池的概念(String +基本数据类型)常量池
1、字面量字符串一定入池
2、可以调用intern()手动入池
2、不可变对象
一旦被创建,其属性无法被修改
1、属性引用无法指向其他对象
2、属性引用指向的对象值无法被修改
3、无法被继承
3、引用了StringBuilder类(可变对象)
解决了拼接字符串过程中会创建太多临时性的垃圾对象
String s="";
for(int i=0;i<10;i++){s+=i;} 会创建出十一个对象来
====================================
StringBuilder sb=new StringBuilder();
for(int i=0;i<10;i++){sb.append(i);}
sb.toString(); 只会有两个对象 sb和i
为了尽可能的优化,编译器会尝试把能用StringBuilder代替的字符串相加String+String,优化成StringBuilder,但是,作为程序员,不应该过于依赖该特性,直接用StringBuilder
StringBuilder vs StringBuffer
新版本 老版本
线程不安全的 线程安全的
效率高 效率低
常见的构造String的方法
1、String str ="hello";
2、String str2 =new String("hello");
3、char[] array={"a",“b”,"c"};
String str=new String(array);