在jvm中存在着String Pool
String对象是不变对象,在程序运行过程中可能用到多个具有相同值得String对象,jvm中使用String pool来优化这种情况。当有新的String对象要建立的时候,jvm先检查Pool中时候已经有具有相同值的String对象,如果有就把这个对象的引用传递给新建立的对象,如果没有,就新建立一个对象,并将它放到Pool中。
String对象的建立有两种方式:
String s = "abc";
or
String s = new String("abc");
在String Pool中这两种方式建立的对象有所不同,实际上String Pool只是对无名称String对象有效,即:通过方式一建立的具有相同值的对象也具有相同的内存地址。而对于通过new来建立的对象并不起作用,即用这样方式建立的对象具有自己的内存空间。
class hello{
public static void main(String args[]){
String s1 = "abc";
String s2 = "abc";
System.out.println("s1==s2? "+(s1==s2));
System.out.println("s1.equal(s2)? "+s1.equals(s2));
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println("s3==s4? "+(s3==s4));
System.out.println("s3.equal(s4)? "+s3.equals(s4));
System.out.println("s1==s3? "+(s1==s3));
System.out.println("s1.equal(s3)? "+s1.equals(s3));
}
}
结果:
s1==s2? true //-- ps: s1和s2具有相同的内存地址。
s1.equal(s2)? true
s3==s4? false //-- ps: s3和s4具有不同内存地址。
s3.equal(s4)? true
s1==s3? false
s1.equal(s3)? true
下面的代码会输出什么呢? :)
class hello{
public static void main(String args[]){
String s5 = new String("abc");
String s6 = "abc";
System.out.println("s5==s6? "+(s5==s6));
System.out.println("s5.equal(s6)? "+s5.equals(s6));
}
}
结果:
s5==s6? false
s5.equal(s6)? true
预料之中!
以上这句说话并没有错.那是在说String 放在String pool时的特例.
for example:
String a = "abc"; // 检查String pool有没有这组字串,发现没有就create一个
String b = "abc"; // 检查String pool有没有这组字串,发现有,就直接引用它的reference
if(a==b) 是true;
但当用到new时就会有如下的情形.
String a = new String("abc");
// 检查String pool有没有这组字串,发现没有就create一个,
// 因为用new,所以同时亦建立一个新的instance给它.
String b = new String("abc");
// 检查String pool有没有这组字串,发现有,就直接引用它的reference
// 因为用new,所以同时亦建立另一个新的instance给它.
知道为甚麽new String("abc")亦要检查String pool吗.
那是因为String()的constructor是原因.
这是其中一个String的constructor : String(String original).
留意当new String("abc")时.
其实已经先做了一个动作,String original = "abc".
static String str ="HelloWorld";
public static void main(String[] args) {
String A = "Hello";
String B = "World";
String C = "Hello"+"World";
System.out.println((A+B)==str);
System.out.println(C==str);
}
结果是:false,true
Java 语言提供对字符串串联符号("+")。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。
String+是StringBuffer的append()方法来实现的,如:
String str = new String( "abc ");
编译时等效于
String str = new StringBuffer().append( "a ").append( "b ").append( "c ").toString();
A+B // 会产生一个新的引用,System.out.println((A+B)==str);返回false
分享到:
相关推荐
`String Pool`是存储`String`字面量的缓存池,当通过字面量的方式创建`String`对象时,Java虚拟机首先检查`String Pool`中是否已经存在相同的字符串,如果存在,则返回该字符串的引用,而不是创建一个新的对象。...
String对象存在于Java的字符串常量池(String Pool)中,这个池是为了优化性能,避免多次创建相同的字符串对象。当创建一个新的String实例时,如果常量池中已经存在相同内容的字符串,那么就会返回池中已有的对象...
- **直接赋值**:这种方式会在**字符串常量池**(String Pool)中查找或创建一个对应的`String`对象,并将变量指向该对象。字符串常量池是Java堆的一部分,专门用来存储字符串字面量。如果字符串常量池中已经存在...
2. **缓存效率**:当创建相同的字符串时,如果该字符串已经存在于字符串池(String Pool)中,则不会创建新的实例,而是返回已存在的引用。这避免了内存中存在多个相同字符串副本的情况,提高了空间效率。 3. **性能...
在 JAVA 中,存在一个字符串池(String Pool),用于保存和共享 String 对象。String 对象池可以提高效率,因为它可以避免创建重复的 String 对象。 String 对象池是由 String 类维护的,可以通过 intern() 方法来...
在JDK 8中,字符串常量存储在永久代(Permanent Generation)中的字符串池(String Pool)中。字符串池是一个特殊的内存区域,用于存储共享的字符串字面量,这有助于避免重复创建相同的字符串对象。 ```java // 示例...
8. **String Pool优化**: - 使用`String.intern()`方法可以将字符串放入字符串常量池,如果池中已存在相同值,则返回池中的引用。 9. **Java 11的新特性**: - `strip()`, `stripLeading()`, 和 `stripTrailing...
- 直接通过字面量创建的`String`对象,如`"a"`,会存储在字符串池(String Pool)中。如果池中已有相同的字符串,就不会再创建新的对象,而是重用已存在的。 - 使用`new`关键字创建的`String`对象则会在堆内存中...
java jdbc帮助类 v1.0 自带连接池 boolean delete(java.lang.String sql) 删除单条记录的方法,适用于... boolean update(java.lang.String sql, java.lang.String poolName) 更新一条记录,适用与简单的update语句
2. **对象缓存机制**:了解JVM如何缓存字符串常量,如`String Pool`,并讨论如何有效利用。 3. **JVM优化技巧**:探讨如何优化Java代码,减少不必要的字符串对象创建。 4. **类的演进**:讨论`String`相关类在不同...
AndroidManifest解析器 一个纯Java、实现了SAX接口、无任何第三方依赖的 AndroidManifest.xml 解析工具。 AndroidManifest.xml文件格式 ... String Pool Offset 4bytes // 字符串常量池相对于Chunk偏移值 Sty
jodd java工具类库,包括数据库mvc依赖注入等等
使用 new String("abc") 创建的字符串对象不在 String Pool 中,而使用 String.valueOf("abc") 创建的字符串对象在 String Pool 中。 StringBuffer 和 StringBuilder 是可变的字符串类,StringBuffer 是线程安全的...
3. **String缓存池(String Pool)**:字符串常量池是在编译期间创建的,存储所有的字符串字面量。使用`intern()`方法可以将运行时创建的字符串添加到池中,如果池中已有相同的字符串,`intern()`会返回池中已存在的...
void setPoolName(java.lang.String poolName) boolean update(java.lang.String sql, java.util.Map,java.lang.Object> elements) 根据输入的参数执行更新操作 boolean update(java.lang.String sql, java...
public class StringPool { private static class StringWrapper implements Poolable<String> { private String value; public StringWrapper(String value) { this.value = value; } @Override public ...
实现String pool就需要String定义为final,否则,当引用a、b都指向“abc”时,通过a将对象改变后,引用b所指向的对象被动地改变了。这将导致程序的不稳定性和不可靠性。 此外,java String不可变还具有以下几个好处...
String maxconn = props.getProperty(poolName + ".maxconn", "0"); int max; try { max = Integer.valueOf(maxconn).intValue(); } catch (NumberFormatException e) { log("错误的最大连接数限制: " + ...