- 一、包装类
- 1.什么是包装类
- 2、为什么需要包装类
- 3、自动装箱
- 4、自动拆箱
- 5、包装类与封装的渊源
- 6、常见应用
- 二、字符串类
- 1、String
- (1)定义一个字符串
- (2)被final修饰的String类
- (3)intern()
- (4)经典面试题
- (4)String类的常用方法
- 2、BufferedString
- (1)int length()
- char charAt(int)
- (2)boolean isEmpty()
- boolean equals(Object)
- boolean equalsIgnoreCase(String)
- 三、枚举类
每个基本数据类型都有其对应的包装类(boolean没有)
Byte Character Short Integer Long Float Double2、为什么需要包装类
包装类其实就是基本数据类型经过封装后的类。
包装类提供了很多方法,方便我们调用。
在后面学到的泛型里,只支持对象,而基本数据类型没有对象,因此我们需要包装类。
一提到包装类,就自然而然的想到了装箱与拆箱。自动装箱和自动拆箱都是jdk5以后实现的,现在我们使用基本都是使用自动装箱和拆箱。
可以发现,包装类中有很多方法都是被static修饰的,可以通过类名直去调用,同时也提供了一些常量。
基本数据类型–>引用类型
Integer i = 100; //自动装箱
有自动装箱就有一个概念叫做手动装箱
int i = 10; //手动装箱 Integer integer = Integer.valueOf(i);4、自动拆箱
Integer integer = 10; //自动装箱 int i = integer; //自动拆箱
手动拆箱
Integer integer = 10; int i = integer.intValue(); //手动拆箱5、包装类与封装的渊源
可以发现拆箱和装箱的方法其实和封装的get方法和set方法很相似。
而整形的数据量是有限的,
最大值是127,最小值是-128,这些常量都定义在了缓存里,会从缓存里取。
Integer i1 = 30; Integer i2 = 30;
这里的i1和i2指向同一个对象,因为他们本质都是cache里的30。
6、常见应用- 数值型装字符串型
这个很常用
String s = Integer.toString(10); //数值转字符 int i = Integer.parseInt(s); //字符转数字
- 进制转换
public static String toBinaryString(int i) {
return toUnsignedString0(i, 1);
}
二、字符串类
1、String
(1)定义一个字符串
public class T {
public static void main(String[] args) {
String s1 = "String";
String s2 = new String("String");
System.out.println(s1 == s2); // 结果为false
}
}
s1和s2的值都是“String‘,但是他们指向不同的对象。
这两种方式创建字符串,他们的区别是
s1指向的是方法区中的常量池,我们在创建s1的时候,会先查看常量池里是否有”String“,如果没有,会在常量池里创建一个”String“,然后指向他;如果常量池里已经存在了”String“,那么会直接指向他。
而s2不管常量池里有没有,他会创建一个空间,里面的值是”String“。
public class T {
public static void main(String[] args) {
String s1 = "String";
String s2 = "String";
System.out.println(s1 == s2); //true
String s3 = new String("String");
String s4 = new String("String");
System.out.println(s3 == s4); //false
System.out.println(s2 == s3); //false
}
}
只要是new出来的,肯定就是一个全新的对象了。
(2)被final修饰的String类
String一经创建赋值,就不可修改
String被final修饰,所以这个类不可被子类继承,不可被修改。
在String的方法中,有一些方法也被final修饰,这些方法是不可被子类重写的,因为String不可能拥有子类的,所以不用担心方法被修改的问题。
public class T {
public static void main(String[] args) {
String s1 = "String";
String s3 = new String("String");
String s4 = new String("String");
s1 = "hello";
s3 = s4;
}
}
看上去字符串的量都被修改了,为什么还说字符串不能被重新赋值呢?
其实确实是没有重新赋值的,这个叫s1的东西原来他的引用指向了方法区的常量池里的”String“,现在他只是在方法区里的常量池里开辟了一个新的空间,里面放了”hello“,我们现在让这个s1指向了这块新开辟的空间而已。之前的”String“还存在,没有被改变,如果以后没有任何引用指向他,而且不再被调用,他就会被java的垃圾回收机制回收了。
同样的s3指向了s4指向的空间。
如果一个字符串在常量池中出现过,返回该字符串,如果字符串为空或者不存在常量池里,那么返回空字符串。
public class T {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "hello" + "world";
String s4 = s1 + "world";
String s5 = s1 + s2;
String s6 = (s1 + s2).intern();
}
}
s3在编译阶段,jdk会对代码进行优化,把他变成
String s3 = "helloworld";
s4和s5
通过设置断点debug可以发现,他会先创建s1这个对象(s1已经创建过了,所以他会找到他)。之后我们可以发现他的底层是通过append连接的。只要右边有变量,就会在堆中new一个对象。(底层用到了StringBuild类)
返回字符串的长度
char charAt(int)获取对应索引位置的字符
(2)boolean isEmpty()判断字符串是否为空
boolean equals(Object)判断两个字符串的内容是否一致
boolean equalsIgnoreCase(String)判断两个字符串内容是否一致,不考虑大小写
三、枚举类


