String的两种赋值是不同的,String str1=“hello”,指向堆内存中的"hello",而String str2=new String("hello"),因为new开辟的新的堆内存,所以二者地址不同,在用==时,显示的是false。
例一:
           String str1=“Hello”;
           String str2=“Hello”;
           String str3=“Hello”;

这时候三者都是指向同一堆内存地址,因为如果对象池中已经有了相同的字符串声明时,就不会再重新开辟空间了。
可是,如果先用String str1=new String("hello"),开辟新的堆内存,内容为"hello",
这时再写String str2="hello"呢,第一句中new已经新开辟了,对象池中就存在了"hello",
这时第二句中应该指向已经存在的地址,也就是和第一句new开辟的时同一堆内存地址呀,
但是为什么用==时,显示的还是false呢?
求解答
因为每一个字符串都是一个String类的匿名对象,所以首先会在堆内存中开辟一块空间保存字符串“Hello”,而后又使用了关键字 new 开辟的堆内存,而之前定义的字符串常量的堆内存空间将不会有任何的栈内存指向空间,就成为垃圾,等待被GC回收。所以,使用构造方法开辟的字符串对象实际上会开辟两块空间,其中有一块空间将成为垃圾。另外,使用构造方法实例化的String 类对象内容不会保存在字符串对象池中,既不能够进行共享数据操作。
 
观察入池问题:
public class StringDemo(){
    public static void main(String[] args){
        String str1 = new String( "Hello" );
        String str2 = "Hello";
        String str3 = "Hello";
        System.out.println( str1 == str2 );
        System.out.println( str1 == str3 );
        System.out.println( str2 == str3 );
    }
}
程序运行结果:
false
false
true
通过上面的程序可以发现,使用构造方法实例化的String 对象不会入池,所以,通过构造方法实例化的String类对象只能自己使用。但在String类中为了方便操作提供了一种称为手工入池的方法: public String intern();
实例:手工入池
public class StringDemo{
    public static void main(String[] args){
      String str1 = new String( "Hello" ).intern(); //入池
      String str2 = "Hello";                        //使用池对象
      String str3 = "Hello";                        //使用池对象
      System.out.println(str1 == str2);             //true
      System.out.println(str1 == str3);             //true
      System.out.println(str2 == str3);             //true
    }
}
程序运行结果:
true
true
true
本程序在使用 String 类构造方法实例化对象后又调用了String 类的 intern() 方法,而这个方法就表示将开辟的字符串对象保存在对象池中,所以日后利用直接赋值方式完成的 String 类对象实例化,就可以直接从对象池中取出数据进行操作,而不再需要重新开辟新的对象了。
 
常见面试题分析: 请解释String 类的两种对象实例化方式的区别。
   直接赋值:只开辟一块堆内存空间,字符串的内容可以自动入池,以供下次使用;
   构造方法:开辟两块堆内存空间,有一块将成为垃圾,并且不能自动入池,需要使用intern()手工入池。
 
常见面试题分析:代码“String s = new String ("mldn");”创建了几个String 类的实例化对象?
   创建了两个实例化对象,一个是String类的匿名对象“mldn”,另外一个是使用关键字new 实例化的String 类对象。

关于String的两种赋值方式的更多相关文章

  1. Java中String对象两种赋值方式的区别

    本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...

  2. String 的两种实例化方式

    String 的两种实例化方式 隐式实例化:直接赋值 public class Demo { public static void main(String[] args) { String s = & ...

  3. (原)String类两种实例化的区别

    String有两种实例化方式,一种是通过直接赋值的方式,另外一种是使用标准的new调用构造方法完成实例化. public class StringDemo { public static void m ...

  4. String类对象两种实例化方式比较

    第一种:直接赋值 String str =  "hello!" ; 在java中,有一个字符串常量池,对于这种直接赋值的,会直接写进常量池(常量池里面不存在其value,) 自JD ...

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

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

  6. Java中创建String的两种方式差异

    我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd"; String str2 = new String("abcd&qu ...

  7. Java中String类两种实例化的区别(转)

    原文:http://blog.csdn.net/wangdajiao/article/details/52087302 一.String类的第一种方式 1.直接赋值 例:String str = &q ...

  8. Android四大组件之服务的两种启动方式详解

    Service简单概述 Service(服务):是一个没有用户界面.可以在后台长期运行且可以执行操作的应用组件.服务可由其他应用组件启动(如:Activity.另一个service).此外,组件可以绑 ...

  9. 串的两种模式匹配方式(BF/KMP算法)

    前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最重要的操作之一,而不同的算法实现有着不同的 ...

随机推荐

  1. 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...

  2. windows安装 Nodejs,NPM, CNPM

    1, dowload Nodejs from :  http://nodejs.cn/download/ 下载完毕后,可以安装node,建议不要安装在系统盘(本例安装在 D:\vueProject) ...

  3. hihoCoder #1902 字符替换

    解法 这题比赛时过的人很多,我却没思路,糊里糊涂写了个强联通分量,得了 80 分. 这题思路是这样的. 一个替换操作可以看做一个有向边,所以题目实际上给出了一个有向图 $G$,一个节点代表一个字母. ...

  4. 看了就学会之React redux入门示例

    环境准备 为了方便,这里使用create-react-app搭建react环境 create-react-app mydemo 弹出配置 如果需要自定义react的配置,需要运行下面的命令把配置文件弹 ...

  5. POJ 3421 X-factor Chains | 数论

    题意: 给一个x,求最长的排列满足开头是1,结尾是x,前一个数是后一个数的因子 输出长度和这样序列的个数 题解: 把x分解质因数,质因数个数就是答案,接下来考虑怎么求个数 显然这是一个可重集合全排列问 ...

  6. echarts移动端字体模糊解决方法

    echarts使用canvas画图,在移动端使用rem时候,若viewport的scale被缩放,则字体会发生模糊,本人采用的解决方法是在不同的dpr下使用不同的字体大小,具体代码如下: 获取字体大小 ...

  7. POJ1200 Crazy Search

    Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Description Many peo ...

  8. 算法详解(LCA&RMQ&tarjan)补坑啦!完结撒花(。◕ˇ∀ˇ◕)

    首先,众所周知,求LCA共有3种算法(树剖就不说了,太高级,以后再学..). 1.树上倍增(ST表优化) 2.RMQ&时间戳(ST表优化) 3.tarjan(离线算法)不讲..(后面补坑啦!) ...

  9. Xdebug安装对应版本与配置

    Xdebug安装地址https://xdebug.org/download.php,进入下载页面后点击custom installation instructions,可以找到适合的Xdebug版本. ...

  10. python--math

    >>> import math >>> >>> # ceil,取大于等于x的最小的整数值 >>> math.ceil(4) 4 ...