目录
一、包装类
针对八种基本数据类型相应的引用类型–包装类
1. 分类
2. 包装类和基本数据转换
- jdk5前的手动装箱和拆箱方式(装箱:基本类型->包装类型 ;拆箱:包装类型->基本类型)
---手动装箱
int n = 100;
Integer integer = Integer.valueOf(n);
Integer integer = new Integer(n);
---手动拆箱
int n = integer.intValue();
- jdk5以后(含jdk5)的自动装箱和拆箱方式
---自动装箱
Integer integer = n;
---自动拆箱
int n = integer;
- 自动装箱底层调用的是valueOf方法
注意示例
Object obj = true ? new Integer(1) : new Double(2.0);
System.out.println(obj); //1.0⚠️ 三元运算符是一个整体
3. 包装类和String类型转换
包装类(Integer) —> String
Integer integer = 1;
//1⃣️
String s = integer + "" ;
//2⃣️
String s = integer.toString();
//3⃣️
String s = String.valueOf();
String —> 包装类(Integer)
String s = "123";
//1⃣️
Integer integer = Integer.parseInt(s);
//2⃣️
Integer integer = new Integer(s);
4. valueOf源码(Integer)
- 看范围,-128~127直接返回
- 否则,new Integer(i);
@IntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Integer integer = 128;
int i =128;
System.out.println(integer == i);//true⚠️
//只要有基本数据类型,就判断值
5. 包装类-常用方法
- Integer.MIN_VALUE;-----------返回最小值
- Integer.MAX_VALUE;----------返回最大值
- Character.isDigit(‘a’);----------判断是否为数字
- Character.isLetter(‘a’);--------判断是否为字母
- Character.isUpperCase(‘a’);—判断是否大写
- Character.isLowerCase(‘a’);—判断是否小写
- Character.isWhitespace(‘a’);—判断是否空格
- Character.toUpperCase(‘a’);—转换成大写
- Character.toLowerCase(‘a’);—转换成小写
二、String类
1. 基本介绍
- String对象用于保存字符串,一组字符序列
- 字符串常量对象是用双引号括起的字符序列
- 字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
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 );
2. 创建String对象
方式一:直接赋值
String s = " abc ";
- 先从常量池查看是否有"abc"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址
方式二:调用构造器
String s = new String(" abc ");
- 先在堆中创建空间,里面维护了value属性,指向常量池的"abc"空间,如果常量池没有"abc"重新创建;如果有,直接通过value指向。s最终指向的是堆中的空间地址
内存图
3. String类-常用方法
- equals--------------内容是否相等(区分大小写)
- equalsIgnoreCase—内容是否相等(忽略大小写)
- length---------------获取字符个数,字符串长度
- indexOf-------------获取字符在字符串中第一次出现的索引
- lastindexOf----------获取字符在字符串中最后一次出现的索引
- substring-----------截取指定范围的子串
- trim-----------------去前后空格
- charAt--------------获取某索引处的字符
4. 注意示例
String a = "abc";
String b = new String("def");
System.out.printlb(a == b.intern());//T
//intern方法最终返回的是常量池的地址
String s = "hello";
s = "haha";
---创建了2个对象⚠️
String s = "hello" + "hi";
---创建了1个对象⚠️编译器做了优化,直接生成"hellohi"
String a = "hello";
String b = "hi";
String c = a + b;
---变量相加,在堆//1⃣️
String d = "hello" + "hi";
---常量相加,在池//2⃣️
三、StringBuffer类
1. 基本介绍
- java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删
- 很多方法与String相同,单StringBuffer是可变长度的
- StringBuffer是一个容器
- StringBuffer实现了Serializable,即其对象可串行化(对象可以网络连接,可以保存到文件)
- 直接父类是AbstractStringBuild,在父类value数组存放字符串内容,放在堆中
- StringBuffer是一个final类,不能被继承
2. String -VS- StringBuffer
- Sting保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低
- StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer类的更新实际上就是更新内容、不更改地址,效率高
3. String类型与StringBuffer类型转换
String —> StringBuffer
String s = "hello tom";
//1⃣️
StringBuffer sb = new StringBuffer(s);
//2⃣️
StringBuffer sb = new StringBuffer();
sb = sb.append(s);
StringBuffer —> String
StringBuffer sb = new StringBuffer("hi");
//1⃣️
String s = sb.toSring();
//2⃣️
String s = new String(sb);
4. StringBuffer类-常用方法
- 增:append
- 删:delete(start, end)
- 改:replace(start, end, string)—左闭右开
- 查:indexOf()
- 插:insert()
- 获取长度:length()
5. 注意示例
String s = null;
StringBuffer sb = new StringBuffer();
sb.append(s); //输出"null"⚠️
StringBuffer sb = new StringBuffer(null); //❌先.length()直接报错
四、StringBuilder类
1. 基本介绍
- 可变的字符序列,此类提供一个与StringBuffer兼容的API,但不能保证同步(不是线程安全)
- 字符缓冲区被单个线程使用的时候,建议用Stringbuilder,更快
- StringBuilder实现了Serializable,即其对象可串行化(对象可以网络连接,可以保存到文件)
- 直接父类是AbstractStringBuild,在父类value数组存放字符串内容,放在堆中
- StringBuilder是一个final类,不能被继承
2. String -VS- StringBuffer -VS- StringBuilder
- String:不可变字符序列,效率低,复用率高
- StringBuffer:可变字符序列,效率较高,线程安全
- StringBuilder:可变字符序列,效率最高,线程不安全
3. 效率排名
StringBuilder > StringBuffer > String
4. 注意示例
- 如果字符串存在大量的修改操作:一般使用StringBuffer 或 StringBuilder
- 如果字符串存在大量的修改操作,并在单线程情况:使用StringBuilder
- 如果字符串存在大量的修改操作,并在多线程情况:使用StringBuffer
- 如果字符串很少修改,被多个对象引用:使用String(比如配置环境等)
五、Math类
1. 基本介绍
Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根、三角函数等
2. Math类-常用方法
- Math.abs();--------求绝对值
- Math.pow();-------求幂
- Math.ceil();--------向上取整(转换成double)
- Math.floor();-------向下取整(转换成double)
- Math.round();-----四舍五入
- Math.sqrt();-------求开方(负数–>NaN)
- Math.random();—求随机数(返回0 <= x < 1之间的小数)
- Math.min();-------返回最小值
- Math.max();-------返回最大值
- 获取一个a-b之间的随机整数:int num = (int)(a + Math.random()*(b-a+1))