一切从String str = new String("abc")说起...
这行代码形式上很简单,其实很复杂。有一个常见的Java笔试题就是问上面这行代码创建了几个String对象。
我刚开始很自然的觉得应该是创建了一个String对象,后来查阅资料,才发现,实际上创建了两个String对象。下面说明为什么创建了两个String对象。
首先,来了解一下Java中的字符串驻留池的概念。JVM为了提高性能,将一下两种形式的字符串放在一个称之为字符串驻留池的内存块中:
形式一:String str = "abc";
形式二:"abc"
其实,形式一和形式二都是字符串的字面常量。所以,可以这样理解,即把字符串的字面常量都放在了字符串驻留池中。对形式一来说,str其实就是引用的字符串驻留池中"abc"这个String对象。
如果有如下的两行代码:
String str1 = "abc";
String str2 = "abc";
那么,上面的两行代码创建了几个String对象?答案是一个。根据我们刚才所述,那么第一行语句将在池中创建一个String对象,第二行会先在池中寻找是否有值与"abc"相同的String对象,如果有,就直接引用,没有这在池中新建String对象。这下,就明白了为什么上面的两行语句仅仅创建了一个String对象。
然后,让我们来看一看String str = new String("abc")。我们先不讨论到底创建了几个String对象。我们在这里,比较一下这种new的方式和上面的直接赋值方式两种创建String对象的不同,直接赋值的方式是在字符串驻留池中创建对象,但new这种方式是在堆中创建对象。即,new创建的String对象是不会放入字符串驻留池中的。如果一定要把某个通过new创建的字符串对象放入驻留池,可以使用intern()方法。如String strt = str.intern(),将把str的值放在驻留池中(当然,是在驻留池原来没有这个值对应的String对象的情况下),并返回驻留池中String对象的引用。
现在,可以分析String str = new String("abc");创建了几个String对象了:)很明显,传入的"abc"字符串字面常量在驻留池中创建了一个对象,new操作符在堆中创建了一个对象,所以,一共创建了两个String对象
转自:http://hi.baidu.com/gujianting2010/blog/item/61167d17ef3e88cdf6039e53.html
分享到:
相关推荐
Java中的字符串驻留机制是为了优化字符串的使用,减少内存中不必要的重复对象。它涉及到Java的字符串常量池,这是一个特殊区域,存储了程序中所有的字符串字面量(literal strings)和通过`intern()`方法添加的字符...
此外,这个特性只对驻留在老年代(Old Generation)的字符串有效,因为年轻代(Young Generation)的字符串可能会在下一次垃圾回收时就被清理掉。 总之,Java的字符串去重特性是一种优化手段,适用于处理大量字符串...
字符串驻留是在字符串常量池中实现的,当创建新的字符串常量时,如果常量池中已有相同内容的字符串,会直接返回该字符串的引用,从而避免创建新的对象。而字符串去重则是在运行时动态进行的,针对的是堆中的字符串...
这点和Java有点类似,只不过Java中是用 == 来比较两个对象在内存中的地址,用 equals() 来检查两者之间的值是否相等。 is == 概念 对象标示符 相等 作用 比较对象在内存中的地址 检查
下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学者,仔细看看吧: 1、如何比较字符串,应该用”==”还是equals()? 总的来说,”==”是用来比较字符串的引用地址,而...
如果涉及到字符串驻留(String Interning),则"=="也可能返回内容相等的字符串是否为同一个对象的结果。 2. **敏感信息处理:为何使用char[]优于String?** String对象是不可变的,意味着一旦创建就不能修改。这...
10. **尽量使用基本数据类型代替对象字符串**:直接引用字符串常量池中的字符串比创建新的String对象更高效。 11. **单线程使用HashMap和ArrayList**:在单线程环境中,HashMap和ArrayList比同步的Hashtable和...
- **提高性能**:由于 `String` 对象的不可变性,Java 虚拟机能够缓存字符串常量池中的 `String` 对象,从而避免重复创建相同的字符串对象,提高了内存利用效率。 - **安全性增强**:在 Java 中,字符串经常用于表示...
10. **使用基本数据类型代替对象**:直接引用字符串常量池中的字符串可以节省内存,而通过new创建的String对象会有额外的char数组开销。 11. **单线程环境下使用HashMap和ArrayList**:非同步的HashMap和ArrayList...
`String` 对象可以驻留在字符串常量池中,这是一个特殊的内存区域,用于存储共享的字符串。在编译期间,字面量字符串(如 `"hello"`)会被放入常量池。在运行时,如果通过 `new String()` 创建字符串,那么它将不会...
Java笔试和面试题涵盖了许多核心Java知识,包括面向对象特性、数据类型、异常处理、字符串操作、Servlet生命周期、集合框架以及企业级Java Bean(EJB)。以下是对这些知识点的详细解释: 1. **面向对象的特征**:面向...
综上所述,这些Java面试题涵盖了面向对象编程的核心概念,字符串处理,异常处理,以及Java集合框架和企业级应用开发的基础知识,这些都是Java开发者需要掌握的关键点。理解并熟练运用这些知识点对于成为一名优秀的...
Java面试中的核心知识点涵盖了许多方面,这里我们将深入探讨...总之,Java面试中涉及的知识点广泛,包括面向对象编程原理、异常处理机制、字符串操作、以及Web开发的基础。掌握这些基础,将有助于你在面试中表现出色。
3. **性能**:在单线程环境中,频繁修改字符串时,`StringBuilder`(`StringBuffer`的非线程安全版本)相比`StringBuffer`更高效,因为后者每次调用方法都要进行加锁和解锁。 #### 五、运行时异常与一般异常的异同 ...
`String`类代表不可变的字符序列,适用于创建常量字符串,而`StringBuffer`(以及其线程安全版本`StringBuilder`)则提供了可变的字符序列,适合于字符串的频繁修改场景。在性能上,对于需要修改的字符串,`...
StringBuffer是可变的,允许在字符串末尾添加或删除字符,适合大量字符串拼接操作,性能优于多次创建新String对象。 5. **运行时异常与一般异常** - 运行时异常(RuntimeException)不需要显式捕获,因为JVM会自动...
4. 使用String池:String对象是常量,使用String.intern()方法可以让字符串对象驻留在常量池中,节省堆空间。 5. 数据结构优化:选择合适的数据结构,如使用HashMap替代ArrayList存储大量元素,以减少内存开销。 6...
1. **创建远程接口**:定义一个简单的接口,比如`HelloWorldRemote`,包含一个返回字符串的`sayHello()`方法。 2. **实现远程对象**:创建一个类`HelloWorldImpl`实现`HelloWorldRemote`接口,并实现`sayHello()`...