`
bruce.ko
  • 浏览: 32526 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

String Pool,String a=new String("abc");

阅读更多
在jvm中存在着String Pool
String pool就是字符串池
例如:
String str1="asd";
String str2="asd";
结果是str1==str2
因为String str1="asd";先会检查String pool中是否有asd这个字符串,若存在不必另外划分区间str2直接引用str1,这样能节省存储的空间

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

预料之中!

/////////////////////////////////////////////下面为引用////////////////////////////////////////////////////////

FROM:http://www.matrix.org.cn/thread.shtml?forum_id=19&view_id=17459

以上这句说话并没有错.那是在说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";
[color=indigo][/color]
分享到:
评论
1 楼 JustDoNow 2010-08-05  
很详细,我现在相信你的说法

相关推荐

    String a="hello" String b="hello" a==b 返回true的问题分析

    String a="hello world"; //在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址...

    String对象创建问题

    String对象的创建问题,分为:编译期和执行期 详细的讲解String对象创建问题

    浅析为什么a=”abc” 不等于 a=new String(“abc”)

    b=new String("abc") typeof b // object a==b //true a===b //false 但是为什么呢?看了很多书,问了好几个大神,其实自己还是稀里糊涂的。这里记录一下,备查。 在js中,区分原始资料类型和包装类型。数字、字符串...

    String.txt

    String a="abc";//创建字符串方式1 String b =new String("abc"); //创建字符串方式2 System.out.println(a==b); //false,内存地址不相等 String c =new String("abc"); String d =new String...

    关于String s=new String( "Hello")的例子思考

    关于String s=new String( "Hello")的例子思考

    浅析为什么a="abc" 不等于 a=new String("abc")

    主要介绍了为什么a="abc" 不等于 a=new String("abc"),需要的朋友可以参考下

    C# char[]与string byte[]与string之间的转换详解

    string str1 = new string(arr); 2、byte[]与string之间的转化 string str = 你好,hello; byte[] bytes; //byte[] 转换成 string bytes = Encoding.UTF8.GetBytes(str); //string 转换成 byte[] (字符串是用哪种...

    C#面试题及答案

    1. string str; string str=””; string str=null;三者之间有什么区别,最好能用图形表示。 答:区别如下: (1) string str;如果str是局部变量,编译时会忽略该变量,所以不会分配任何内存空间,如下图。如果是类...

    java 中String.equals和==的比较

    主要介绍了java 中String.equals和==的比较的相关资料,需要的朋友可以参考下

    public static String[] split(String s, String regex)

    public static String[] split(String s, String regex) s参数为待拆分字符串, regex参数有两种格式: 单字符的字符串(长度1),功能如下:split(“ab#12#453”, “#”) 返回带5个元素的数组:ab, #, 12, #, 453 ...

    LitJson工具源码导入能用,本人亲自修改版

    能将类,List,Dictionary类型转换成json同时也能反转换为实体 如以下类的转换案例,希望能帮助大家。...A a = new A(); string json = JsonMapper.ToJson(a); A a1 = JsonMapper.ToObject<A>(json); 如有疑问请下方咨询

    会员登录注册登录系统JSP

    { String logname="",password="",sex="", email="", phone="", message=""; String backNews; int age; public void setLogname(String name) { logname=name; } public String getLogname() { return ...

    calculator.java

    String foreText=new String(""); String backText=new String(""); String s=new String(); String s1=new String(); Object op=new String(); Object o=new String(); double d, dFore, dBack; int i=9; ...

    C#_string_byte数组转换解析

    string类型转成ASCII byte[]:("01" 转成 byte[] = new byte[]{ 0x30, 0x31}) 1 byte[] byteArray = System.Text.Encoding.ASCII.GetBytes ( str ); ASCII byte[] 转成string:(byte[] = new byte[]{ 0x30, 0x31...

    网页无组件上传图片与大家分享

    private String[] sourceFile = new String[255]; //源文件名 private String[] suffix = new String[255]; //文件后缀名 private String canSuffix = ".gif.jpg.jpeg.png"; //可上传的文件后缀名 private String...

    List集合排序222222

    String[] arr1 = new String[1]; arr1[0] = "Sex"; String[] arr2 = new String[1]; arr2[0] = "asc"; List sortList = controllerForList.sortList(list, arr1, arr2); 参数1 排序的集合 参数2 排序的字段(与...

    String.xml转Excel翻译工具

    ( String.xml转Excel翻译工具.zip....................................................................

    Java字符串池(String Pool)深度解析.docx

    Java字符串池(String Pool)深度解析.docx

    学员信息管理系统

    public static final String SYS_PROPERTYNAME = "sys.properties"; public static final String SYS_LISTENERPORT = "PORT"; public static final String SYS_HOSTNAME = "HOST"; public static final String ...

    android mars视频代码 Tea_marsListActivity

    ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>(); HashMap<String,String> map1 = new HashMap<String,String>(); HashMap<String,String> map2 = new HashMap<String,String>...

Global site tag (gtag.js) - Google Analytics