重点在代码的注释中
- String类的不可变性
package packagetest;
/*
java.lang.String 是字符串类型,一旦被创建不可被改变
提升字符串访问效率,在程序中使用了缓存技术。所以在java中所有使用双引号括起来的字符串都会在字符串常量池中创建一份
方便后续直接访问使用。
*/
public class StringTest01 {
public static void main(String[] args) {
String s1 = "abc";
s1 = "def"; //可以重新指向,但是字符串本身不可变
//比较两个字符串是否相同使用equals方法,而不能使用==,因为==比较的是地址
String s2 = "hello";
String s3 = "hello";
System.out.println(s2 == s3);//true
String s4 = new String("hello");
String s5 = new String("hello");
System.out.println(s4 == s5);//false
System.out.println(s4.equals(s5));//true
String s6 = "aaa";
String s7 = "bbb";
String s8 = s6+s7;
//常量池中有三个对象,因为字符串的不可改变性
}
}
- String类创建对象的内存问题
package packagetest;
//分析一下程序创建字符串对象的区别
public class StringTest02 {
public static void main(String[] args) {
String s1 = "abc"; //s1在栈中,然后在方法区常量池中创建“abc” 推荐使用
String s2 = new String("abc");//s2在栈中,在堆中创建String对象,同时在方法区常量池中会创建“abc”字符串
}
}
- 面试题
package packagetest;
//面试题
public class StringTest03 {
public static void main(String[] args) {
//创建了几个对象?堆中两个,方法区字符串一个
String s1 = new String("Hello");
String s2 = new String("Hello");
}
}
- 减少字符串的拼接
package packagetest;
//在使用String时减少字符串的拼接,因为字符串一经创建就不可改变
//频繁拼接会在常量池中创建大量对象,给垃圾回收带来问题
public class StringTest04 {
public static void main(String[] args) {
String[] ins = {"Sport","music","english"};
//要求将上面的字符串拼接成一个字符串
String temp = "";
for (int i = 0; i < ins.length; i++) {
if (i== ins.length-1){
temp += ins[i];
}else{
temp += ins[i] + ",";
}
}
System.out.println(temp);
}
}