关于String的两种赋值方式

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 类对象。
时间: 2024-10-26 11:04:56

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

Java中String的两种赋值方式的区别

本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过"字面量"赋值,如:String str="hello",第二种是通过new关键字创建新对象,如:String str=new String("hello").那么这两种赋值的方式到底有什么区别呢,下面给出具体分析. 1.首先回顾Java虚拟机的结构图. 在上面的

从Java源码看String的两种比较方式

String的两种字符串比较方式 == 和 equals方法 ==: ==比较的是字符串在内存中的地址 代码示例: 1 public class EqualsDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 String s1 = "String"; 8 String s2 = "String"; 9 String s3 = new String(&quo

String类两种实例化方式的区别

1.直接赋值方式:创建的对象存放到字符串对象池中,假如对象存在,则不会再创建 2.new对象方式:每次都会创建一个新的对象 原文地址:https://www.cnblogs.com/a591378955/p/8410748.html

String.match(正则 或 'string') 有两种方式

method1: '1aaa2bb3'.match(/\d/g) //return : [1,2,3] method2: '1aaa2bb3 hello world'.match('world ') //return null,是因为后面有个空格所以返回null '1aaa2bb3 hello world'.match('world') //return world String.match(正则 或 'string') 有两种方式

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

我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd"; String str2 = new String("abcd"); 那么为什么会存在这两种创建方式呢,它们在内存中的表现形式各有什么区别? 方法1: String a = "abcd"; String b = "abcd"; System.out.println(a == b); // true System.out.pri

JAVABEAN是什么和总结JAVABEAN的两种使用方式

看完这个后再也不纠结javabean是什么东西了,感谢博主,由于是Javablog不能收藏故在此转发. 以下内容转自:http://www.blogjava.net/flysky19/articles/88180.html 一. javabean 是什么? Javabean 就是一个类,这个类就定义一系列 get<Name> 和 set<Name> 方法. So simple ! Javabean 就是为了和 jsp 页面传数据化简交互过程而产生的. 自己的理解: 使用 javab

Android中两种序列化方式的比较Serializable和Parcelable

Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用者两种序列化方式.还有,我们需要对象持久化到存储设备或者通过网络传输给其他客户端,这个使用也需要使用Serializale来完成对象的序列化.在Android应用开发中,这两种方式都很常见,但两者方式并不相同. 1.Serializable接口 Serializable接口是Java提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作.使用

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

Service简单概述 Service(服务):是一个没有用户界面.可以在后台长期运行且可以执行操作的应用组件.服务可由其他应用组件启动(如:Activity.另一个service).此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC).例如:服务可以处理网络事务.播放音乐,执行文件 I/O 或与内容提供程序交互,而这一切均可在后台进行. 进程的优先级 了解进程的优先级可以帮助你理解服务~ 1. Foreground process(前台进程) 一句话总结:当前跟用户有交互

PlaceHolder的两种实现方式

placeholder属性是HTML5 中为input添加的.在input上提供一个占位符,文字形式展示输入字段预期值的提示信息(hint),该字段会在输入为空时显示. 如 1 <input type="text" name="loginName" placeholder="邮箱/手机号/QQ号"> 目前浏览器的支持情况 浏览器 IE6/7/8/9 IE10+ Firefox Chrome Safari  是否支持 NO YES YE