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很多实用的特性,比如说“不可变性”,是工 ...
随机推荐
- hdoj:2045
#include <iostream> using namespace std; ]; int main() { int n; a[] = ; a[] = ; a[] = ; ; i &l ...
- 原 TCP层的分段和IP层的分片之间的关系 & MTU和MSS之间的关系
首先说明:数据报的分段和分片确实发生,分段发生在传输层,分片发生在网络层.但是对于分段来说,这是经常发生在UDP传输层协议上的情况,对于传输层使用TCP协议的通道来说,这种事情很少发生. 1,MTU( ...
- [React] 11 - Redux: redux
Ref: Redux中文文档 Ref: React 讀書會 - B團 - Level 19 Redux 深入淺出 Ref: React+Redux 分享會 Ruan Yifeng, Redux 架构: ...
- android 中文api
http://www.embeddedlinux.org.cn/androidapi/
- nodejs 单线程 高并发
nodejs为什么是单线程且支持高并发的脚本语言呢? 1.node的优点:I/O密集型处理(node的I/O请求都是异步的,如:sql查询.文件流操作.http请求……):异步I/O?顾名思义就是异步 ...
- OpenGL——折线图柱状图饼图绘制
折线图绘制代码: #include<iostream> //旧版本 固定管线 #include<Windows.h> #include <GL/glut.h> // ...
- Excel 函数集(使用过的)
1. SUBTOTAL函数 筛选结果求和 SUBTOTAL(函数编号, 区域) 函数编号 为 1 到 11(包含隐藏值)或 101 到 111(忽略隐藏值)之间的数字,指定使用何种函数在数据清单 ...
- NIO相关概念之Buffer
Buffer的定义: 概念上,缓冲区是包在一个对象内的基本数据元素数组.Buffer类相比一个简单数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中.Buffer类以及它专有的子类定义了一 ...
- officewebapps 服务器部署问题
officewebapps 服务器部署问题 部署文档 http://technet.microsoft.com/zh-cn/library/jj219455 New-OfficeWebAppsFarm ...
- A - Calendar
A - Calendar Time Limit:1000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Submit ...