字符串的拼接和intern方法

String s1 = "Programming";
String s2 = new String("Programming");
String s3 = "Program";
String s4 = "ming";
String s5 = "Program" + "ming";
String s6 = s3 + s4;
System.out.println(s1 == s2);//false
System.out.println(s1 == s5);//true
System.out.println(s1 == s6);//false
System.out.println(s1 == s6.intern());//true
System.out.println(s2 == s2.intern());//false

个人推测:

s1==s2,s1是指向常量池中"Programming"字符串的一个引用,s2指向的是一个存在于堆空间里面的一个字符串对象的引用,所以直接比较不相等。

s1==s5,s5是常量池中的两个字符串的拼接,可能返回的就是拼接之后的常量的引用,而常量池中是指向的字符串和拼接之后的结果相同,所以返回了s1指向的字符串。

s1==s6,s6是由s3和s4两个字符串对象+出来的,堆中的两个字符串对象的+调用的是StringBuffer的append最后toString,所以s6指向的还是一个堆中对象的引用

s1==s6.intern(),intern()方法在常量池中检测和s6满足equals条件的字符串是否存在,如果存在则返回对常量池中的对象的引用,如果不存在则添加一个新的常量,并返回新常量的引用。

时间: 2024-11-10 22:17:52

字符串的拼接和intern方法的相关文章

java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法

字符串常量池:字符串常量池在方法区中 为了优化空间,为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池.如果字符串已经存在池中,就返回池中的实例引用.如果字符串不在池中,就会实例化一个字符串并放到池中.Java能够进行这样的优化是因为字符串是不可变的,可以不用担心数据冲突进行共享.所以,在常量池中的这些字符串不会被垃圾收集器回收 1.String str = new String("hello");此时创建的2个对象

关于vb编程之字符串连接/拼接的方法与技巧

在VB中,笔者知道的字符串的拼接方法主要有两种拼接符号,一种为"&"符,另一种则为"+"符 一.其中&连接运算符用于强制将两个表达式作为字符串连接,重点是强制,即使有一边为字符串,一边为数字类型都可以 如:Label1.Caption="abc" & 123        Label1.Caption="abc" & vbCrLf & "qq5201351"   //

StringBuffer转String后的intern方法

用StringBuffer生成字符串过程中,不同的拼接方式会影响最终字符串对象的位置. 案例一:声明对象中含直接定义的字符串 public class test { public static void main(String[] args) { // TODO Auto-generated method stub String str1=new StringBuffer("计算机").append("软件").toString(); String str2=new

String的内存和intern()方法

一.关于常量池 字符串在Java中用的非常得多,Jvm为了减少内存开销和提高性能,使用字符串常量池来进行优化. 在jdk1.7之前(不包括1.7),Java的常量池是在方法区的地方,方法区是一个运行时JVM管理的内存区域,是一个线程共享的内存区域,它用于存储已被虚拟机加载的类信息.常量.静态常量等. 运行时常量池是方法区的一部分. 来看一个图: (图片来自https://www.cnblogs.com/ysocean/p/8571426.html) 关于其他的内存分布就不在这介绍了. 而在jdk

浅析String.intern()方法

1.String类型“==”比较样例代码如下:package com.luna.test;public class StringTest { public static void main(String[] args) { String str1 = "todo"; String str2 = "todo"; String str3 = "to"; String str4 = "do"; String str5 = str3

Java intern()方法

intern()方法: public String intern() JDK源代码如下图: 返回字符串对象的规范化表示形式. 一个初始时为空的字符串池,它由类 String 私有地维护. 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定), 则返回池中的字符串.否则,将此 String 对象添加到池中,并且返回此 String 对象的引用. 它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t)

深入解析String.intern()方法

转载: http://tech.meituan.com/in_depth_understanding_string_intern.html 引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊.它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中. 如

了解String类的intern()方法

相信绝大多数的人不会去用String类的intern方法,打开String类的源码发现这是一个本地方法,定义如下: public native String intern(); 文档告诉我们该方法返回一个字符串对象的内部化引用. public String intern()返回字符串对象的规范化表示形式. 一个初始时为空的字符串池,它由类 String 私有地维护. 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确

java基础知识回顾之---java String final类之intern方法

public class StringObjectDemo { /** * @param args */ public static void main(String[] args) { String hello = "Hello", lo = "lo"; System.out.print((hello == "Hello") + " ");//true System.out.print((Other.hello == hel