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双方扩充。

String一点小发现的更多相关文章
- 关于PHP魔术方法__call的一点小发现
好久没有上博客园写文章了,今晚终于有点空了,就来写一下昨天的一点小发现. 我自己所知,C++,Java的面向对象都有多态的特点,而PHP没有,但PHP可以通过继承链方法的重写来实现多态的属性.而魔术方 ...
- 【自动化测试】robot framwork的一点小发现
我们在搭建完robotframwork框架并开始打开火狐浏览器的时候,总会碰到打不开浏览器的问题.这次,分享一个常见的小问题. 这个问题呢,是因为火狐的版本更新频繁,导致selenium的版本跟不上导 ...
- 【安全性测试】Android测试中的一点小发现
在执行某个项目中的APP测试发现的两个问题,自然也是提供参考,作为经验记录下来. 一.通过apk的xml文件获取到某项目APP的账号和密码 使用eclipsel或者drozer,获得apk的xml文件 ...
- 关于Datastage资料库的一点小发现
这里的资料库,指的是Datastage Metadata层,在Datastage7.5以后,需要在安装Datastage时安装一个数据库用于存放用户数据. 昨天领导要求安装Datastage集群/高可 ...
- 关于win8开发的一点小总结
我今天做画面的时候,发现了一点小问题. 我在xmal文件里面加了一个CheckBox控件,设置IsChecked属性为True,并添加了Checked事件.Checked事件里面有对另外一个TextB ...
- 【手记】小心在where中使用NEWID()的大坑 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题 【C#】组件分享:FormDragger窗体拖拽器 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
[手记]小心在where中使用NEWID()的大坑 这个表达式: ABS(CHECKSUM(NEWID())) % 3 --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它 ...
- HTML5版的String Avoider小游戏
HTML5版的String Avoider小游戏 http://www.newgrounds.com/portal/view/300760 蛮简单也蛮考验耐心,从游戏起始点移动鼠标到终点位置,鼠标移动 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解
asp.net core 内置DI容器的一点小理解 DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...
- C与C++在形參的一点小差别
先看一下以下的代码: int fun(a,b) int a; int b; { return 10; } void main(int argc, char ** argv) { fun(10); re ...
随机推荐
- inline-block去掉空白距离的方法
一.现象描述:inline-block形式水平呈现的元素,换行显示或空格分割的情况下,元素之间会有间距,实例如下: 使用CSS将行内元素的display设置为inline-block时,也会出现间隔: ...
- 【python cookbook】【数据结构与算法】20.将多个映射合并为单个映射
问题:在逻辑上将多个字典或映射合并为一个单独的映射结构,以此执行某些特定的操作,比如查找值或者检查键是否存在 解决方案:利用collections模块中的ChainMap类 ChainMap可接受多个 ...
- Creater中选择一行的方法
1. 在表布局中增加一单选钮列,给单选钮的属性name任意设定一个值.2. 选择单选钮对应列,将其selectID设为单选钮的ID;将onclick设为setTimeout('initAllRow ...
- powershell: 生成随机字符串
ASCII范围内的 获取6个随机字符(字母和数字) 48到57是数字0-9,powershell的范围操作符是..,和Perl 5的一样, 所以 48..57就是指(48 49 50 51 52 53 ...
- 使用Jconsole监控weblogic的配置方法
在项目中发现full gc非常频繁.达到了每分钟13次.我怀疑可能会有内存泄露.于是在晚上找了内存泄露的资料. 内存长期占用并导致系统不稳定一般有两种可能: 1. 对象被大量创建而且被缓存,在旧的对象 ...
- JavaScript中统计Textarea字数并提示还能输入的字符
<span style="font-size:18px;"><script language="javascript"> functio ...
- Apache httpd和JBoss构建高可用集群环境
1. 前言 集群是指把不同的服务器集中在一起,组成一个服务器集合,这个集合给客户端提供一个虚拟的平台,使客户端在不知道服务器集合结构的情况下对这一服务器集合进行部署应用.获取服务等操作.集群是企业应用 ...
- DockerUI安装、使用
虽然大多数开发人员和管理人员通过命令行来创建及运行Docker容器,但Docker的Remote API让他们可以通过充分利用REST(代表性状态传输协议)的API,运行相同的命令.这时,Docker ...
- 如何修改ECSHOP后台管理中心的Title信息
下图中红色圈定的部分就是本次修改要改的地方 修改方法其实很简单的:打开语言包文件 /languages/zh_cn/admin/common.php 将 $_LANG['app_name'] = ' ...
- sql 2000以及2005以上获取数据库中所有的表(不包括系统表)
---------------------------------------------------------------------------- --sql 2005以上数据库 --- 获取数 ...