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的对象创建的更多相关文章

  1. String,到底创建了多少个对象?

      String str=new String("aaa"); <span style="font-size:14px;">String str=n ...

  2. 关于Java String对象创建的几点疑问

    我们通过JDK源码会知道String实质是字符数组,而且是不可被继承(final)和具有不可变性(immutable).可以如果想要了解String的创建我们需要先了解下JVM的内存结构. 1.JVM ...

  3. String str = new String("xyz") 会创建几个对象

    转载:https://blog.csdn.net/andychen314/article/details/50857313 答案是 两个对象,要理解这个,就要知道string类的工作原理.下面来慢慢分 ...

  4. 常量池与方法区以及又读new String对象创建问题

    又拿出这道String str1 = new String("abc");创建几个对象的面试题梳理了一下常量池与方法区的关系,希望能把这两者的关系通过这道面试题说明白 方法区是什么 ...

  5. new String("ab")到底创建了几个对象说明

    new String("ab")到底创建了几个对象? 之前一直被这个问题困扰,网上一些描述的都不是很清楚,自己看了一些资料可算搞清楚了,那就在博客上记录一下吧! String st ...

  6. Java中String对象创建机制详解()

    一String 使用 private final char value来实现字符串存储 二Java中String的创建方法四种 三在深入了解String创建机制之前要先了解一个重要概念常量池Const ...

  7. Java String Pool--String s = new String("a") 到底创建了几个对象?

    本篇重点(tips): 1. String Pool 是以Java 中 String 对象是不可变的这一特性为基础的 2. String Pool是Heap(堆)中的一块特殊空间(JDK 1.7 之前 ...

  8. 关于Java 里的String和对象

    之前老师在课堂上讲过关于Java的引用,但是很遗憾,木有认真听啊,所以就在学习Java的过程中迷惑迷惑...最近好像明白一点Java的引用是怎么回事了.以下仅是我个人的理解,如果不对,还请不吝赐教. ...

  9. 《JavaScript模式》第5章 对象创建模式

    @by Ruth92(转载请注明出处) 第5章:对象创建模式 JavaScript 是一种简洁明了的语言,并没有其他语言中经常使用的一些特殊语法特征,如 命名空间.模块.包.私有属性 以及 静态成员 ...

随机推荐

  1. jmeter性能测试 套路二

    1.一般我们不会通过下面这种去跑性能测试 2.我们会通过这种方式去跑性能测试 3.录制自动化 就用新的 4.录制性能测试  就用

  2. 前端开发【第3篇:JavaScript序】

    JavaScript历史 聊聊JavaScript的诞生 JavaScirpt鼻祖:Bremdan Eich(布兰登·艾奇),JavaScript的诞生于浏览器的鼻祖网景公司(Netscape),发布 ...

  3. plsql developer 恢复默认布局界面

    tools-preferences-appearance-(reset docking,reset toolbars)

  4. Maven 中央仓库及阿里云仓库地址

    Maven 中央仓库地址: 1. http://www.sonatype.org/nexus/ 2. http://mvnrepository.com/ 3. http://repo1.maven.o ...

  5. MySQL(十)之视图

    前言 前面给大家介绍了查询语句,感觉写的还不错的,喜欢的可以去查看.今天给大家分享的是MySQL中的视图. 视图(View):视图是由查询结果形成一张虚拟的表.非临时表,只要不删除的话就会一直存放在磁 ...

  6. Java基础学习——泛型

    一.泛型方法 /** 自定义泛型:自定义泛型可以理解为是一个数据类型的占位符,或者理解为是一个数据类型的变量. 泛型方法: 泛型方法的自定义格式:修饰符<声明自定义泛型>返回值类型 函数名 ...

  7. IOS学习[Swift中跳转与传值]

    Swift中页面跳转与传值: 1.简单方式 首先,Swift的跳转可分为利用xib文件跳转与storyboard跳转两种方法,我这里选择使用storyboard的界面跳转方法. 1.通过在storyb ...

  8. html加载和解析流程

    之前查找资料了解了html的整个渲染过程,对于理解页面加载帮助还是蛮大的,下面我用visio把它画成流程图,便于直观理解 好吧,居然要150字才能发布............ 浏览器渲染过程 浏览器渲 ...

  9. 【Alpha阶段】第一次Scrum Meeting!

    每日任务 1.本次会议为第一次 Meeting会议: 2.本次会议在中午12:30,在第五社区5号楼楼下,召开本次会议为30分钟讨论接下来的任务: 一.今日站立式会议照片 二.每个人的工作 (有wor ...

  10. 201521123082 《Java程序设计》第10周学习总结

    201521123082 <Java程序设计>第10周学习总结 标签(空格分隔): java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. A ...