首先,String是final修饰的、immutable对象,它以一个个字符的方式存储在字符数组中。
其次,String类型创建对象有两种方式:①通过字面量赋值:会先去常量池中查找是否存在相同的字符串,若存在,栈中引用直接指定该字符串;若不存在,在常量池中进行缓存,再将栈中引用指向它。②通过new关键字:每次new出来的都是一个新的对象,在堆中开辟空间进行存储。
又因为,在JDK1.7的HotSpot中,已经把原本放在永久代的字符串常量池移出,JDK8元空间彻底取代永久代,此时字符串常量池还在堆,所以String变量是以字符数组的形式储在堆。
证明,str1和str2,指向的是同一个字符数组:

  1. String str1="ab";
  2. String str2=new String("ab");
  3. Field field=str2.getClass().getDeclaredField("value");
  4. field.setAccessible(true);
  5. char[] sum=(char[]) field.get(str2);
  6. sum[0]='w';
  7. System.out.println(str1);//wb
  8. System.out.println(str2);//wb

test直接演示String对象的创建位置:

  1. package test.string.equal;
  2.  
  3. public class Main {
  4.  
  5. /**
  6. * 创建了三个对象,"helloworld对象创建在常量池中",每次new String()都会创建一个对象在堆内存中。
  7. */
  8. void test() {
         String s1="helloworld";
  9. String s2= new String("helloworld");
  10. String s3= new String("helloworld");
  11. }
  12. /**
  13. * 程序只创建一个字符串对象“Java”,存放在常量池中,所以s1==s2 为true
  14. */
  15. void test1(){
  16. String s1="Java";
  17. String s2="Java";
  18. System.out.println(s1==s2);
  19. }
  20.  
  21. /** 第一个new String("Java"):创建了两个对象,Java创建于常量池中,String对象创建于堆内存中。
  22. * 第二个new String("Java"):由于常量池中有Java对象,所以只需创建一个对象,String对象创建于堆内存中。
  23. * s1与s2分别指向String对象堆内存,所以s1==s2 为false
  24. */
  25. void test2() {
  26. String s1=new String("Java");
  27. String s2= new String("Java");
  28. System.out.println(s1==s2);
  29. }
  30.  
  31. /** 常量的值在编译的时候就确定了,"hello"、"world"都是常量,因此s2的值在编译的时候也确定了,
  32. * s2指向常量池中的"hello world",所以s1==s2为true
  33. *
  34. */
  35. void test3() {
  36. String s1="hello world";
  37. String s2="hello "+"world";
  38. System.out.println(s1==s2);
  39. }
  40.  
  41. /** s4由两个String变量相加得到,不能再编译时就确定下来,不能直接引用常量池中的"helloworld"对象,而是在堆内存中创建一个新的String对象并由s4指向
  42. * 所以s1==s4为false
  43. *
  44. */
  45. void test4() {
  46. String s1="helloworld";
  47. String s2="hello";
  48. String s3="world";
  49. String s4=s2+s3;
  50. System.out.println(s1==s4);
  51. }
  52.  
  53. /** s2与s3被final修饰为宏变量,不可更改,编译器在程序使用该变量的地方直接使用该变量的值进行替代,所以s4的值在编译的时候就为"helloworld"
  54. * 指向常量池中的"helloworld"对象
  55. * 所以s1==s4为true
  56. *
  57. */
  58. void test5() {
  59. String s1="helloworld";
  60. final String s2="hello";
  61. final String s3="world";
  62. String s4=s2+s3;
  63. System.out.println(s1==s4);
  64. }
  65. public static void main(String[] args) {
  66. Main o = new Main();
  67. o.test1();
  68. o.test2();
  69. o.test3();
  70. o.test4();
  71. o.test5();
  72.  
  73. }
  74. }

