1、String在内存中如何存放
了解String是什么看这里:String是什么
String是一个特殊的包装类数据。
可以用两种的形式来创建:
String str = new String( "abc" );
String str = "abc" ;
了解java如何管理内存看这里:jvm是如何管理内存的
了解java堆和栈的区别看这里:java堆和栈有什么区别
第一种是用new()来新建对象的,它会在存放于堆中,每调用一次就会创建一个新的对象。
第二种是先在栈中创建一个对String类的对象引用变量str,然后查找堆内String池中有没有存放”abc”,如果没有,则将”abc”存放进String池,并令str指 向”abc”,如果已经有”abc” 则直接令str指向”abc”。
2、String的equals方法如何使用
比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==(可以理解为比较逻辑地址,实际是比较对象号),下面用例子说明上面的理论。
String str1 = "abc" ;
String str2 = "abc" ;
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。
String str1 = new String ( "abc" );
String str2 = new String ( "abc" );
System.out.println(str1==str2); // false
- 对于第二种方式(String str1 =”abc”)创建多个”abc”字符串,在内存中其实只存在一个对象而已。这种方式节省内存空间,同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据String池中数据的实际情况来决定是否有必要创建新对象。
- 而对于第一种方式,String str = new String(“abc”),则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
另一个要注意的地方:我们在使用诸如String str = “abc”;的格式定义类时,总是想当然地认为,创建了String类的对象str。这里担心陷阱:对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。
由于String类的immutable(不可变)性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer/StringBuilder类,以提高程序效率。
StringBuffer/StringBuilder的区别看这里:StringBuffer/StringBuilder有什么区别
时间: 2024-10-12 04:06:59