String 这样的量,在我们的认知中是比较特别的。 其中String 是个对象,然后String也可以是个普通的字面量。在每代JDK中对String 的处理也是不同的,本篇的篇幅不大,仅仅觉着String有意思,所以拿出来说。 先说几个常见的问题 比如String tempStr=“123”+“456”; 这句话在编译的过程中就已经是一个字符串了,俗称的编译优化??? String字面量跟String 对象的存放位置是不同的,一个是在堆上,一个在常量池。 所以有时候会产生这样的情况:String abc=“123”;String acb=“123”;String bca=“123”;……取到的是一个对象,但是当我们去new 一个对象时必定是产生一个对象的而不是先检查常量池。 除此之外还有一个方法叫做intern 这个是一个native方法,作用很简单,检查常量池中是否有该字符串量,若没有向常量池中复制一份。 JDK API文档中对intern()方法的描述是: 返回字符串对象的规范化表示形式。 一个初始为空的字符串池,它由类 String 私有地维护。 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。 它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。 所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。 然后来回说这个常量池,感觉这么说太抽象了,其实说白了就是一个方便查找的存放常量的池子,结构类似于HashMap。 这一个很简洁,就这么多~ 其实跟JVM 并没什么关系,就是想说说 // todo 合并Java 版中的String