java string 空间_java堆与栈 java String分配内存空间(详解)
重点:
1、当比较包装类里面的数值是否相等时,用equals()方法;
2、当测试两个包装类的引用是否指向同一个对象时,用==。
可以这样理解吗?
2.1、栈中的两个包装类的引用变量引用栈中的一个对象
(String s1=“abc”;
String s2=“abc”;
)
2.2、栈中的两个包装类引用变量引用堆中的一个对象
(String s1=new String("abc");
String s2=s1;
)
栈内存
堆内存
基础类型,对象引用(堆内存地址)
由new创建的对象和数组,
存取速度快
相对于栈内存较慢
数据大小声明周期必须确定
分配的内存由java虚拟机自动垃圾回收器管理。动态分配内存大小
共享特性
栈中如果有字符串,则直接引用
如果没有,开辟新的空间存入值
每new一次在堆内存中生成一个新的对象。
创建之后值可以改变
String类声明后则不可改变
一、栈内存
基础类型int, short, long, byte, float, double, boolean, char和对象引用
栈的共享特性
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
1、编译器先处理String str1 = "abc";它会在栈中创建一个变量为str1的引用,然后查找栈中是否有abc这个值,如果没找到,就将abc存放进来,然后将str1指向abc。
2、 接着处理String str2 = "abc";在创建完b的引用变量后,因为在栈中已经有abc这个值,便将str2直接指向abc。这样,就出现了str1与str2同时均指向abc的情况。
二、堆内存
new、newarray、anewarray和multianewarray等指令建立
要 注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。 由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。
三、 == 内存地址比对
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true str1和str2同时指向 栈内存 中同一个内存空间
String str3 = "abc";
String str4 = new String("abc") ;
System.out.println(str3 == str4); //flase str3值在栈内存中,str4值在堆内存中
String hello = "hello" ;
String hel = "hel" ;
String lo = "lo" ;
System.out.println(hello == "hel" + "lo") ; //true
//两个常量相加,先检测栈内存中是否有hello如有有,指向已有的栈中的hello空间
System.out.println(hello == "hel" + lo) ; //flase
System.out.println(hello == hel + lo) ; //flase
//lo是在常量池中,不检查栈内存,在堆中产生一个新的hello
四、 equals 值进行比对
public boolean equals(Object anObject)
将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
String str5 = "abc";
String str6 = new String("abc") ;
System.out.println(str5.equals(str6)); //true str5的值str6的值比对
五、 intern 栈中值的内存地址
Public String intern()
当调用 intern 方法时
1、如果池已经包含一个等于此 String 对象的字符串(用equals(Object) 方法确定),则返回池中的字符串。
2、将此 String 对象添加到池中,并返回此 String 对象的引用。
String s7 = new String("abc") ;
String s8 = "abc" ;
System.out.println(s7 == s7.intern()) ;//flase;
System.out.println(s8 == s7.intern() );//true
1.检查栈内存中有没有abc对象如果有
2.将s7指向pool中abc
java string 空间_java堆与栈 java String分配内存空间(详解)相关推荐
- c语言分配多一个字符空间,关于C语言动态给字符串分配内存空间问题
在动态分配的空间中如何输入字符串,关于C语言动态给字符串分配内存空间的问题相信很多朋友都不太了解,下面维维带来相关解答,赶紧看看吧. 用malloc来分配内存空间. 即输入几个字节的字符 系统就自动帮 ...
- java 值对象_java 中设计模式(值对象)的实例详解
java 中设计模式(值对象)的实例详解 应用场景:在Java开发时,需要来回交换大量的数据,比如要为方法传入参数,也要获取方法的返回值,该如何能更好的进行数据的交互?这个时候就需要用到我们的值对象设 ...
- java判断或_Java判断用户名和密码是否符合要求过程详解
这篇文章主要介绍了Java判断用户名和密码过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 假设在某仓库管理系统的登录界面中需要输入用户名和密 ...
- java metadata 使用_java 查询oracle数据库所有表DatabaseMetaData的用法(详解)
一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMet ...
- java手机模式_Java使用建造者模式实现办理手机套餐功能详解
本文实例讲述了Java使用建造者模式实现办理手机套餐功能.分享给大家供大家参考,具体如下: 一.模式定义 建造者简单理解就是造东西,只不过建造者模式建造的不是一个简单的东西,是一个比较复杂的东西. 二 ...
- java正则 环视_Java正则环视和反向引用功能与用法详解
本文实例讲述了Java正则环视和反向引用功能与用法.分享给大家供大家参考,具体如下: 环视 1.环视概念 环视,又称为零宽断言,简称断言. 环视强调位置(前面或后面),必须匹配环视表达式,才能匹配成功 ...
- java读取日志_Java实时监控日志文件并输出的方法详解
前言 最近有一个银行数据漂白系统,要求操作人员在页面调用远端Linux服务器的shell,并将shell输出的信息保存到一个日志文件,前台页面要实时显示日志文件的内容.这个问题难点在于如何判断哪些数据 ...
- java steam说明_Java 8 Steam API map和flatMap方法使用详解
一对多的提取内容用flatmap,一对一用map java 8 stream api 中有两个方法map和flatMap非常实用,应用场景也非常广泛,能极大提升编程效率.下面我们详细介绍一下这两个方法 ...
- java手势识别技术_Java乔晓松-android中的手势识别的详解
对于android中的手势识别,效果如下图所示: 模拟器中有个可以添加手势的工具Gestures Builder,可以添加手势如下图所示: 当添加手势成功后,会在Sdcard上产生保存的手势的文件ge ...
- java同步关键字_Java中synchronized关键字修饰方法同步的用法详解
Java的最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问. 每一个用synchronized关键字声明的方法都是临界区.在Java中,同一个对象的临界区,在同一时间只有 ...
最新文章
- MATLAB信号处理工具箱函数列表分类
- linux安装x11鼠标主题
- Linux压缩打包命令
- android 记录路线轨迹_基于百度地图SDK记录运动轨迹
- java 中的单引号报错_shell中的单引号,双引号,反引号
- 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列
- 浅谈分布式计算的开发与实现(二)
- ubuntu 1404部署tomcat7
- 强化学习平台安装 Mujoco、mujoco-py、gym、baseline
- 无线测温系统应用 对变电所进行实时的在线监测 生产高效安全
- 双目摄像头三种标定方式标定结果对比
- 【转载】SQL注入进阶
- 解决笔记本光驱位硬盘休眠卡顿问题
- 分支和循环语句---循环语句
- 电大计算机专业英语形成性考试,电大资源网《管理英语1》形成性考核册作业题目和答案2018年...
- A Simple but Effective Pluggable Entity Lookup Table for Pre-trained Language Models翻译
- 关于CSDN获取博客内容接口的x-ca-signature签名算法研究
- 使C#语言编程更加高效的伎俩
- 【木棍问题——回溯与分支限界算法(使用C语言解决)】
- 网络安全实验室--上传关
热门文章
- visual studio怎么用_自从用了敏捷,天天在开会?4大Scrum会议如何才能有意义?...
- 使用二分查询数组中的某一个元素,简单示例,详细注解
- python中unique函数_Pandas Series.unique()用法介绍
- r语言 rgl 强制过程中_R语言中的方差分析方法汇总
- leetcode数组汇总_LeetCode刷题实战74:搜索二维矩阵
- linux zip压缩比1000,linux下压缩工具总结与使用(参考私房菜)
- java welcome-file_通过JSF项目中的welcome-file设置默认主页
- fluentmigrator连接mysql_如何利用FluentMigrator实现数据库迁移
- 24、List三个子类的特点
- 208-实现 Trie (前缀树)