原文:http://blog.163.com/woshihezhonghua@126/blog/static/1271436362012101214031911/

首先明确一点,String是一个类。下面我们主要讨论两个问题

 a) String类的对象的两种赋值方式

 b) 为什么String类的对象可以直接赋值

 

a) 1 类似普通对象,通过new创建字符串对象。String str = new String("Hello"); 内存图如下图所示,系统会先创建一个匿名对象"Hello"存入堆内存(我们暂且叫它A),然后new关键字会在堆内存中又开辟一块新的空间,然后 把"Hello"存进去,并且把地址返回给栈内存中的str, 此时A对象成为了一个垃圾对象,因为它没有被任何栈中的变量指向,会被GC自动回收。

a)2 直接赋值。 如String str = "Hello";  首先会去缓冲池中找有没有一个"Hello"对象,如果没有,则新建一个,并且入池,所以此种赋值有一个好处,下次如果还有String对象也用直接赋 值方式定义为“Hello”, 则不需要开辟新的堆空间,而仍然指向这个池中的"Hello"

 
以下代码可以测试这一结论 ,最后输出结果为 true, 我们用的是== 测试,输出true,说明两者的地址是一样的
 
a)3  手动入池
即使使用new关键字,第一种方式赋值,也可以使用一个java中的手动入池指令,让所创建的对象入池,以后依然可以背重复使用,利用下面两段代码可以测试, 如下图,结果显然是false,因为二者的地址不同。 

下面程序中,我们使用了intern()方法,手动入池,所以结果是true.
public class TestString
{
 public static void main(String args[]){
  String str1 = new String("Hello").intern();
  String str2 = "Hello";
  System.out.println( str1==str2 );
 }
}
 
下面程序中,str2没有使用直接赋值,所以结果又变为false
public class TestString
{
 public static void main(String args[]){
  String str1 = new String("Hello").intern();
  String str2 = new String("Hello");
  System.out.println( str1==str2 );
 }
}
 
 
综上所述,开发中,使用直接赋值的方式,显然效率更高。
 
 
b) 为什么String类的对象可以直接赋值  

打开了String.class,有这么一段介绍:

  1. /**
  2. * The <code>String</code> class represents character strings. All
  3. * string literals in Java programs, such as <code>"abc"</code>, are
  4. * implemented as instances of this class.
  5. * <p>
  6. * Strings are constant; their values cannot be changed after they
  7. * are created. String buffers support mutable strings.
  8. * Because String objects are immutable they can be shared. For example:
  9. * <p><blockquote><pre>
  10. *     String str = "abc";
  11. * </pre></blockquote><p>
  12. * is equivalent to:
  13. * <p><blockquote><pre>
  14. *     char data[] = {'a', 'b', 'c'};
  15. *     String str = new String(data);
  16. * </pre></blockquote><p>
  17. * Here are some more examples of how strings can be used:
  18. * <p><blockquote><pre>
  19. *     System.out.println("abc");
  20. *     String cde = "cde";
  21. *     System.out.println("abc" + cde);
  22. *     String c = "abc".substring(2,3);
  23. *     String d = cde.substring(1, 2);
  24. * </pre></blockquote>
  25. * <p>
  26. */


过上面的介绍,我们可以清楚,直接赋值的话,是通过编译器在起作用,当你对"abc"没有通过new创建时,他会自动默认给你调用构造函数new
String(char value[]). 不显式调用String的构造函数(通过new叫显式调用),其实JDK编译器会自动给你加上。

java String 两种不同的赋值 比较的更多相关文章

  1. Java中String两种不同创建方式的区别及intern的用法

    一, Java有两种创建字符串的方式, String str1 = "abc"; String str2 = new String("abc"); 用双引号创建 ...

  2. java中两种类型变量

    Java中有两种类型的变量,一种是对象类型,另一种是基础类型(primitive type). 对象类型普遍采用引用的方式,比如 List a = new ArrayList(); List b = ...

  3. JAVA 中两种判断输入的是否是数字的方法__正则化_

    JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...

  4. Java中两种实现多线程方式的对比分析

    本文转载自:http://www.linuxidc.com/Linux/2013-12/93690.htm#0-tsina-1-14812-397232819ff9a47a7b7e80a40613cf ...

  5. Java中有两种实现多线程的方式以及两种方式之间的区别

    看到一个面试题.问两种实现多线程的方法.没事去网上找了找答案. 网上流传很广的是一个网上售票系统讲解.转发过来.已经不知道原文到底是出自哪里了. Java中有两种实现多线程的方式.一是直接继承Thre ...

  6. JavaScript 与 Java 是两种完全不同的语言,无论在概念还是设计上。

    JavaScript 与 Java 是两种完全不同的语言,无论在概念还是设计上. Java(由 Sun 发明)是更复杂的编程语言. ECMA-262 是 JavaScript 标准的官方名称. Jav ...

  7. String基础: String两种创建对象方式的比较

    字符串常量 在一般的语言中常量一旦声明则不可改变,在java中的字符串常量是以匿名对象来表示的 javaz中字符串两种定义方法: String strA= new String("hello ...

  8. String 两种实例化方式的区别

    package com.java1234.chap03.sec08; public class Demo3 { public static void main(String[] args) { //1 ...

  9. Java HashMap两种遍历方式

    第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...

随机推荐

  1. Dubbo使用解析及远程服务框架

    this is a thub here Spring的Remoting框架 阿里巴巴的dubbo框架 RPC,RMI,JMS,Webservice的区别

  2. vijos1603迷宫

    这题的构思太巧妙了: 经典题目8 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值    把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j. ...

  3. 禅道,然之和蝉知入驻VM Depot

    Posted on 四月 21, 2015 by 陈阳 近日, 易软天创与微软开放技术合作,在虚拟镜像中国站点vmdepot.msopentech.cn上成功部署易软天创的集成管理环境,为希望快速基于 ...

  4. apache开源项目--lume

    lume 是一个分布式.可靠和高可用的服务,用于收集.聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型.这是一个可靠.容错的服务.

  5. 安装ejabberd2并配置MySQL为其数据库

    以前用过openfire做为服务器,但是openfire的集群支持不是很好,所以改用Ejabberd,由于它是用Erlang语言开发的,其并发率与分布式的功能都是很强悍的,在此我记录一下我的安装与配置 ...

  6. ASDL + WN725N 配置无线AP

    1.  ASDL 正常拨号上网 2.  安装TP-LINK无线客户端应用程序 打开之后选择模拟AP 如下图设置----应用 3.  本地连接----属性----高级 如下图设置 4.  宽带连接--- ...

  7. [Andrew]Ext.net前台弹框

    //有询问的提示框 Ext.Msg.show({            title: title,            msg: msg,            buttons: Ext.Msg.Y ...

  8. 《转》GDB中应该知道的几个调试方法

    原文:http://coolshell.cn/articles/3643.html 七.八年前写过一篇<用GDB调试程序>,于是,从那以后,很多朋友在MSN上以及给我发邮件询问我关于GDB ...

  9. <转>SpringMVC与Struts2 比较总结

    原链接:http://blog.csdn.net/chenleixing/article/details/44570681 个人整理: 1.级别不同:SpringMVC :方法  Struts是 类级 ...

  10. linux 安装mongodb

    Linux 安装mongodb 1.下载mongodb linux wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon- ...