赶紧收藏!2024 年最常见 100道 Java 基础面试题(四)

上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(三)-CSDN博客

七、Java中操作字符串都有哪些类?它们之间有什么区别?

在Java中,这两种声明方式在内部实现和内存分配上有所不同。

  1. String str = "i";

    • 这种创建字符串的方式使用了字符串字面量。在这种情况下,Java虚拟机会在称为“字符串常量池”(String Constant Pool)的特殊区域查找是否存在相同的字符串值。如果字符串常量池中已经存在字符串"i",则str将直接引用常量池中的"i"。如果常量池中不存在,则会创建一个新的字符串"i"并将其放入常量池中,然后str引用这个新创建的字符串。
    • 这种方式是推荐的做法,特别是当处理字符串常量时,因为它节省内存,并且可以提高性能,因为字符串字面量在多个地方使用时,实际上是共享相同的内存地址。
  2. String str = new String("i");

    • 这里使用了new关键字来创建一个新的String对象。new String("i")会创建一个匿名的String对象,然后这个新对象会被分配到Java堆内存中。尽管这个新对象的内容是字符串"i",但它与字符串常量池中的"i"是不同的实例。
    • 由于每次调用都会创建一个新的对象,如果频繁地使用这种方式创建字符串,并且这些字符串具有相同的值,那么会导致内存使用增加,并且可能会影响垃圾回收的性能。

内存分配差异

  • 使用字符串字面量("i")时,内存分配在字符串常量池中,多个相同的字符串字面量共享相同的内存地址。
  • 使用new String("i")时,每次都会为新对象分配堆内存,即使字符串的内容相同。

示例代码

String s1 = "i"; // 字符串字面量,可能指向字符串常量池
String s2 = new String("i"); // 使用new操作符创建新的String对象

System.out.println(s1 == s2); // 可能输出false,取决于JVM的实现和字符串池的具体情况
System.out.println(s1.equals(s2)); // 输出true,因为内容相同

总结

  • String str = "i";String str = new String("i");在内存分配上不同,前者可能使用字符串常量池,后者总是在堆上创建新对象。
  • 在大多数情况下,推荐使用字符串字面量的方式来声明字符串,因为它节省内存,并且可以提高程序性能。

八、String str = "i"String str = new String("i")一样吗?

答案是不一样,它们在Java中的实现和内存分配上有显著差异。

  1. String str = "abc";

    • 这种方式使用的是字符串字面量。在Java中,所有的字符串字面量都是String类的特殊实例,它们在首次使用时会被自动创建,并且存储在字符串常量池中。字符串常量池是位于堆内存中的一个特殊的存储区域,用于存储字符串字面量和字符串结果。
    • 当程序中多次出现相同的字符串字面量时,如"abc",JVM会进行字符串重用,即不同的变量会指向相同的常量池中的字符串对象,从而节省内存。
  2. String str = new String("abc");

    • 这种方式通过new关键字创建了一个新的String对象实例。每次执行这个语句,都会在堆内存中创建一个新的String对象,即使字符串的值相同。
    • 使用new String()时,即使多个String对象具有相同的字符串值,它们也会是不同的实例,并且每个实例都有自己的内存空间。

内存和性能影响

  • 使用字符串字面量("abc")通常更节省内存,因为多个变量可以引用常量池中的同一个字符串实例。
  • 使用new String("abc")可能会创建多个相同的字符串实例,增加了内存的使用,尤其是在循环或大量字符串操作的情况下,可能会对性能产生负面影响。

示例代码

String s1 = "abc"; // 字符串字面量,可能指向字符串常量池中的实例
String s2 = new String("abc"); // 使用new操作符创建新的String对象

System.out.println(s1 == s2); // 输出结果取决于JVM的实现和字符串常量池的具体情况,可能会是false
System.out.println(s1.equals(s2)); // 输出true,因为equals方法比较字符串的内容

总结

  • String str = "abc";String str = new String("abc");在内存分配和对象创建上是不同的。
  • 使用字符串字面量通常更优,因为它利用了字符串常量池,减少了内存消耗。
  • 使用new String()创建的每个对象都是独立的,并且每个对象都有自己的内存空间。
  • 31
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值