java字符串字面量是否生成String对象
2017-03-12 13:05
183 查看
public class StringTest { public static void main(String[] args) { String str1 = "abc"; String str2 = new String("abc"); System.out.println(str1 == str2); } }
分析以上代码,它的执行结果是什么?
false
显然他们分别创建了个String对象,并且str1和str2都获得了各自对象的引用,所以结果是不同的,但是在java 5.0及其以后的版本中,在创建该对象以前时,JVM会在String对象池中去搜索该字符串对象是否是被创建,如果已经创建,则直接返回一个引用,否则先创建对象再返回引用。
public class StringTest {
public static void main(String[] args) {
String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";
System.out.println(str1 == str2);
System.out.println(str1 == str3);
}
}
其结果是false true,说明str1和str3指向同一个对象,这个对象就是在对象池中,对象池的存在是为了避免频繁的创建和销毁对象而影响系统性能,那么自定义的类能否也使用对象池呢?如下代码:
import java.util.HashSet;
/**
* Created by wjz on 2017/3/12.
*/
class Dog {
private String name;
private int age;
private static HashSet<Dog> pool = new HashSet<Dog>();
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public static Dog newInstance(String name, int age) {
for (Dog dog : pool) {
if (dog.name.equals(name) && dog.age == age) {
return dog;
}
}
//如果找不到相同的dog对象,则创建一个dog并加入pool
Dog dog = new Dog(name,age);
pool.add(dog);
return dog;
}
}
public class StringPoolTest {
public static void main(String[] args) {
//对象池中取
Dog dog1 = Dog.newInstance("lele", 30);
Dog dog2 = Dog.newInstance("lele", 30);
System.out.println(dog1 == dog2);
}
}
相关文章推荐
- Java中字符串字面量是否自动生成一个String对象?
- 深入研究java对String字符串对象的创建以及管理
- 深入研究java对String字符串对象的创建以及管理
- Java对String字符串对象的创建,管理和“+”运算符的实现
- Java中判断一个字符串String是否包含特殊字符的代码
- 详解Java String字符串对象的创建及管理(2)
- 深入研究java对String字符串对象的创建以及管理【转帖】
- 深入研究java对String字符串对象的创建以及管理
- JAVA 判断string字符串中是否有汉字
- 深入研究java对String字符串对象的创建以及管理
- 深入研究java对String字符串对象的创建以及管理
- java对String字符串对象的创建以及管理
- js javascript 判断字符串是否包含某字符串,String对象中查找子字符
- (原创)深入研究java对String字符串对象的创建以及管理
- 深入研究java对String字符串对象的创建以及管理
- 深入研究java对String字符串对象的创建以及管理
- 深入研究java对String字符串对象的创建以及管理
- 根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象
- 详解Java String字符串对象的创建及管理(1)
- 【转】深入研究java对String字符串对象的创建以及管理