java.lang.String是字符串类型
1、字符安川一旦船舰不可再改变。“abc”字符串对象一旦创建,不可在改变称“abcd”
2、提升字符串的访问效率,在程序中使用”缓存“技术,所以java中所使用”双引号 “括
起来的字符串都会在”字符串常量池“中创建一份,字符串常量池中被存储
3、在程序执行过程中,如果程序用到某个字符串,例如”abc“,那么程序会在字符串
常量池中去搜索该字符串,如果没有找到则在字符串常量池中新建一个”abc“字符串,
如果找到则直接拿过来用(字符串常量是一个缓存区,为了提高访问字符串效率)
public class Test{
public static void main(String[] args) {
// 创建一个"abc"字符串对象,该对象得内存地址,让s1变量保存
// s1是引用,s1指向"abc"对象
String s1 = "abc";
//可以让s1重新指向,s1是局部变量且没有final,所以s1可以从新指向
s1 = "def";
String s2 = "hello"; // 字符串常量池中新建一个hello字符串对象,该对象不变
String s3 = "hello"; //内存地址中直接拿来
System.out.println(s2 == s3); //true
// 比较两个字符串是否相等,不能用”==“
String s4 = new String("abc");
String s5 = new String("abc");
System.out.println(s4 == s5); //false
System.out.println(s4.equals(s5)); // true
}
}
分析一下程序创建对象的区别
1、String s1 = "abc"; 只会在字符串常量池中创建一个"abc"字符串对象
2、String s2 = new String("abc");会在字符串常量池中创建一个hello字符串对象,并且会在堆中再创建一个字符串对象
第二种方式比较浪费内存,常用的是第一种。
public class Fox{
public static void main(String[] args) {
String s1 = "abc";
String s2 = new String("abc");
}
}
面试题:
判断下面程序能创建几个对象
public class Test{
public static void main(String[] args) {
// 判断以下程序能创建几个对象
String s1 = new String("hello");
String s2 = new String("hello");
// 答:三个对象
//堆中两个,方法区字符串常量池中1个
}
}
注意:
1、 使用String的时候我们应该注意的问题,尽量不要使用字符串频繁拼接的操作,因为
字符串一旦创建不可改变,频繁拼接,就会在字符串常量池总创建大量的字符串,对
象,给垃圾回收带来问题。
2、
public class Fox{
public static void main(String[] args) {
String s1 = "abc";
String s2 = new String("abc");
byte[] bytes = {97,98,99,100};
String s3 = new String(bytes);
System.out.println(s3); // abcd String已经重写了Object中toString方法
}
}
网友评论