一、字符串
String 是一个final类 不能复写 不能有子类
1. 用双引号引起的都是字符串对象 , 该对象位于常量池中
2. 字符串中==与equals的区别
1--> String s1= new String("abc");
String s2= new String("abc");
2--> String t1 = "abc";
String t2 = "abc";
s2 = s2 + " java";
t2 = t2 + " java";
`① s1 == s2 结果是false 因为创建了两个字符串对象,s1 s2分别指向堆中的两个对象
② s1.equals(s2)结果为true 因为String已经对Object类的equals方法进行了复写,
Object 的equals相当于==
③ s1 == t1 结果为false 因为堆中的字符串对象的地址跟常量池地址不一样
④ s1.equals(t1) 结果为true 内容相等
⑤ t1 == t2 结果为true 因为t1 t2指向了常量池中同一个字符串常量
⑥ t1.equals(t2) 结果为true 内容相等
⑦ s2 跟 " java"连接后指向常量池中新建的 "abc java"的字符串常量,s2原来指向的堆内存中的 abc"对象随垃圾回收器回收
⑧ t2 跟" java"连接后也指向常量池中的"abc java",t2原来指向的常量池中的"abc"还存在于常量 池中
上面用new String()创建的字符串不是常量,不能在编译期就确定,所以new String()
创建的字符串不放入常量池中,他们有自己的地址空间,String 对象(内存)的不变性机制会
使修改String字符串时,产生大量的对象,因为每次改变字符串,都会生成一个新的String。
java 为了更有效的使用内存,常量池在编译期遇见String 字符串时,它会检查该池内是否已
经存在相同的String 字符串,如果找到,就把新变量的引用指向现有的字符串对象,不创建
任何新的String 常量对象,没找到再创建新的。所以对一个字符串对象的任何修改,都会产生
一个新的字符串对象,原来的依然存在,等待垃圾回收。
一个字符串的例子
class StringDemo
{
public static void main(String[] args)
{
/*字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。
因为 String 对象是不可变的,所以可以共享。例如: */
String str = "abc";
// 等效于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
//空字符串的定义
//String str1 = "";等同于
String str1 = new String();
//字符串一旦被初始化就不可以被改变
String s = "abc";
s = "cde";//abc仍然在内存中 s由指向"abc"改为指向"cde"字符串
//"=="与equals()的区别
String s1 = "abc";//s1代表一个对象,
String s2 = new String("abc");//s2在内存中有两个对象 ,
String s3 = "abc";
System.out.println(s1==s2); //返回fault ,s1与s2分别指向两不同对象,两对象在内存中不同位置
System.out.println(s1.equals(s2));//,返回true,String复写了Object类的equals方法,该方法比较的是字符串是否相同
System.out.println(s1==s3); //返回true,s1与s3指向的是同一个对象
}
}
3. 常量池
3.1. 什么是常量池?
常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于 类,方法,接口 , 字段等中的常量,也包括java中用得很多的字符串常量,如String s = "java"
故认为常量池是JVM在方法区中为它们开辟一块特殊的内存空间.常量池中除了包含代码中所定
义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值外,还包 含一些 以 文本形式出现的符号引用,比如:
①类或接口的全限定名,
②超类的全限定名,
③父接口的全限定名,
④类字段名和所属类型名,
⑤类方法名和返回类型名、以及参数名和所属类型名,
⑥字符串字面值。
常量池技术是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个
出来(如果池中没有则创建一个)则在需要重复创建相等变量时节省了很多时间和空间。常量池其实也就是一个内存空间,不同于使用new关键字创建的对象内存空间
3.2. 八种基本类型的包装类和对象池
java中基本类型的包装类的大部分都实现了常量池技术,这些类是
Byte,Short,Integer,Long,Character,Boolean,
另外两种浮点数类型的包装类则没有实现 , 另外 Byte,Short,Integer,Long,Character这5种前四种整型的包装类也只是在-128~127范围内,Character在0~127范围内时才可使用对象 池,也即对象不负责创建和管理大于127或小于-128的这些类的对象。
注意: 基本数据类型使用常量池技术的前提是用自动装箱装将基本类型数据到包装类的对象,通 过new方法包装的不会放常量池中,能使用常量池的是通过自动装箱包装的Boolean,或通 过自动装箱包装的Byte,Short,Integer,Long,Character且范围在小于等于127 的包装类数 据
3.2.1. 基本数据类型对象的包装类
boolean Boolean
byte Byte
char Character
short Short
int Integer
long Long
float Float
double D