Java中String类两种实例化的区别(转)
原文:http://blog.csdn.net/wangdajiao/article/details/52087302
一、String类的第一种方式
1、直接赋值
例:String str = "hello";
直接赋值实际上就是相当于一个匿名对象(“hello”)设置了一个名字(str),String类的匿名对象是由系统自动生成,不在由用户自己创建,产生了匿名对象就一定在堆内存在开辟了一块堆内存空间,并且由一块栈内存指向这块堆内存
2、采用直接赋值的String类对象的内存地址完全相同,stra,strb,strc指向同一块内存地址
例:
public class StringDemo {
public static void main(String[] args) {
String stra = "hello" ;
String strb = "hello" ;
String strc = "hello" ;
System.out.println(stra == strb);//true
System.out.println(stra == strc);//true
System.out.println(strb == strc);//true
}
}
原因:
共享设计模式:在JVM底层实际上会有一个对象池(不一定保存String对象),当代码之中使用了直接赋值的方式定义了一个String类对象时,会将此字符串对象所使用的匿名对象入池保存,而如果后续还有其他String类对象也采用直接赋值方式,并且设置了同样的内容的时候,将不会开辟新的堆内存空间,而是使用已有的对象进行引用的分配,从而继续使用。
二、String类的第二种方式
1、构造方法
例:String str = new String("hello")
构造方法一定要使用关键字new,一旦使用了关键字new就表示要开辟新的堆内存空间,如果使用的是构造方法的方式产生String类对象,实际上开辟了两块堆内存空间(其中匿名对象产生内存空间将成为垃圾空间)
public class StringDemo {
public static void main(String[] args) {
String stra = new String("hello");
String strb = "hello";
System.out.println(stra == strb);//false
}
}
除了内存浪费以外,如果使用了构造方法产生String类对象,其内容不会保存在对象池之中。因为是使用了关键字new开辟的新内存
2、手动入池:使用String类定义的public String intern();
public class StringDemo {
public static void main(String[] args) {
//使用了构造方法创建对象,而后手动入池
String stra = new String("hello").intern();
String strb = "hello";
System.out.println(stra == strb);//ture
}
}
总结 :
String类两种实例化的区别
1、直接赋值:只会开辟一块堆内存空间,并且会自动保存在对象池之中,以供下次重复使用
2、构造方法:会开辟两块堆内存空间,其中有一块空间将成为垃圾,并且不会自动入池,但是用户可以使用intern()自动入池
在实际工作中,使用直接赋值产生String类对象
三、字符串一旦定义则不可改变
例:
public class StringDemo {
public static void main(String[] args) {
String str = "Hello";
str = str + "World";
str += "!!!";
System.out.println(str);
}
}
内存分析图:
因此,字符串的内容实际上没有改变,而对于字符串对象内容的改变,是利用了引用关系的变化而实现的,但是每一次的改变都会产生垃圾空间,因此String的内容不要过多频繁的修改
Java中String类两种实例化的区别(转)的更多相关文章
- (原)String类两种实例化的区别
String有两种实例化方式,一种是通过直接赋值的方式,另外一种是使用标准的new调用构造方法完成实例化. public class StringDemo { public static void m ...
- Java中String对象两种赋值方式的区别
本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...
- 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类
转自: http://blog.csdn.net/sunguangran/article/details/6069317 非常感谢原作者,整理的这么详细. 在java中可有两种方式实现多线程,一种是继 ...
- String 的两种实例化方式
String 的两种实例化方式 隐式实例化:直接赋值 public class Demo { public static void main(String[] args) { String s = & ...
- java中String类学习笔记
1.String的两种实例化方式 String str="hello";//直接赋值的方式: String str=new String("hello");// ...
- Java中String类为什么被设计为final?
Java中String类为什么被设计为final 首先,String是引用类型,也就是每个字符串都是一个String实例.通过源码可以看到String底层维护了一个byte数组:private f ...
- java中线程分两种,守护线程和用户线程。
java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...
- java中String类学习
java中String类的相关操作如下: (1)初始化:例如,String s = “abc”; (2)length:返回字符串的长度. (3)charAT:字符操作,按照索引值获得字符串中的指定字符 ...
- 在java中String类为什么要设计成final?
大神链接:在java中String类为什么要设计成final? - 程序员 - 知乎 我进行了重新排版,并且更换了其中的一个例子,让我们更好理解. String很多实用的特性,比如说“不可变性”,是工 ...
随机推荐
- 非root用户如何使用docker命令
docker命令默认只能root使用的,但我们可以赋权给其他用户,使用时先照常新建用户: [root@10 ~]# useradd docker [root@10 ~]# passwd docker ...
- 汽车行业与 Telematics
Telematics Telematics是远距离通信的电信(Telecommunications)与信息科学(Informatics)的合成词,按字面可定义为通过内置在汽车.航空.船舶.火车等运输工 ...
- Linux磁盘概念及其管理工具fdisk
Linux磁盘概念及其管理工具fdisk [日期:2016-08-27] 来源:Linux社区 作者:chawan [字体:大 中 小] 引言:冯诺依曼体系中的数据存储器就是我们常说的磁盘或硬盘 ...
- Spark学习笔记——Spark Streaming
许多应用需要即时处理收到的数据,例如用来实时追踪页面访问统计的应用.训练机器学习模型的应用, 还有自动检测异常的应用.Spark Streaming 是 Spark 为这些应用而设计的模型.它允许用户 ...
- Generate class from database table How can i generate a class from a table at a SQL Server?
Set @TableName to the name of your table. declare @TableName sysname = 'TableName' declare @Result v ...
- checkmysql.sh
#!/bin/sh # add by lxr MYSQL_SOCK="/tmp/mysql.sock" MYSQL_PWD="qq139547" ARGS=1 ...
- 【netcore基础】wwwroot下静态资源文件访问权限控制
本文参考如下博问 https://q.cnblogs.com/q/107836 业务要求 上传的资源文件(.mp3 .mp4等)只有购买了之后才能有权限访问,所以对上传的资源文件目录进行访问权限控制 ...
- Kotlin入门第一课:从对比Java开始
1. 介绍 今年初,甲骨文再次对谷歌所谓的安卓侵权使用Java提起诉讼,要求后者赔偿高达90亿美元.随后便传出谷歌因此计划将主力语言切换到苹果主导的Swift,不过这事后来没了跟进. 但谷歌在这两天的 ...
- 【译】python configparser中默认值的设定
在做某一个项目时,在读配置文件中,当出现配置文件中没有对应项目时,如果要设置默认值,以前的做法是如下的: try: apple = config.get(section, 'apple') excep ...
- Android Studio 工具窗口浮动与布局恢复【申明:来源于网络】
Android Studio 工具窗口浮动与布局恢复[申明:来源于网络] http://bbs.chinaunix.net/thread-4182438-1-1.html