第10 章 : String类特点分析
42 String类简介
双引号定义
+连接字符串
字符创串不是基本数据类型
其中定义了一个数组,每一个字符都保存到数组中
JDK 1.9支持的字符串形式增多了
JDK 1.9 之后字符串数组使用byte类型
JDK 1.8 字符串数组使用char类型
字符串数组是字符的包装
字符串不可变
// 直接赋值 String name = "字符串" ; // 构造方法实例化 String company = new String("实例化字符串") ;
43 字符串比较
int型变量使用 == 判断相等
String 类型使用 equals(String str)
String name1 = "字符串" ; String name2 = "字符串" ; String name3 = new String("字符串") ; System.out.println(name1 == name2) ; // true System.out.println(name1 == name3) ; // false System.out.println(name1.equals(name2)); // true System.out.println(name1.equals(name3)); // true
区别
== 比较数值, 如果用于对象比较,则比较内存地址
equals 比较字符串内容
44 字符串常量
双引号描述的是String类的一个匿名对象
字符串直接赋值,是将一个匿名字符串对象引用赋值
字符串比较的时候,字符串常量写前面
String name = null ; System.out.println("字符串".equals(name)); // false System.out.println(name.equals("字符串")); // NullPointerException
45 String类对象两种实例化方式比较
字符串池
直接赋值字符串,会在字符串数据池自动保存,实例重用,提高操作性能
构造方法实例化,会开辟新的堆内存空间
手工入池
Strint("").intern()
String name1 = new String("字符串") ; String name2 = "字符串" ; System.out.println(name1== name2) ; // false
String name1 = new String("字符串").intern() ; String name2 = "字符串" ; System.out.println(name1== name2) ; // true
46 String对象常量池
对象池主要目的是实现数据的共享处理
静态常量池:类.class加载时自动分配
String name1 = "字符串"; String name2 = "字" + "符" + "串" ; System.out.println(name1== name2) ; // true
运行时常量池:类.class加载后的常量池
String name1 = "字符串"; String str = "符" ; String name2 = "字" + str + "串" ; System.out.println(name1== name2) ; // false
程序加载时并不确定str 是什么内容,可以被修改
47 字符串修改分析
字符串内容不可修改
String类是一个字符数组,长度不可以被改变
字符串拼接,并不是修改修改了字符串,而是修改了字符串的指向
String类不要进行频繁修改,会产生垃圾
String str = "字"; // -> 字 str += "符" ; // -> 符 字符 str += "串" ; // -> 串 字符串 System.out.println(str) ; // 字符串