Java中的对象包括基本类型和引用类型。基本类型(如int, double等)直接存储值,而引用类型(如String, Long等)存储的是对象的引用地址。对于Long和String这两种引用类型,它们的地址是否相同取决于对象的创建和使用方式
Long类型:在处理Long类型时,Java具有一个特性,即对于值在-128到127之间的整数,Java会缓存这些对象的实例。因此,在这个范围内的数值,每次创建的Long对象的地址可能是相同的。这是因为Java认为这个范围内的数值是频繁使用的,为了提高性能,会重用已经创建的对象实例。但是,对于超出这个范围的数值,每次创建的Long对象地址是不同的。这种机制可以有效减少内存消耗和提高性能。
String类型:String是不可变的,每次对String的赋值实际上都是创建了一个新的String对象,
直接给字面量赋值
String s="hello world";
Java首先会在字符串常量池中查找是否存在该字符串对象。如果字符串池中已经存在该对象,则直接返回对该对象的引用;
如果不存在,则在字符串池中创建一个新的字符串对象,并返回对该对象的引用
用new的方式
String s1 = new String("hello world");
每次都会在堆内存中创建一个新的字符串对象,
字符常量池里面
存在,在字符常量池中不创建对象,把堆内存对象地址给s1,s1指向堆内存中的"hello world"
不存在,先在字符串常量池中创建对象"hello world",把堆内存对象地址给s1,s1指向堆内存中的"hello world"