1. 字符串常用类
1.1 String类
-
String 类:代表字符串。 Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。String s = "abc"; 但是不同于一般类的创建对象方式
-
String 是一个 final 类,代表 不可以被继承。
-
String 对象的字符内容是存储在一个字符数组 value[]中的。 value[]用final修饰,代表不可变的字符序列。
value[]用final修饰的不可变的字符序列理解:
-
- 字符串String类有两种实例化的方式:1. String s = "abc"; //字面量的创建方式 2. String s = new String("abc"); //new的创建方式
- 通过字面量的创建方式创建的字符串储存在方法区的常量池中。
- 通过new的方式创建的字符串储存在堆中
-
不可变性也就是说final value[] 是储存在方法区中的常量池里,在常量池内,不能存在两个内存区域储存相同字符串值。
-
String s1 = "abc"; String s2 = "abc";s1和s2的首地址值是指向同一内存区域的
-
s1 = "hello";重新赋值后,不是在原有位置上对原来存储的内容进行修改,而是重新指定一个新的内存区域来存储"hello"
-
具体还可参考:在java中String类为什么要设计成final? *****String为什么是final类 ********final
String对象创建的几种方式:
- 字面量的创建方式: String str = "hello";
- String s1 = new String(); //创建一个空的字符串对象
- String s2 = new String("abc");实际上是"abc"本身就是常量池中的一个对象,在运行 new String()时,把常量池中的字符串"abc"复制到堆中,并把这个对象的引用交给s2 。所以创建了两个String对象,一个在常量池中,一个在堆中。
- 注意 == 是比较首地址值,equal是比较内容
- byte[] bytes = new byte[]{100,99,98,97}; String s4 = new String(bytes); 给定一个字节数组,根据字节数组的内容翻译成字符串
类中定义的字符串的属性是如何储存的:
- 自定义的person类中声名的属性:public String name = "Tom";
- 上图中的两个对象的"Tom"是储存在常量池中的,堆空间存储的是name:首地址,指向堆空间的Tom,而且这两个Tom在常量池中是同一个。
- 面试题:String s2 = new String("abc"); 在内存中创建了几个对象?
- 两个。相当于先创建一个对象,指向常量池中的"abc",然后再创建一个储存在堆空间中的对象,并把常量池中复制给堆中。
- 如果常量池中已经有"abc",那么就不用重新创建,可以直接用。
面试题:重要
- 参数传递时,引用类型传递的是首地址,基本数据类型传递的是值
- 注意:参数列表中相当于新建了两个对象str和char(只在该方法内有效),这两个对象和属性里的str和char虽然同名,但其实是不同的。
- 如果在change方法内print str就是"test ok"
- 下面链接可参考