String zy1=new String("小朱"); String zy2=new String("小朱");建了几个对象?

简介: String zy1=new String("小朱"); String zy2=new String("小朱");建了几个对象?

提问下面每段代码建了几个对象

问题一

String zy1 = "小朱";
String zy2 = "小朱";

问题二

String zy1 = "小朱";
String zy2 = "大朱";

问题三

String zy1 = new String("小朱");
String zy2 = new String("小朱");

问题四

String zy1 = new String("小朱");
String zy2 = new String("大朱");

问题五

String z = "小";
String y = "朱";
String zy = z + y;

问题六

String zy = "小" + "朱";

解析

会不会有人连问题一都不知道,"这明明是常量,这肯定没有创建对象",哈哈是不是有好多小伙伴都这么认为。
JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。
嘟噜嘟噜一大堆说什么什么东西我一句也没听懂,哈哈。我们换个思路,我们把问题一中的"小朱"理解成String zy = new String(new char[]{'小','朱'});为什么这么写看看String源码。

/** The value is used for character storage. */
private final char value[];

/** Cache the hash code for the string */
private int hash; // Default to 0

public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}

然后我们看问题一我们可以理解为

String zy = new String(new char[]{'小','朱'});
String zy1 = zy;
String zy2 = zy;

是不是恍然大悟,一眼就看出来只创建了一个对象。
那我们继续看问题二

String z = new String(new char[]{'小','朱'});
String y = new String(new char[]{'大','朱'});
String zy1 = z;
String zy2 = y";

两个对象

继续看问题三

String zy = new String(new char[]{'小','朱'});
String zy1 = new String(zy);
String zy2 = new String(zy);

三个对象

继续看问题四

String z = new String(new char[]{'小','朱'});
String y = new String(new char[]{'大','朱'});
String zy1 = new String(z);
String zy2 = new String(y);

四个对象

继续看问题五

String z1 = new String(new char[]{'小'});
String y1 = new String(new char[]{'朱'});
String zy1 = new String(new char[]{'小','朱'});
String z = z1;
String y = y1;
String zy = zy1;

这个有意思了,竟然建了3个对象,所以为什么不要做字符串。

继续看问题六,这个就没办法用我的那种理解了,因为他们先加在一起。所以就和String zy = "小朱";这就创建了一个对象。

总结

String的东西很多,一篇文章也讲不完,今天就简单介绍了下一些喜欢面试问到的内容,也是最近看到的一个有意思的东西,所以写了这篇文章,各位看官可有自己理解?

相关文章
|
4月前
|
Java
【Java基础面试三十二】、new String(“abc“) 是去了哪里,仅仅是在堆里面吗?
这篇文章解释了Java中使用`new String("abc")`时,JVM会将字符串直接量"abc"存入常量池,并在堆内存中创建一个新的String对象,该对象会指向常量池中的字符串直接量。
|
2月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
68 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
2月前
|
存储 JavaScript 前端开发
JavaScript 字符串(String) 对象
JavaScript 字符串(String) 对象
49 3
|
7月前
|
缓存 Java
Java中循环创建String对象的内存管理分析
Java中循环创建String对象的内存管理分析
76 2
|
4月前
|
存储 程序员 API
八股day05_API、String对象和集合
day05_API、String对象和集合
|
4月前
|
存储 Java
构造String问题之在JDK 9及更高版本中,直接访问String对象的coder和value属性,如何实现
构造String问题之在JDK 9及更高版本中,直接访问String对象的coder和value属性,如何实现
|
6月前
|
存储 缓存 安全
Java性能优化(二):Java基础-String对象及其性能优化
在深入探讨了String字符串的性能优化后,我们认识到优化字符串处理对提升系统整体性能的重要性。Java在版本迭代中,通过精心调整成员变量和内存管理机制,不断对String对象进行优化,以更高效地使用内存资源。String对象的不可变性是Java语言设计中的一个关键特性,它不仅确保了字符串的安全性,也为字符串常量池的实现提供了基础。通过减少相同值的字符串对象的重复创建,常量池有效地节约了内存空间。然而,不可变性也带来了挑战。在处理长字符串拼接时,我们需要显式使用类来避免性能下降。
94 1
|
5月前
|
存储
数据存储之数组的特点,长度固定,适应变化需求,集合类特点是空间可变,ArrayList泛型,ArrayList<String> array = new ArrayList<String>()
数据存储之数组的特点,长度固定,适应变化需求,集合类特点是空间可变,ArrayList泛型,ArrayList<String> array = new ArrayList<String>()
String对象的特点,new创建的字符串对象地址值不同,String s3 = “abc“; s4=“abc“ sout(s1 == s2)比较地址和内容,s1.equals(s3)比较内容
String对象的特点,new创建的字符串对象地址值不同,String s3 = “abc“; s4=“abc“ sout(s1 == s2)比较地址和内容,s1.equals(s3)比较内容
new String()定义字符串为空,char[] chs = {‘a‘,‘b‘,‘c‘} String s2 = new String(chs) 输出abc,byte定99为a
new String()定义字符串为空,char[] chs = {‘a‘,‘b‘,‘c‘} String s2 = new String(chs) 输出abc,byte定99为a