0 0

String类intern方法的一个困惑的问题5

String str1 = new StringBuilder("ja").append("va").toString();
		System.out.println(str1 == str1.intern());
		String str2 = new StringBuilder("计算机").append("aa技术").toString();
		System.out.println(str2 == str2.intern());


结果为:false,true

String str1 = new StringBuilder("ja").append("av").toString();
		System.out.println(str1 == str1.intern());
		String str2 = new StringBuilder("计算机").append("aa技术").toString();
		System.out.println(str2 == str2.intern());

结果为:true,true

求指点。
2013年12月18日 22:22

6个答案 按时间排序 按投票排序

0 0

采纳的答案

你的测试不对

String x = "java";
System.out.println(x == x.intern());

这样才是true,因为x,x.intern()都是指向pool的内存

String str1 = new StringBuilder("ja").append("va").toString();  
System.out.println(str1 == str1.intern());  

这才是false,因为str1指向堆内存(new的原因),str1.intern()指向的是pool的内存

2013年12月19日 11:43
0 0

楼主的测试结果是没问题的。在JDK7下面就是这个结果。

intern()方法在JDK7里面有了一些改变,如果在JDK6测试,肯定都是false.

由于new StringBuilder("计算机").append("aa技术").toString();创建的字符串
会存在于常量池中。而intern()方法就直接返回了该字符串的引用。

而由于"java"是关键字,已经在常量池中存在了,所以intern()返回的值是JRE
放入的"java"常量的引用,之后StringBuilder创建出来的在堆上,因此用==比较
返回的是false.(见周志明《深入理解Java虚拟机》第二版P57)

但是,我不理解的是:
String str1 = new StringBuilder("1234").toString(); 
System.out.println(str1 == str1.intern());   // false

String str2 = new String("5678"); 
System.out.println(str2 == str2.intern());   // false

难道只有调了StringBuilder的append方法才会把值写入常量池?

2013年12月25日 16:47
0 0

intern() 是将现在的字符串放入到字符串常量池中。而“==”比较的是对象的引用地址,s1指向的是堆内存中的地址,而另外一个是常量池中的对象,所以返回的应该都是false

2013年12月19日 11:28
0 0

一般第一次调用intern()时会把该String放入缓存池中进行缓存,因为"java"是关键字,之前很可能缓存池中已经存在了,所以用==判断肯定为false,其他的如果是第一次调用,intern()方法返回的即为该String本身,所以为true。
(另外吐槽一下iteye,我新手怎么了,每次都需要回答你那破测试,把我辛苦打的回复都搞没了,怪不得论坛都没人,快倒闭了,我FK!)

2013年12月19日 10:26
0 0

你的测试是错误的,intern是将String置入pool,第一次的时候,肯定pool是没有的,所有应该都是false

2013年12月19日 10:15
0 0

我运行所有都是false啊

2013年12月19日 10:08

