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. 【bzoj2793】[Poi2012]Vouchers 暴力

    题目描述 考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个.正整数中有m个数被标成了幸运数,问有哪些人取到了幸运数. 输入 第一行一个 ...

  2. 安装JDK以及配置Java运行环境

    安装JDK以及配置Java运行环境 1.JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2 ...

  3. h5 Visibility API总结

    最近活动中的小游戏,有涉及页面隐藏或app后台运行时候,暂停游戏的功能,使用了h5的Visibility API,在此总结如下: 两个属性 document.hidden (Read only) 如果 ...

  4. ci的数据库地址

    CI在linux服务器上运行的时候,数据库配置主机名的时候必须是127.0.0.1,而不是localhost.并且phpmyadmin也有这样的要求

  5. 最全面的Android Webview详解

    转自:最全面的Android Webview详解 前言 现在很多App里都内置了Web网页(Hyprid App),比如说很多电商平台,淘宝.京东.聚划算等等,如下图  那么这种该如何实现呢?其实这是 ...

  6. sqlmap注入一般步骤

    1. 找到注入点url2. sqlmap -u url -v 1--dbs 列出数据库或者 sqlmap -u url -v 1 --current-db 显示当前数据库3. sqlmap -u ur ...

  7. 基于Xen实现一种domain0和domainU的应用层数据交互高效机制 - 3

    继续 上一篇 的研究,结合 xen4.2.3 的代码分析,发现 xen4.2.3 的应用层工具库 tools 包含一个工具叫 libvchan ,其头文件描述如下: * This is a libra ...

  8. Linux getcwd()的实现【转】

    转自:http://www.cnblogs.com/alan-forever/p/3721908.html 通过getcwd()可以获取当前工作目录. 1 #include <unistd.h& ...

  9. shell脚本查看服务器基本信息

    #!/bin/sh #电脑概览 #电脑型号 ComputerModel=`/usr/bin/sudo /usr/sbin/dmidecode | grep -A2 "System Infor ...

  10. Hashmap与Hashtable的区别及Hashmap的原理

    Hashtable和HashMap有几个主要的不同:线程安全以及速度.仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap ...