原文: http://forum.javaeye.com/viewtopic.php?t=17912
搂主的问题问的含含糊糊:flyjie给出了非常详细的解释,
不过就是没有解释String实例化的特殊方面以及Intern()方法的含义
-------
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
java代码:
String str ;
这样声明str它只支是一个对象的reference,不会产生实际的对象。如果没有初始化str,编译时便会发生错误。
java代码:
String str1=new String("test");
String str2 = "test";
str1是一个新的对象。new关键字的意思就是创建某个新的对象。而str2是一个对象的引用。 它们的内容相同,但内存地址是不一样的。 java中对象的引用存在Stack(栈)中,而对象由Heap(堆)分配空间。
3、引用==变量? 不一定
java代码:
public class TestString {
public static void main(String[] args) {
String s1 = "test";
String s2 = new String("test");
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
if (s1.equals(s2))
System.out.println("s1 equals s2");
else System.out.println("s1 not equals s2");
}
}
我们将 s2 用 new 操作符创建程序输出:s1 != s2 s1 equals s2.
java代码:
s2 = s2.intern();
在你加上这句话后,上面的程序输入:s1 == s2 s1 equals s2
而String a = "test" ; String b = "test" ; a == b 会返回true; 这里a="test"时创建一个在栈中的reference, b=test时jvm发现栈中已存在名为"test"的字符串,直接引用。结论:String 是个对象,要对比两个不同的String对象的值是否相同明显的要用到 equals() 这个方法. 而== 比较的是内存地址的值。
4、private final String a = "test", 这个a属于常量,存放在常量存储空间(CS)中。
5、建议你看看<<深入浅出java虚拟机>>一书。
-------
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
总结
1. 在学习JAVA的时候就知道==比较的是内存地址.而equals比较的是内存地址对应的值!(可是还是有很多的人问来问去的,真不知道他们JAVA的基础课程是怎么学的?!)
2. JAVA所有的对象都是存放在堆中的!你获取的"对象"仅仅只是对象的引用而已
3. String是比较特殊的对象,特殊在
3.1 > String a = new String("test") -此时你是在堆中实例化了一个字符串对象
3.2 > String b = "test"-此时JVM会先去堆中寻找这样的对象;如果有就返回此对象的引用;如果没有就重新实例化一个这样的对象!基于这样的一个过程所以JAVA要求String不可以更改值的。
3.3 >intern()方法就是试图完成这样的一个寻找过程
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
这里有一份详细的参考资料:
关于Java栈与堆的思考 http://www.javafan.net/article/20051123115654293.html
相关推荐
laravel-intern.sql
Algorithm-INTERN-PRACTICE-QUESTION.zip,实习问题,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。
这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整。
Intern-Team-4-源码.rar
信息安全_数据安全_AppSecEU2016-Wojtek-Dworakowski-Intern 数据泄密 威胁情报 威胁建模 安全工作 安全威胁
leetcode卡leetcode-easy-collection-intern-exercise 关联:
深入理解JavaString#intern()内存模型Java开发Java经验技巧共4页.pdf.zip
关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样...
本文将给大家详细介绍关于C#字符串优化String.Intern、IsInterned的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 首先看一段程序: using System; class Program { static void ...
String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成的字符串的数量,推荐尽量直接使用String Table中的字符串常量池中的元素。 那么String.intern的性能怎么样呢?我们一起来看一下。 String.intern...
深入理解 Java String#intern() 内存模型.docx
git clone https://github.com/renanluiz/intern.git 在安装依赖项之前,请使用令牌和一些基本配置填写config.json文件。 { "TOKEN": "", // Your personal Discord Bot Token "YOUTUBE_API_K
string常量池和intern_韩雅茹Java系列2021.pdf
2018秋招java笔试题 Java Review 1. 数据结构和算法 红黑树 代码: ) 图解: 2. 面试题 2021.4.10 英礡Improbable笔试题 (2021 Improbable Intern Online Test) 括号匹配 约瑟夫环 2021.03.31 华为校园招聘软件笔试题...
java 在线考试系统java MF000001 : DJINGH MF000002 : k58fun MF000003 : 65skuv MF000004 : sh9n4g MF000005 : 6HD85G MF000006 : hjsung MF000007 : 56fjid MF000008 : juff5s MF000009 : 68shud MF000010 : 5du8a...
happy-coding-intern-test 终极密码(猜数字游戏) 达成的要素: 1.让使用者自订密码范围2.依据使用者回答逐一限缩范围(猜太大or猜太小) 3.猜对后显示答案、一共猜了几次4.使用注解描述撰写方式与逻辑撰写心得: 1...
复制权限:已授予 这是我的Mozilla Intern 2015演示文稿的幻灯片。 如果您想观看伴随演讲的幻灯片,可以在air mozilla上找到演讲: : 注意:使用reveal.js-复制/剪切代码需要使用firefox 41或更高版本。
受此问题的启发而被关闭:“ API请求:string.Intern(ReadOnlySpan ...)” 共享池已设置上限; 具有第二代LRU驱逐,以及第二代GC集合的进一步驱逐。 使用示例 馆藏 using Ben . Collections ; array = array . ...
-- Be familiar with Websphere Application Server, Familiar with IBM java development IDE such as Eclipse, RAD or WID -- Programming skills: Java, JSP, JavaScript, HTML, XML,Web Service,design ...