包装类
1. 为什么需要包装类
众所周知,我们Java语言的特性是面向对象。所以在Java中任何东西都是以类而存在的,但是我们的基本数据类型,却不属于类。在一些应用的场景下,它限制了我们的使用。比如我们无法使用Object里的方法呀(因为任何类都继承自Object)。无法参与转型,泛型,反射等使用。Java的开发人员为了弥补这个缺陷,于是为我们的八大数据类型各种设计了一个包装类,将基本数据类型和一些方法包封装起来成为保证类,这在以后的数据库对应实体类中会体现。下面是八大基本数据类型对应的包装类。
基本数据类型 | 包装类 |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
2. 包装类和基本数据类型的相互转换
装箱:基本类型–>包装类型
拆箱:包装类型–>基本类型
2.1 jdk5前是手动装箱和拆箱
2.1.1 手动装箱 int–>Integer
int n=100;
Integer integer=new Integer(n);
Integer integer1=Integer.valueOf(n);
2.1.2 手动拆箱 Integer–>int
int i=integer.intValue();
2.2 jdk5后,自动装箱和自动拆箱
2.2.1 自动装箱 int–>Integer
Integer integer = 100;
//底层使用的仍是Integer.valueOf(100);
2.2.2 自动拆箱 Integer–>int
int n = integer;
//底层使用的仍是intValue()方法
3 包装类型和String类型的相互转换
以 Integer 和 String 转换为例,其它类似:
3.1 包装类(Integer)->String
Integer i = 100;//自动装箱
//方式 1
String str1 = i + "";
//方式 2
String str2 = i.toString();
//方式 3
String str3 = String.valueOf(i);
3.2 String -> 包装类(Integer)
String str4 = "12345";
Integer i2 = Integer.parseInt(str4);//使用到自动装箱
Integer i3 = new Integer(str4);//构造器
4 Integer 类和 Character 类的常用方法
System.out.println(Integer.MIN_VALUE); //返回最小值
System.out.println(Integer.MAX_VALUE);//返回最大值
System.out.println(Character.isDigit('a'));//判断是不是数字
System.out.println(Character.isLetter('a'));//判断是不是字母
System.out.println(Character.isUpperCase('a'));//判断是不是大写
System.out.println(Character.isLowerCase('a'));//判断是不是小写
System.out.println(Character.isWhitespace('a'));//判断是不是空格
System.out.println(Character.toUpperCase('a'));//转成大写
System.out.println(Character.toLowerCase('A'));//转成小写
5 Integer 类面试题总结
总结:new出来的一定是不同对象
存在基本数据类型的比较,那就是比较数值是否相等
如果值在-128~127之内那么是直接返回数组中的值,如果大于这个范围则会new一个新的Integer对象。
//示例一
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2);//F
//示例二
Integer i3 = new Integer(128);
Integer i4 = new Integer(128);
System.out.println(i3 == i4);//F
//示例三
Integer i5 = 127;//底层 Integer.valueOf(127)
Integer i6 = 127;//-128~127
System.out.println(i5 == i6); //T
//示例四
Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7 == i8);//F
//示例五
Integer i9 = 127; //Integer.valueOf(127)
Integer i10 = new Integer(127);
System.out.println(i9 == i10);//F
//示例六
Integer i11=127;
int i12=127; //只要有基本数据类型,判断的是值是否相同
System.out.println(i11==i12); //T
//示例七
Integer i13=128;
int i14=128;
System.out.println(i13==i14);//T
6. String 类的理解和创建对象
- String对象用于保存 字符串,也就是一组字符序列
- 字符串常量对象是用双引号包括的字符序列例如:“hello”,“你好” 等
- 字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节。
6.1 String类的常用构造器演示
String s1 = new String();
String s2 = new String(String original);
String s3 = new String(char[] a);
String s4 = new String(char[] a,int startIndex,int count) ;
String s5 = new String(byte[] b);
6.2 创建String对象的两种方式
方式一:直接赋值 String s ="xiaolvbobo";
方式二:调用构造器 String s = new String("xiaolvbobo");
6.3 两种创建String对象的区别
- 方式一:先从常量池查看是否有"xiaolvbobo"数据空间,如果有,直接指向;如果没有则重现创建然后指向。s最终指向的是常量池的空间地址。
- 方式二:先在堆中创建空间,里面维护了value属性,指向常量池中的"xiaolvbobo"空间,如果常量池没有"xiaolvbobo",重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。
6.3.1 测试题
String a=new String("abc");
String b=new String("abc");
System.out.println(a.equals(b));//T
System.out.println(a==b);//F
equals方法比较数值,ab的数据值都是"abc" 是相同的
但是a和b指向的是堆中的两个不同地址,所以a和b并不相等,只是a和b指向的堆地址中维护的value属性相同。
7. String 类的常见方法
常见的api调用,所见即所得
- equals 区分大小写,判断内容是否相等
- equalsIgnoreCase 忽略大小写的判断内容是否相等
- length 获取字符的个数,字符串的长度
- indexOf 获取字符在字符串中第一次出现的索引,索引从0开始,如果找不到返回-1
- lastIndexOf 获取字符在字符串中最后一次出现的索引,索引从0开始,如果找不到返回-1
- substring 截取指定范围的子串
- trim 去前后空格
- charAt 获取某索引处的字符,注意不能使用Str[index]这种方式
7.1 String 相关的其他方法
toUpperCase 转换成大写
toLowerCase 转换成小写
concat 拼接字符串
replace 替换字符串
split 分割字符串
compareTo 比较两个字符串的大小,如果前者大,则返回正数,后者大则返回负数,如果相等,返回0
toCharArray 转为char数组
7.1 String 相关的其他方法
toUpperCase 转换成大写
toLowerCase 转换成小写
concat 拼接字符串
replace 替换字符串
split 分割字符串
compareTo 比较两个字符串的大小,如果前者大,则返回正数,后者大则返回负数,如果相等,返回0
toCharArray 转为char数组