📋 个人简介
- 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
- 📝 个人主页:馆主阿牛🔥
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 📣 系列专栏:java 小白到高手的蜕变🍁
- 💬格言:要成为光,因为有怕黑的人!🔥
前言
我们都知道String是一个不可变的对象,但之前总归是对他的理解有点浅,这里再大概补充总结一下!
String的特性
- String 类:代表字符串。 Java 程序中的所有字符串字面值(如" abc ")都作为此类的实例实现。
- String 是一个 final 类,代表不可变的字符序列。
- 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。
- String 对象的字符内容是存储在一个字节数组 value []中的。
如图,我们可以看到String类实现了Serializable接口,表明String类是支持序列化的;实现了Comparable接口,表明String可以比较大小。
String类声明为final,表示不可被继承!
String对象的创建
//方式一:字面量定义的方式
String s1 = "aniu"; //在常量池中
//方式二:new+构造器
String s = new String("aniu"); //本质上this.value=original.value,这样创建的字符串在堆中
大概常用的就这两种,当然,String还有很多构造器,可以自行去了解!
String不同实例化方式的对比
public static void main(String[] args) {
//通过字面量定义的方式,此时s1和s2的数据申明在方法区的常量池中
String s1 = "aniu";
String s2 = "aniu";
//通过new+构造器的方式:此时s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值
String s3 = new String("shui");
String s4 = new String("shui");
System.out.println(s1==s2); //true
System.out.println(s3==s4); //false
System.out.println(s1==s3); //false
System.out.println(s1==s4); //false
}
这个比较大家应该都很清楚,字符串常最存储在字符串常量池,目
的是共享;字符串非常量对象存储在堆中。
例如String s1 = “abc” 和 String s2 = new (“abc”) 他们的区别来看下图:
当然,在这里我的目的不是写这个大家都知道的,来看看下面这些:
String s1 = "hello";
String s2 = "world";
String s3 = "hello" + "world";
String s4 = s1 + "world";
String s5 = s1 + s2;
String s6 = (s1+s2).intern();
System.out.println(s3==s4); //false
System.out.println(s3==s5); //false
System.out.println(s4==s5); //false
System.out.println(s3==s6); //true
是不是有点懵了,看看图解:
结论:
- 常量与常量的拼接结果在常量池。且常最池中不会存在相同内容的常量。
- 只要其中有一个是变量,结果就在堆中。
- 如果拼接的结果调用 intern ()方法,返回值就在常量池中。
再来看看这个:
final String s1 = "hello";
String s3 = "hello" + "world";
String s7 = s1 + "world";
System.out.println(s3==s7); //true
结论不是说只要其中有一个是变量,结果就在堆中吗,怎么结果又是true,是的,结论没有问题,这里你要注意是被final修饰的,因此s1也是常量哦!
易错String面试题
1.面试题: String s = new String (" abc “);方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中 new 结构,另一个是 byte[] 对应的常量池中的数据:” abc "。
2.
public class Test {
public static void main(String[] args) {
String str = new String("aniu");
char[] ch = {'6','6','6'};
change(str,ch);
System.out.println(str);
System.out.println(ch);
}
public static void change(String str1, char ch1[]){
str1 = "tom";
ch1[0] = 'h';
}
}
这是一道比较易错的题,一定要切记,我们的String是不可变的!
结语
如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。
🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门
本文含有隐藏内容,请 开通VIP 后查看