1. 包装类(基本类型对应的类)
1.1 装箱与开箱
- jdk1.5以前必须手动装箱与开箱
- jdk1.5及以后必须手动装箱与开箱
1.2 包装类与String相互转换
1.3 常用方法
1.4 细节
- 包装类重写了toString方法。打印变量,输出的是该数值的字符串形式。
- 区分下面两种:
- valueOf方法是在堆中分配了空间,还是使用堆中作为缓存的数组中的值?
这涉及到Integer与常量池的关系,点击查看详细内容- 基本数据类型
==
对应的包装类:比较值是否相等。
因为,Integer就会拆箱成一个int类型,所以还是相当于两个int类型进行比较,这里的Integer,不管是直接赋值,还是new创建的对象,只要跟int比较就会拆箱为int类型,所以表现为直接比较值是否相等。
2. 字符串相关类
2.1 String
2.1.1 String类结构
- ①
String
是final
类,不能被继承。
② 实现了Serializable
、Comparable
接口。前者可以用于串行化(文件保存、网络传输等);后者可用与大小比较。
③ 并使用final
修饰的char
型数组value
属性去保存常量池中对应字符串的地址。
- 有很多构造器,常用的构造器有:
2.1.2 String两种创建方式
- 两种创建方式:
- 直接赋值字符串,如:
String s = "abc";
- 采用new的方式,如:
String s = new String("abc");
- 流程分析:
String s = "abc";
:到方法区的常量池中去查找是否有"abc"
,有则将该字符串的地址给s;没有则在常量池创建"abc"
,再将其地址给s。
String s = new String("abc");
:先在堆中实例化String对象,并将堆地址给s,再在常量池中查找是否有"abc"
,有则将该字符串的地址给String对象的value属性;没有则在常量池创建"abc"
,再将其地址给value属性。
- 练习:
①
②
③
2.1.3 常用方法
2.1.3.1 intern方法
intern方法
:在常量池中查找该字符串,如果存在,则返回其在常量池中的地址;不存在,则在常量池中添加该字符串后,将该字符串的地址返回。
2.1.3.2 其他方法
注意:以上方法都不会修改原字符串。
2.1.4 String细节
- 两字符串常量进行
+
,结果看池- 至少含有一个字符串变量相加,结果看堆 :
s = a + "123"
、s = a + b
- 字符串是类,故不可以当作数组使用(如:str[1])。如果需要当作数组使用,可以使用
toCharArray()
转为字符数组。
练习:
- ①
- ②
- ③
2.2 StringBuffer
2.2.1 StringBuffer类结构
- ①
StringBuffer
是final
类,不能被继承。
②StringBuffer
继承了AbstractStringBuilder
,从而继承了AbstractStringBuilder
类的value
属性。
【注意:(1)String
的value
是用于保存字符串常量的地址;(2)StringBuffer
的value
没有final
修饰,所以可以修改指向,而其指向的堆中数组存储字符串】
③ StringBuffer实现了Serializable接口,故可以串行化(文件保存、网络传输等)
2. 构造器
2.2.2 常用方法
- 增:append方法
- 删:delete方法:左闭又开
- 改:replace方法:左闭又开
- 插:insert方法
2.2.3 细节
- ① length方法返回的是value所指向的char数组所占字符部分的长度,而不是数组长度。
② append方法添加bull:sb.append(null),会将value指向的字符数组内容置为"null"
,故不会报空指针异常。
- 使用StringBuffer构造器,传入的参数不能为null,否则会报空指针异常。
2.3 StringBuilder
- StringBuilder是StringBuffer的简易替换。它兼容StringBuffer的API,即有其所有方法,但是这些方法没有实现互斥。
- StringBuilderCRUD最快。但是比较局限,只能用于字符串缓冲区被单个线程使用的情况。
- StringBuilder的类结构和StringBuffer的类结构一样,而不是String。
2.4 String vs StringBuffer vs StringBuilder
2.4.1 优缺点分析
String | 增删时 效率低且浪费资源 | 复用性高 |
---|---|---|
StringBuffer | 增删效率较高 | 线程安全 |
StringBuilder | 增删效率最高 | 线程不安全 |
String增删浪费资源:如
s += "abc";
会使得原来的字符串s还保留在常量池中,浪费资源。
2.4.2 String 与 StringBuffer 相互转换
- String—>StringBuffer :
- StringBuffer —>String:
3. Math(都是静态方法)
- Math.abs方法:取绝对值,返回原类型
- Math.pow方法:求幂,返回double类型
- Math.ceil方法:向上取整,返回的是double类型
- Math.floor方法:向下取整,返回的是double类型
- Math.round:四舍五入,返回的是long类型
- Math.sqrt:开方,返回double类型
- Math.random方法:
等概率
生成 [ 0, 1)的随机小数,返回double类型Math.random()方法之「修改随机生成数的概率 | 随机生成[a, b]的小数 | 随机生成[a, b]的整数」
- Math.max方法:得到两个数中大的,返回类型为自动转换的最大类型。
- Math.min方法
4. Arrarys(都是静态方法)
4.1 Arrarys.toString方法
Arrarys.toString方法:传入数组,返回 [1, 2, 3] 形式的字符串。
4.2 Arrarys.sort方法
Arrarys.sort方法:对数组进行排序 (二叉排序) ,会改变原数组。
- 默认是从小到大排序。
- 如果想从大到小排序,则需要传入Comparator对象,该sort重载方法需要两个参数:
① 引用类型的数组,不可以是基本类型的数组。
② 还需要传入一个Comparator的匿名内部类实现接口编程从而作为参数。
compare方法中,若返回值小于0,则说明该元素排在前面;若返回值大于0,则说明该元素排在后面。
- 对于非包装类数组,想根据对象的某属性进行排序,还是使用形参为Comparator接口的sort重载方法:
- 细节:
- 数组必须存放元素存满才可以使用该方法,否则报空指针异常。
- 多重比较。
- 若要比较的属性为基本数据类型,则写在比较器中。
下面例子:按年龄由小到大排序,若年龄相等,则按成绩由小到大排序。
- 若存在比较的数据类型为引用数据类型,则该类型的比较不写在比较器中,写在该类中。 具体步骤:让该类实现Comparable接口,重写compareTo方法。
下面例子:按年龄从小到大排序,若年龄相等,则按出生日期从小到大排序。
4.3 Arrarys.binarySearch方法
Arrarys.binarySearch方法:采用二分查找。注意
- 要求传入的数组必须有序。
- 没有则返回 负数
4.4 Arrarys.copyOf方法
Arrarys.copyOf方法:复制数组。两个参数。
- 第一个参数传数组
- 第二个传要复制的长度。如果传入长度大于原数组长度:
- 为基本数据类型的数组,则在超过的元素为默认值。
- 为包装类类型的数组,则在超过的元素为null
该方法底层使用的是System.arraycopy()方法。
4.5 Arrarys.fill方法
Arrarys.fill方法:将数组所有的元素都设置为某值。
4.6 Arrarys.equals方法
Arrarys.equals方法:比较两个数组的元素是否完全一致。返回布尔类型。
4.7 Arrarys.asList方法
Arrarys.asList方法:将传入的多个数据转为List集合。该集合的:
- 编译类型:List
- 运行类型:java.util.Arrays$ArrayList 即Arrays下的一个静态内部类。
5. System(都是静态方法)
- System.exit方法:表示退出程序。传入0表示正常退出,非0表示异常退出。
- System.arraycopy方法:将一个数组的部分或所有元素复制到另一个数组。
- System.currentTimeMills方法:返回当前时间距离1970-1-1日的毫秒数。
- System.gc方法:请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。
6. 大数据
6.1 BigInteger
BigInteger用于long存放不下的数据。
- 大数据一般以字符串的形式传入BigInteger的构造器
- 使用方法进行加减乘除。传入的数据也必须是BigInteger类型
① 加:add方法
② 减:subtract方法
③ 乘:multiply方法
④ 除:divide方法
6.2 BigDecimal
BigDecimal用于大数据且比double进度更高的数据。
- 高精度小数一般以字符串的形式传入BigInteger的构造器
- 使用方法进行加减乘除。传入的数据也必须是BigDecimal类型
① 加:add方法
② 减:subtract方法
③ 乘:multiply方法
④ 除:divide方法:可能报AirthmeticExcepion异常,因为可能为无限循环或不循环小数。故可以传入第二参数指定小数位数,一般传BigDecimal.ROUND_CEILING
,结果与分子精度相同。
7. 日期日历
7.1 第一代日期类:java.util.Date
- 构造器
- 无参构造器:当前日期的Date对象
- 一个参数的构造器:传入距离1970-1-1后的毫秒数,得到对应的Date对象
- 应用:
- 自定义排版日期:实例化
SimpleDateFormat
对象,并使用其format
方法
对应字母的含义
- 根据自定义排版日期字符串逆向转换为Date对象:实例化
SimpleDateFormat
对象或使用之前将其转为字符串的sdf,并使用其parse
方法【parse方法抛出了异常,需要处理,因为可能转换格式不匹配】
7.2 第二代日期类:Calendar
- Calendar是一个抽象类,并且构造器是私有的,只能用
Calendar.getInstance()
方法获取。- 使用Calendar对象的get方法能够获取年月日等:注意月是从0开始,需要加1
- 没有自定义排版的方法,需要自己使用字符串拼接
7.3 第三代日期类:LocalDate(年月日)、LocalTime(时分秒)、LocalDateTime
- LocalDateTime是一个final类,构造器私有。
- 使用
LocalDateTime.now()方法
获取当前时间的LocalDateTime对象,并使用相关方法获取年月日时分秒
- 应用
- 自定义排版日期:使用
DateTimeFormatter.ofPattern("")
获取DateTimeFormatter对象,并使用其format
方法
- 逆过程与Date的类似
- 还有其他方法很强大,如lplus等