文章目录
第13章 常用类
1.包装类
-
八种基本数据类型
-
它们继承的类和方法?(Object、Serializable、Comparable)
-
包装类与基本数据类型的转换:自动装箱拆箱
-
三元运算符是一个整体的符号
Object obj1 = true ? new Integer(1) : new Double(2.0); System.out.println(obj1); //输出的是1.0,而不是1,因为double也已经加载,类型自动转换为double
-
包装类与String的转换
2. Integer 类和 Character 类
- 常用方法?
- 装箱时 i 在 -128~127,直接返回该数字
否则 new Integer(i); - 判断是否 == 时,new 一个新对象的都是在比较地址,一定不相等
- 两个比较的内容之一是基本数据类型,== 比较的就是数值
3. String 类
-
常用构造器
-
String 的属性:private final char value[] ; 用于存放字符串内容
value 是一个 final 类型,不可以修改; 即 value 可以修改里面的值,但是不能修改指向的地址
-
创建 String 对象的两种方式和区别(栈、常量池、堆,注意内存分布)
-
new String 对象:先在堆创建values数组,再指向常量池中的字符串常量(对象在栈中)
-
String str = “xxxxx” : 直接在常量池中创建“xxxxx”字符串常量,对象直接指向它
-
-
对象不相等,但里面的属性指向常量池的同一个对象,这两个属性相等
-
intern() 方法:在常量池中查询该字符串是否存在(equals判断)
- 存在,返回该常量池中的字符串引用
- 不存在,把这个String对象引用存到常量池,然后返回它
String 对象特性
-
字符串不可变,一个字符串对象一旦分配,内容不变,修改字符串的值实际上是在常量池创建
一个新的字符串,变量指向它
-
String a = "hello" + "abc"; //创建了一个对象helloabc
-
String a = "hello"; Stirng b = "abc"; String c = a+b; //通过 append 追加的方法创新的字符串 ,toString方法? //c指向堆中的对象(String)value[] -> 池中"helloabc" //创建了三个对象 String d = "helloabc" //c != d
-
总结:常量相加,看的是池;变量相加,看的是堆
学习思路:看源码学习 -
常用方法
- equals 区分大小写,有忽略的版本
- charAt 不能用
str[0],这样将字符串看成一个数组了 - length
- indexOf
- lastIndexOf
- substring,传参不同功能不同
- toUpperCase
- toLowerCase
- concat
- replace 返回的是变化过的,但原先的字符串不变
- split 注意分割特殊字符时要用转义字符
- toCharArray
- compareTo
- format(%s %d %.2f %c 占位符——C语言)
4.StringBuffer类
-
可以拓展内容
-
char value[] 存储数据,不是final,所以存在堆中
-
String VS StringBuffer
- 字符串内容在常量池固定(字符串常量),更改或删除需要频繁更换地址和创建新对象
- StringBuffer 保存的是字符串变量,不用每次都创建对象更换地址,效率更高。StringBuffer对数组value进行扩容是创建一个新数组(增加容量,大小由算法决定),把原先的数据复制过去
-
构造器
-
String 和 StringBuffer 转换
-
常用方法
- 增 append
- 删 delete
- 改 replace
- 查 indexOf
- 插 insert (String 类里没有这个方法!)
- 长度 length
5.StringBuilder类
- StringBuffer 的简化版本
- StringBuffer 在多线程使用, StringBuilder 在单线程使用(没有线程安全,没有做同步互斥处理)
- 但StringBuilder速度更快
- 常用append和insert方法
- String VS StringBuffer VS StringBuilder
- String 是不可变序列,效率最低,但复用率高(复用常量池中的数据)
- StringBuffer 是可变序列,效率较高,线程安全
- StringBuilder 是可变序列,效率最高,线程不安全
- 总结:
- 如果对String做大量修改,不要用String
- 存在大量修改用StringBuffer 或 StringBuilder, 单线程用StringBuilder,多线程用StringBuffer
- 字符串很少修改,且被多个对象引用,用String ,如配置信息
6.Math类
-
基本上都是静态方法
-
abs
-
pow
-
ceil
-
floor
-
round
-
sqrt
-
random
-
思考:获取 a~b 之间的一个随机整数,a,b均为整数
(int) (a + Math.random() * ( b - a +1 ))
-
-
max
-
min
7.Arrays类
- toString
- sort (注:数组是引用类型,使用这个方法会直接影响实参)
- Comparator实现定制排序(匿名内部类)
- binarySearch (若不存在,返回应该存在的位置+1的负数)
- copyOf
- fill
- equals
- asList
8.System类
- exit
- arraycopy
- currentTimeMillens
- gc
9.BigInteger & BigDecimal
-
编程中遇到很大的数的处理方案——BigInteger
-
遇到精度很高的数,double不够用——BigDecimal
-
new的时候传入的参数是字符串
-
BigInteger、BigDecimal进行加减乘除需要使用对应的方法
-
add
-
subtract
-
multiply
-
divide
注:BigDecimal除法时可能会异常(结果为无限循环小数时)
解决方法:指定精度
divide(bigDecimal,BigDecimal.ROUND_CEILING),保留分子精度
-
10.日期类
Date
-
Date date = new Date()
默认输出格式是国外的格式转换格式:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E")
具体参数意义查表得
-
new Date(23123431)
-
parse
Calendar
- 抽象类,构造器是protected,不能被new出来(无法实例化)
- getInstance
- get (没有对应的格式化,需要自己组合)
- Calendar.MONTH(注意月是从0开始计算的)
- Calendar.YEAR
- Calendar.HOUR
- Calendar.HOUR_OF_DAY(24小时制)
- …
第三代日期类
- 前两代的不足:
- Calendar 的月份从0开始算起
- Date 无法分别提取各个信息
- 线程不安全
- 日期和时间的类应该是不可变的
- Calendar 没有格式化
- 不能处理闰秒等
- JDK8加入第三代
- 类名:LocalDate、LocalTime、LocalDateTime
- 实例化:
LocalDateTime ldt = LocalDateTime.now()
- 获取数据方法
- getYear
- getMonth(单词)
- getMonthValue(数字)
- getDayofMonth
- gerSecond
- …
- 其它方法
- DateTimeFormatter类(格式化)
- ofPattern
- format
- Instant类(时间戳)
- now (实例化当前时间戳对象)
- from (Instant -> Date)
- Date 的 toInstant 方法 (Date -> Instant)
- plus
- plusDays
- plusYears
- pulsMonths
- …
- minus
- minusDays
- minusMonths
- minusMinutes
- …
- DateTimeFormatter类(格式化)