Java中String对象的存储位置(学习笔记)的更多相关文章

  1. java中String对象的存储位置

    public class Test { public static void main(String args[]) { String s1 = "Java"; String s2 ...

  2. Java中String对象的不可变性

    首先看一个程序 package reverse; public class Reverse { public static void main(String[] args) { String c1=n ...

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

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

  4. JVM 内存分配模型概念和java中各种对象的存储

    JVM 内存分配模型概念 --在工作中可能用到的机会不多,有个概念的了解 --此文是转载某位读者,应该是在阅读了<深入理解Java虚拟机JVM高级特性与最佳实践> 一书后,总结所得.写的不 ...

  5. Javascript中String对象的的简单学习

    第十一课String对象介绍1:属性    在javascript中可以用单引号,或者双引号括起来的一个字符当作    一个字符对象的实例,所以可以在某个字符串后再加上.去调用String    对象 ...

  6. Java中String对象两种赋值方式的区别

    本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...

  7. java中String常量的存储原理

    相关题目(运行结果在代码注释后面) 1. package StringTest; public class test1 { public static void main(String[] args) ...

  8. Java中String对象的创建

    字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改 String类有一个对应的String池,也就是 String pool.每一个内容相同的字 ...

  9. JAVA中 XML与数据库互转 学习笔记三

    要求 必备知识 JAVA基础知识,XML基础知识,数据库的基本操作. 开发环境 MyEclipse10/MySql5.5 资料下载 源码下载   数据库在数据查询,修改,保存,安全等方面与其他数据处理 ...

随机推荐

  1. [转帖]java注解核心知识总结

    java注解核心知识总结 2019-11-01 20:39:50 从事Java 阅读数 2  收藏 文章标签: java注解总结程序员 更多 分类专栏: java 注解   版权声明:本文为博主原创文 ...

  2. 【题解】PERIOD - Period [POJ1961] [SP263]

    [题解]PERIOD - Period [POJ1961] [SP263] 在进入这道题之前,我们需要了解 kmp 算法 不知道的童鞋可以去看一下Silent_EAG(一个可爱的女孩纸)的讲解. 关于 ...

  3. 高性能MYSQL(查询优化)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. mysql存储过程的函数

    存储过程和函数:类似java中的方法 好处:提高代码的重用性 .简化操作.减少了和数据库连接的次数,提高了效率 含义:一组预先编译好的sql语句集合,成批处理语句 语法: 一:创建语法 create ...

  5. springmvc集成shiro后,session、request是否发生变化

    1. 疑问 我们在项目中使用了spring mvc作为MVC框架,shiro作为权限控制框架,在使用过程中慢慢地产生了下面几个疑惑,本篇文章将会带着疑问慢慢地解析shiro源码,从而解开心里面的那点小 ...

  6. ubuntu Ifconfig只显示一个lo

    第一步启动网卡 是网卡未启动 命令: ifconfig -a,显示所有网络接口的信息. ifconfig显示当前激活的网络接口信息 ifconfig eth0 up 启动网卡 ifconfig -a ...

  7. 【转】用Python做股市量化策略投资数据分析

    金融量化分析介绍     本文摘要; 金融量化分析介绍 1.什么是金融量化分析 2.金融量化分析可以干什么 3.为什么将python运用于金融 4.常用库简介 1.什么是金融量化分析 从标题中我们可以 ...

  8. UIPath RPA 自动化脚本 机器人从入门到精通

    本文链接:https://blog.csdn.net/qq_27256783/article/details/93619818 一.UiPath介绍 UiPath 是RPA(Robotic Proce ...

  9. iOS - 屏幕刷新 ADisplayLink

    什么是CADisplayLink CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个r ...

  10. 手写Ajax的意义所在,从青铜到钻石!

    话说菩提祖师打了孙猴子三板子  然后悟空学会72般变化以及一身神通 对待这个问题作为面试者要思考更加深层次的意义 才更能获得认可 实际上写的ajax 很能看出一个的水平 贴几段代码就可以看出水平的高低 ...