相关推荐

    深入理解 Java String#intern() 内存模型.docx

    Java String#intern() 内存模型是 Java 语言中一个重要的概念,.string#intern() 方法是 Java 字符串常量池中一个重要的组件。字符串常量池是一个固定大小的 HashMap,桶的数量默认是 1009,从 Java7u40 开始,该...

    jdk1.8之后的String.intern()方法内存分析

    关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样...

    java String类的实现

    由于`String`对象是不可变的,每次调用修改字符串的方法,实际上都会创建一个新的`String`对象。例如,`substring()`、`concat()`等方法都不会改变原字符串,而是返回一个新的字符串。 ### 5. 字符串连接 - `+` ...

    java String的intern方法

    Java中的`String`类的`intern()`方法是一个非常有趣且重要的功能,它涉及到字符串的内存管理,特别是字符串常量池。常量池是Java虚拟机(JVM)的一部分,存储预编译的字符串字面量和其他常量。`intern()`方法的作用...

    正确使用String类的几点注意

    这种方式在少量字符串拼接时效率较高,但在循环中大量拼接字符串时效率较低,因为每次拼接都会创建一个新的String对象。 **2.2 使用StringBuilder或StringBuffer** 对于需要频繁修改的字符串,建议使用`...

    Java String对象的经典问题

    `String`类提供了一个名为`intern()`的方法,该方法的作用是返回字符串对象的规范化表示形式。具体来说,当调用`intern()`方法时,如果字符串池中已经存在一个与当前字符串完全相同的字符串,则返回该字符串的引用;...

    string常量池和intern_韩雅茹Java系列2021.pdf

    它是一个内存区域,所有的Java类共享这个池子。字符串常量池的设计思想是为了解决字符串的频繁创建问题,减少内存开销和提高性能。 在Java中,字符串是不可变的,可以共享运行时实例创建的全局字符串常量池中。字符...

    10个有关String的面试问题Java开发Java经验技

    在Java编程语言中,String类是开发者经常打交道的一个核心类,尤其在面试中,String对象的特性和操作经常成为考察的重点。以下就是10个关于Java String的面试问题,这些问题涵盖了String的基础、性能优化以及一些...

    jdk6-8String类

    当创建一个`String`对象时,字面量字符串会被放入常量池。此外,`String`类提供了多种操作方法,如`substring()`、`concat()`、`indexOf()`等。 #### 优化亮点 - **intern()** 方法:这个方法会将字符串引用指向...

    提高 Java 代码性能的各种技巧.docx

    在 Java 6, 7, 8 中,String.intern() 方法是一个重要的性能优化技术之一。字符串池是 Java 中的一个重要概念,它可以通过使用唯一的共享 String 对象来使用相同的值不同的地址表示字符串。这篇文章将要讨论 Java 6 ...

    在.NET程序中正确使用String类型

    在.NET程序设计中,String类型是一个非常基础且重要的数据类型,用于表示文本。然而,由于.NET框架对String类型的特殊处理,开发者需要理解其工作原理,才能有效地利用它,避免不必要的性能损失。以下是对String类型...

    String类简介

    2. 常量池:Java虚拟机维护一个字符串常量池,存储所有的字符串字面量和通过`intern()`方法加入的字符串。 **三、常用方法** 1. `length()`: 返回字符串的长度,不包含结束符'\0'。 2. `charAt(int index)`: 获取...

    String创建对象

    在Java编程语言中,`String`类是使用极为频繁的一个类,主要用于处理文本字符串。面试或笔试中,`String`对象的创建方法是常见的考察点。以下是对`String`类创建对象的一些关键知识点的详细说明: 1. **字面量方式...

    Java常用类与基础API-String的构造器与常用方法

    - 初始化一个新创建的 `String` 对象,使其表示一个与参数相同的字符序列。简而言之,这个构造方法创建了一个原始字符串的副本。 - `public String(char[] value)`: - 使用提供的字符数组来构造一个新的 `String...

    深入解析String#internJava开发Java经验

    在Java编程语言中,`String#intern()` 是一个非常重要的方法,它涉及到字符串常量池的概念,对于理解和优化代码性能有着关键的作用。本篇将深入探讨`String#intern()` 的工作原理、使用场景以及在实际开发中的应用...

    关于java的一个有趣的问题

    String类的intern()方法可以将一个字符串转换为其在字符串池中的等价物,如果池中没有,则会添加这个字符串。 至于"=="运算符在比较String对象时,如果比较的是两个对象变量,它实际上是检查这两个变量是否引用同一...

    Java类库复习——java.lang.String

    在`String`的源码中,可以学习到如何设计一个高效且安全的不可变类。 总的来说,`String`类是Java开发中不可或缺的一部分,理解和掌握其特性和方法对于编写高质量的代码至关重要。通过深入研究源码,我们能更深入地...

    Java 之 String 类型

    例如,`String str = "Hello"` 创建了一个字符串对象。 - 因为不可变性,每次对字符串进行修改(如使用`concat()`或`substring()`),都会生成新的字符串对象,这在处理大量字符串操作时需要注意性能影响。 2. **...

    10个Java经典的String面试题!.zip

    - 当使用`new`关键字创建String对象时,会在堆内存中分配一个新的对象。 - 字符串字面量(如`"hello"`)会放入字符串常量池中。如果常量池中已有相同的字符串,就不会创建新的对象。 2. **String的不可变性** - ...

Global site tag (gtag.js) - Google Analytics