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. 安装bcc

    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D4284CDD echo "deb https://repo.i ...

  2. Java String学习笔记

    参照:https://www.jianshu.com/p/2f209af80f84 常量池: Java代码被编译成class文件时,会生成一个常量池(Constant pool)的数据结构,用以保存字 ...

  3. jQuery仿3D旋转木马效果插件(带索引按钮)

    项目中需要用到旋转木马效果,但是我在网上找的插件,基本都是不带按钮或者只是带前后按钮的,而项目要求的是带索引按钮,也就是说有3张图片轮播,对应的要有3个小按钮,点击按钮,对应的图片位于中间位置.于是就 ...

  4. POJ 3421 X-factor Chains | 数论

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

  5. Snakes and Ladders LightOJ - 1151( 概率dp+高斯消元)

    Snakes and Ladders LightOJ - 1151 题意: 有100个格子,从1开始走,每次抛骰子走1~6,若抛出的点数导致走出了100以外,则重新抛一次.有n个格子会单向传送到其他格 ...

  6. Codeforces Round #421 (Div. 2) D. Mister B and PR Shifts

    Codeforces Round #421 (Div. 2) D. Mister B and PR Shifts 题意:给一个长度为\(n\)的排列,每次可以向右循环移位一次,计算\(\sum_{i= ...

  7. AirPlay、DLNA、Miracast三大无线技术介绍

    小米盒子之AirPlay.DLNA.Miracast三大无线技术介绍 米官方称小米盒子的米联功能可以将小米手机或iPhone.iPad上的图片.音乐.视频等精彩内容投射到电视上,让你感受大屏的刺激.而 ...

  8. RHN Classic and Red Hat Subscription Management

    What's the difference between RHN Classic and Red Hat Subscription Management? Introduction With the ...

  9. JS省份联级下拉框

    <script type="text/javascript"> var china=new Object();china['北京市']=new Array('北京市区' ...

  10. mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存)

    这配置已经优化的不错了,如果你的mysql没有什么特殊情况的话,可以直接使用该配置参数 MYSQL服务器my.cnf配置文档详解硬件:内存16G [client]port = 3306socket = ...