java 内存分配及String类 内存分配,个人笔记
来源:互联网 发布:淘宝写给顾客的感谢信 编辑:程序博客网 时间:2024/04/29 19:24
个人见解
栈需要知道被存储对象(不管是对象还是对象引用)的大小,而堆不需要。
因此对象引用存在栈中,而对象本身存储在堆中。
如同一本书,栈是目录这样的一个角色,堆是内容。
有了这样的思路,很容易推断出你想要的答案。
原子类型,数据就是自身。因此直接存在栈中。
栈内存
堆内存
基础类型,对象引用(堆内存地址)
由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 booleanequals(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 内存分配及String类型详解
- Java 内存分配及String类型详解
- Java内存分配及String详解
- Java笔记之数组及内存分配
- java String 类的内存分配
- Java中String类的内存分配
- Java中String类的内存分配
- Java中String类的内存分配
- JAVA类内存分配
- JAVA变量及内存分配
- java内存分配及释放
- JAVA变量及内存分配
- JAVA 学习笔记-内存分配
- JAVA学习笔记--内存分配
- java内存结构及内存分配详解
- java内存分配之个人总结
- c++ string 内存分配
- 外汇交易纠纷NFA FSA投诉方法
- 一句话经验
- iOS tableView事件方法
- C语言-设计模式
- 各种系统架构图及其简介
- java 内存分配及String类 内存分配,个人笔记
- java学习日志四 OnclickListener
- http://poj.org/problem?id=1475(Pushing Boxes)
- java的代理类
- 面试题之堆栈队列系列一:设计包含min函数的栈
- Linux 进程的基本控制—atexit、on_exit函数、文件锁
- 深入浅出Node.js(五):初探Node.js的异步I/O实现
- 添加支持状态栏一键锁屏教程,可替代电源键(以泛泰A820L官方4.0rom为例,其他可参考)
- Bluetooth in Android 4.2 and 4.3(一):综述