第一章 常用类
1.1 Object
Object类是所有类的父类
当一个类没使用extends指定父类时,父类默认Object类
所有类的对象,都可以看作是Object类的对象。
1.1.1方法
hashCode
在数据结构中有一种数据结构叫哈希表。
哈希表需要用到哈希函数。通过对键(Key)进行一定的运算计算出一个对象的地址。
哈希表查询元素的效率很高:O(1),提供Key之后只需要进行一次运算就可以在哈希表中查找到
在哈希映射中,每一个元素由两部分组成:键Key,值Value
为了提高哈希运算的效率,每一个对象都应该有一个hashCode
哈希约定、常规协定:
- 一次执行中,对象没有修改时,hashCode应该是不变的
- 相等的对象应该拥有相同的hashCode
- 不相等的对象可以拥有相同的hashCode,但应该不同。
Object的返回类型是他的地址
equals
比较两个对象是否逻辑上相等
逻辑上的相等通常指字面量,如String
Object的equals方法作用与 == 是一致的。
如果需要逻辑上的比较,必须重写equals方法,同时有必要重写hashCode,以维持哈希协定。
clone
创建当前对象的副本,这个方法是protected的。
这个方法在当前包(java.lang)内可用
要实现对象的克隆,必须重写他的clone方法,同时实现cloneable的接口才行,否则将会抛出CloneNotSupportedException的错误
克隆不会调用构造方法,而在原有对象的基础上,从内存中拷贝一份出来。克隆也是一种创建对象的方式。
深克隆:深度复制
在复制对象的同时,会将对象中引用的内容也复制一份出来
浅克隆:浅表复制
在复制对象的同时,会不克隆引用的内容,仅仅是复制引用对象的地址。
finalize
GC(垃圾回收)会在清理对象时调用该方法,当一个对象不存在任何引用时,以释放对象所占用的资源,由GC调用
toString
将对象转换成一个字符串的表示形式。
通常需要自己重写。
Object对他的实现是返回数据类型@hashCode(16进制)
getClass
获取当前对象所对应的class对象,保存在元空间
wait
暂停当前线程
notify
唤醒一个由wait暂停的线程
notifyAll
唤醒所有由wait暂停的线程
1.2字符串
1.2.1 String
String类的对象是字符串
特点:
- 字符串是常量:
保存字符序列的属性value是一个常量的数组,也没有提供修改下标元素的方法。
String被final修饰,因此也无法通过子类拓展功能。
- 可以共享
如果要比较两个字符串的值是否相等,必须使用equals方法
小技巧:如果一个字符串类型的变量要与一个常量进行equals比较,
则“常量”.equals(变量)
字符串常用操作:
- 判断类:
charAt(int index):查找指定下标的字符
isEmpty()
eauals():比较两个字符串是否表示的是相同的字符序列。
indexOf():查找指定字符、字符串在原字符串中第一次出现的下标位置,找不到返回-1
lastIndexOf:查找指定字符、字符串在原字符串中最后一次出现的下标位置,找不到返回-1
startsWith:判断当前的字符串是否以指定的字符串开始
endsWith:判断当前字符串是否已指定的字符串结束
2)修改类:
replace:替换字符、字符串
subString:截取字符串
length():长度
split:分开字符串
toUpperCase:转换为大写
toLowerCase:全部转换为小写
intern:从字符串常量池中查询当前字符串是否存在(通过equals判断)。
如果存在,返回常量池中的字符串引用。如果不存在,把这个String对象引用存到常量池,然后返回这个String对象的引用。
Trim:用于删除字符串的头尾空白符,空白符包括:空格、制表符 tab、换行符等其他空白符等
由于字符串是一个常量,所有试图改变字符串内容的操作都会创建新的对象,拼接也是
1.2.2 StringBulider
可变字符串,线程不安全,用于单线程,优先使用,效率更高。
扩容容量:默认是16,也可以指定,也可以是16+n
扩容:新的容量=旧容量*2+2(原来的容量左移一位再+2);如果新容量还不够用,这是扩容到能容下所有字符为止(扩展到刚刚能够放下所有元素)
1.2.3 StringBuffer
可变字符串,线程安全的,用于多线程,效率稍微低一点
1.3时间日期
1.3.1 java.util.Date类
表示时间点的,精确到年月日时分秒毫秒。
时间戳:从1970年1月1日0点0分0秒,到当前时间所经历的毫秒数。使用lang类型。
对象.getTime(); 获取现在的时间戳
1.3.2 java.sql.Date类
JDK1.1新增加的专门用于时间运算的类。
1.3.3 JDK8新的时间日期类
1.本地时间类型
LocalDate:表示日期,年月日
LocalTime:表示时间,时分秒
LocalDateTime:表示日期加时间。年月日+时分秒。
2.时区时间类型
ZonedDate:表示日期,年月日
ZonedTime:表示时间,时分秒
ZoneDateTime:表示日期+时间,年月日+时分秒
要求:
- 创建对象
- 操作,获取设置年月日,时分秒,加减
- 相互转换
- 时间日期与字符串转换
DateTimeFormatter
SimpleDateFormat
1.3.4 java.sql.TimeStmap类
1.3.5 java.sql.TimeStamp类
这两个类,是在访问数据库时用的。他们都是java.util.Date的子类。
区别在于Date只表示,年月日,Timestamp表示时间戳。
1.4数学
1.4.1Math类
数学类:
floor(),全舍舍入法。该值小于等于参数,并等于某个整数。
ceil(),全入舍入法
abs(),绝对值
round(),四舍五入
random(),伪随机数[0.0,1.0),要会使用这个方法生成各种伪随机数。
1.4.2Random类
伪随机数类:指定随机种子时,生成的数一定。
1.5包装类
1.5.1 什么是包装类?
八种基本数据类型,面向对象的表示形式
基本数据类型 | 包装类 | |
byte | Byte | |
short | Short | |
int | Integer | |
long | Long | |
float | Float | |
double | Double | |
char | Character | |
boolean | Boolean |
1.5.2自动装箱和自动拆箱
1.自动装箱
Byte、Short、Character既可以赋值为整数值,也可以赋值为字符。
2.自动拆箱
包装类型的值,可以直接转换为基本数据类型
只要符合基本数据类型的自动转换即可。
1.5.3类似于String的常量池
在包装类型中,Byte、Short、Integer、Character也有常量池。
Byte、Short的常量池放的是-128~127.
Character的常量池放的是0~127;
包装类型的值进行比较必须使用equals()方法。
=比较的是地址
包装类型的值在进行运算时会先自动拆箱。
两个包装类型使用==、!=时不会拆箱,不同的包装类型的值不能使用==、!=进行运算
基本类型与包装类型使用==、!=比较时,会拆箱