关于String的对象创建
1)String
String是Java中的字符串类,属于引用数据类型。所以String的对象存放的是引用的地址。在底层是一个字符型数组。
String是不可变的。所谓的不可变是指一个对象有了一个引用过后它的引用不可变,每次对String对象增加字符串,该对象的引用将会指向一个新的引用地址。
在方法区有一个常量池,当字节码加载如虚拟机时字符串常量就已经加载进常量池并给它分配一个内存地址。字符串对象就引用该地址。
=========================================
String str = "abc";
str = str + "d";//引用地址将会改变,这时的str是一个新的对象。
===========================================
2)String对象创建分析
public class Test {
public static void main(String[] args) {
//str1存放(引用)常量池中的地址
String str1 = "abcd";
//str2存放(引用)堆中对象的地址,而堆中的数据存放的是常量池中的地址,多重引用
String str2 = new String("abcd");
}
}

如果常量区中有该字符串,就不重新存储,而是直接引用,这样节省了内存。该程序只在堆中开辟了一个空间。
3)Java对String的优化
源代码:
public class Test {
//返回一个cd字符串
public static String getString() {
return "cd";
}
public static void main(String[] args) {
String str1 = "abcd";
String str2 = "a" + "b" + "c" + "d";
String str3 = "ab" + "cd";
String temp = "ab";
String str4 = "ab" + temp;
String str5 = "ab" + getString();//调用上面定义的方法得到cd
//注意:这里的‘==’比较的是它们的引用地址,而不是比较的它们的值
System.out.println(str1 == str2);//结果为true
System.out.println(str1 == str3);//结果为true
System.out.println(str1 == str4);//结果为false
System.out.println(str1 == str5);//结果为false
}
}
==========================================
使用反编译工具将上面字节反编译得到的代码:
public class Test{
public static String getString() {
return "cd";
}
public static void main(String[] args) {
String str1 = "abcd";
String str2 = "abcd";
String str3 = "abcd";
String temp = "ab";
String str4 = "ab" + temp;
String str5 = "ab" + getString();
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str1 == str4);
System.out.println(str1 == str5);
}
}
==============================================
结论:
我们对加红的代码进行比较,也就是Java虚拟机对String经行了优化,这里str1、str2、str3引用了同一个地址,共用了常量区中的数据,所以它们的引用地址进行比较结果是相同的。但是变量和方法无法确认它们准确的值只有运行到该行代码时才能却定,在堆中新创建一个空间。所以str1、str4、str5引用地址的比较不相等。
Java虚拟机的优化共用了资源,减少了内存的使用,从而释放了更多的空间。
关于String的对象创建的更多相关文章
- String,到底创建了多少个对象?
String str=new String("aaa"); <span style="font-size:14px;">String str=n ...
- 关于Java String对象创建的几点疑问
我们通过JDK源码会知道String实质是字符数组,而且是不可被继承(final)和具有不可变性(immutable).可以如果想要了解String的创建我们需要先了解下JVM的内存结构. 1.JVM ...
- String str = new String("xyz") 会创建几个对象
转载:https://blog.csdn.net/andychen314/article/details/50857313 答案是 两个对象,要理解这个,就要知道string类的工作原理.下面来慢慢分 ...
- 常量池与方法区以及又读new String对象创建问题
又拿出这道String str1 = new String("abc");创建几个对象的面试题梳理了一下常量池与方法区的关系,希望能把这两者的关系通过这道面试题说明白 方法区是什么 ...
- new String("ab")到底创建了几个对象说明
new String("ab")到底创建了几个对象? 之前一直被这个问题困扰,网上一些描述的都不是很清楚,自己看了一些资料可算搞清楚了,那就在博客上记录一下吧! String st ...
- Java中String对象创建机制详解()
一String 使用 private final char value来实现字符串存储 二Java中String的创建方法四种 三在深入了解String创建机制之前要先了解一个重要概念常量池Const ...
- Java String Pool--String s = new String("a") 到底创建了几个对象?
本篇重点(tips): 1. String Pool 是以Java 中 String 对象是不可变的这一特性为基础的 2. String Pool是Heap(堆)中的一块特殊空间(JDK 1.7 之前 ...
- 关于Java 里的String和对象
之前老师在课堂上讲过关于Java的引用,但是很遗憾,木有认真听啊,所以就在学习Java的过程中迷惑迷惑...最近好像明白一点Java的引用是怎么回事了.以下仅是我个人的理解,如果不对,还请不吝赐教. ...
- 《JavaScript模式》第5章 对象创建模式
@by Ruth92(转载请注明出处) 第5章:对象创建模式 JavaScript 是一种简洁明了的语言,并没有其他语言中经常使用的一些特殊语法特征,如 命名空间.模块.包.私有属性 以及 静态成员 ...
随机推荐
- 早期MyBatis开发与接口式Mybatis开发的简介
早期MyBatis开发与接口式Mybatis开发的简介 一.早期版本的myBatis使用 导jar包 1.配置mybatis.xml的配置文件 1) ...
- [2015-10-11]常用git命令
从vs2013开始,vs已经对git的操作提供了很好的支持,但是重度使用时还是会遇到很多抽风的时候,在此记录一些常用命令. 分支操作 查看所有远程分支 git branch -r 查看本地分支 git ...
- java 泛型简单使用
- TC358743XBG:HDMI转MIPI CSI参考设计
TC358743XBG参考设计电路图如下, 功能HDMI转MIPI CSI ,通信方式:IIC,分辨率1920*1080,封装形式BGA64.
- Linux和win7(win10)双系统时间错误问题 时间相差8小时
转载自 http://m.2cto.com/os/201204/126212.html 有修改 前一段时间刚装了centos 5.4和win7的双系统.发现win7的系统时间不对,机子没上网,每天开机 ...
- 探索 Java 热部署
在 JAVA 开发领域,热部署一直是一个难以解决的问题,目前的 JAVA 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作.对于某些大型的应用来 ...
- javascript中=,==,与===的区别;以及特殊值NaN的讲解
1.在js中"="是作为赋值.var a; a=3:给a赋值为3. 2."=="称作相等,"==="被称作严格相等.当使用"== ...
- List,map,Set区别
List按对象进入的顺序保存对象,不做排序或编辑操作.Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List).Map同样 ...
- 团队作业8——第二次项目冲刺(Beta阶段)Day1--5.18
1.展开站立式会议: 会议内容:①团队里的新成员做简单的自我介绍. ②讨论每天的任务分配问题. ③提出一个严格要求:博客一定要及时发布,并及时提交作业,遇到困难可以提出来一起解决. ④就现阶段的项目进 ...
- 201521123045 《Java程序设计》第6周学习总结
Java 第六周总结 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结.注1:关键词与内容不求多,但概念之间的 ...