重点:
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 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动 释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。 堆内存用来存放由 new ...
java String 使用详解,看完对String 的用法完全掌握
详解Java String字符串
java string用法详解
详解Java的String类型程序,直接运行
031205_【第12章:JAVA IO】_内存操作流笔记.pdf 031206_【第12章:JAVA IO】_管道流笔记.pdf 031207_【第12章:JAVA IO】_打印流笔记.pdf 031208_【第12章:JAVA IO】_System类对IO的支持笔记.pdf 031209_【第12章...
java jdk中string类的源码 ,了解string类的书写,定义和声明
Java设置String字符串编码方法详解
主要介绍了详解Java判断是否是整数,小数或实数的正则表达式,非常具有实用价值,需要的朋友可以参考下。
Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解2:Queue和LinkedList Java集合详解3:Iterator,fail-fast机制与比较器 Java集合详解4:HashMap和HashTable Java集合详解5:深入...
详解json string转换为java bean及实例代码.docx
北京动力节点-Java编程零基础教程-119-Java基本语法-方法详解-方法的调用过程-方法调用过程中栈内存的变化.avi 北京动力节点-Java编程零基础教程-120-Java基本语法-方法的重载-什么是方法重载.avi 北京动力节点-...
在本文中,我们学习了Java String类的getBytes()方法,它允许将字符串转换为字节数组,并且可以指定字符编码方式。通过实例和代码演示了使用平台默认字符编码和指定UTF-8、ISO-8859-1字符编码的情况。getBytes()方法...
主要介绍了Java Date与String的相互转换详解的相关资料,需要的朋友可以参考下
主要介绍了Java List转换成String数组几种实现方式详解的相关资料,需要的朋友可以参考下
本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...
JAVA断言技术详解,1、What will happen when you attempt to compile and run the following code? (Assume that the code is compiled and run with assertions enabled) 1. public class AssertTest 2. { 3. ...
<web-app xmlns="http://java.sun.... 若在Servlet可以使用下列方法来获得:String param_name=getServletContext().getInitParamter("param_name"); --> ... ... ...
主要介绍了Java中String类型与默认字符编码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
内容讲解了Java的字符串实现String和StringBuffer,以及对应的方法,同时包含讲解的测试例子。