zoukankan      html  css  js  c++  java
  • String一点小发现

    今天面试官问了几个关于java内存方面的问题,其中有一个是关于内存重复使用的。突然想到java中String比较特殊的地方,根据自己的理解所以稍微记录一下以免遗忘。

    对于下面这个小程序:

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String s1 = "123";
            String s2 = "123";
            String s3 = new String("123");
            String s4 = new String("123");
            System.out.println(s1 == s2); //true
            System.out.println(s3 == s4); //false
        }
    •  执行s1 == s2时,返回的是true。
      • 是因为在String源码中,String类的私有变量有两个,一个是char型数组,用来存放字符串本身;一个是hash,用来保存传入的字符串在内存中的哈希码;
      • s1和s2都是local variable局部变量,都是存放在stack中,因此他们的哈希码是一样的,所以java在为s1, s2分配内存时,实际分配的是栈中同一块内存,所以结果返回true;
      • 它实际是String.intern()方法起作用了。intern()方法是一个Native方法,作用是,如果字符串常量池中已经包含一个此String对象的字符串,则返回池中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。
    •  执行s3 == s4时,返回的是false。
      • 是因为它们都是用的new关键字,新建的是Dynamic variable动态变量,java首先为s3,s4在stack上各分配一个指针地址,表示有两个动态变量声明了,然而他们实际存储的东西放在heap中。
      • s3 == s4语句实际判断的是他们在heap中的地址,所以结果自然是false咯。

                     

    •  java的内存存储机制:
      • static, constant型的变量都存储在一些特殊的位置,一般在内存中从地址最低的地方开始使用;
      • dynamic variable型的变量(即用new关键字生成的变量、对象)都存储在Heap中,他们存储的内容实际上是地址,地址指向的才是数据真正的存储地方,数据一般都放在栈中;
        • heap紧跟在static、constant变量的后面,地址逐渐增大,可以从小地址向大地址动态增大;
      • local variable型的变量都存储在stack中
        • 为了不浪费内存空间又不与heap地址冲突,stack地址一般是从最大地址开始逐渐减小,方便heap和stack双方扩充。

     

  • 相关阅读:
    Linux 文件管理篇(一 档案读写)
    Linux 任务管理篇(一)
    Mysql 视图简介
    MySql 使用正则表达式查询
    mysql 插入、更新与删除数据
    mysql 多表查询
    mysql 单表查询
    Java抽象类与接口
    maven小结
    shiro 进行权限管理 —— 使用BigInteger进行权限计算获取菜单
  • 原文地址:https://www.cnblogs.com/little-YTMM/p/5469275.html
Copyright © 2011-2022 走看看