1 Object
所有对象的顶级父类,存在于java.lang包中,这个包不需要我们手动导包
1.1 常用方法
boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。
int hashCode()
返回该对象的哈希码值。
String toString()
返回该对象的字符串表示。
toString()
默认返回 类名@地址 的格式,来展示对象的地址值
如果想看属性值我们可以重写这个方法,重写后返回的就是把属性值拼接成一个字符串
equals(Object obj)
当前对象和参数对象比较大小,默认是比较内存地址,如果要比较对象的属性,可以重写该方法
hashCode()
返回该对象的哈希码值
2 String
字符串对象
2.1 特点
- 是一个封装char[]数组的对象
- 字符串不可变
2.2 创建String对象
2.2.1 方式一:直接创建
常量池里直接创建对象(本质还是char[]),再次使用相同内容,会去常量池中找到已经存在的对象,不会新建
String str = "abc";
1、 如果是第一次使用字符串,java会在字符串常量池创建一个对象。
2、 再次使用相同的内容时,会直接访问常量池中存在的对象。
2.2.2 方式二:关键字和构造方法创建
new String(char[])
其实字符串底层维护了一个char[]
char[] c = {'a','b','c','d'};
String s = new String(c);//堆中分配新的内存
System.out.println(s);
2.2.3 创建对象的比较
String s2="abcd";//常量池中分配新的内存
char[] c = {'a','b','c','d'};
String s = new String(c);//堆中分配新的内存
System.out.println(s==s2);//地址不同
System.out.println(s.equals(s2));//内容相同
//如果使用过了就不再创建,引用存在的对象
String s3="abcd";//访问常量池中已经存在的对象
System.out.println(s3==s2);//true
2.3 字符串连接效率
利用String类,在做字符串拼接的过程效率极其低
String s1="aaa";
String s2="bbb";
String s3="ccc";
String s4=s1+s2+s3;//字符串不可变,每次加会创建新对象
2.4 常用方法
- length();
int 返回此字符串的长度
- charAt();
char 返回指定索引处的 char 值
- lastIndexOf();
int 返回指定字符在此字符串中最后一次出现处的索引
- substring();
String 返回一个新的字符串,它是此字符串的一个子字符串`
- equals();
boolean 将此字符串与指定的对象比较
- startsWith();
boolean 测试此字符串是否以指定的前缀开始
- endsWith();
boolean 测试此字符串是否以指定的后缀结束
- split();
String[] 根据给定正则表达式的匹配拆分此字符串
- trim();
返回字符串的副本,忽略前导空白和尾部空白
3 StringBuilder/StringBuffer
3.1 特点
1、 封装了char[]数组
2、 是可变的字符序列
3、 提供了一组可以对字符内容修改的方法
4、 常用append()来代替字符串做字符串连接
5、 内部字符数组默认初始容量是16
6、 如果大于16会尝试将扩容,新数组大小原来的变成2倍+2,容量如果还不够,直接扩充到需要的容量大小。int newCapacity = value.length * 2 + 2
7、 StringBuffer 1.0出道线程安全,StringBuilder1.5出道线程不安全
3.2 方法
- append()
将指定的字符串追加到此字符序列 - charAt()
返回此序列中指定索引处的 char 值
3.3 StringBuilder和StringBuffer的区别
1、 在线程安全上,
–StringBuffer是旧版本就提供的,线程安全的。@since JDK1.0
–StringBuilder是jdk1.5后产生,线程不安全的。@since 1.5
2、 在执行效率上,StringBuilder > StringBuffer > String
3、 源码体现:本质上都是在调用父类抽象类AbstractStringBuilder来干活,只不过Buffer把代码加了同步关键字,使得程序可以保证线程安全问题。
4 包装类
4.1 与基本类型的对应关系
4.2 Number
数字包装类的抽象父类
常用的方法
4.3 以Integer/Double为例
4.3.1 新建对象
注意:
在Integer类中,包含256个Integer缓存对象,范围是 -128到127
使用valueOf()时,如果指定范围内的值,访问缓存对象,而不新建;如果指定范围外的值,直接新建对象
new Integer(5);新建对象
Integer.valueOf(5);//和 new 没有区别
new Double(3.14);
Double.valueOf(3.14);
4.3.2 方法
Integer.parseInt(String s);//字符串转换成int
Double.parseDouble(String s);//字符串转换成double
4.4 自动装箱和自动拆箱
自动装箱:把基本类型包装成一包装类的对象
Integer a = 5;//a是引用类型,引用了包装对象的地址。
编译器会完成对象的自动装箱:Integer a = Integer.valueOf(5);
自动拆箱:从包装对象中,自动取出基本类型值
int i = a;//a现在是包装类型,没法给变量赋值,需要把5取出来。
编译器会完成自动拆箱:int i = a.intValue();
5 日期类Date
5.1 概述
存在于java.util.Date包。用来封装一个毫秒值表示一个精确的时间点。
从1970-1-1 0点开始的毫秒值
5.2 创建对象
new Date();封装的是系统当前时间的毫秒值
new Date(900000000000L);封装指定的时间点
5.3 常用方法
- getTime():取内部毫秒值
- setTime():存取内部毫秒值
- getMonth():获取当前月份
- getHours():获取当前小时
- compareTo(Date):当前对象与参数对象比较。当前对象大返回正数,小返回负数,相同0。
public static void main(String[] args) {
Date d = new Date();
System.out.println(d);//输出当前时间
System.out.println(d.getTime());//输出1970-1-1至今的毫秒值
System.out.println(d.getMonth());//获取当前月份
System.out.println(d.getHours());//获取当前小时
}
6 日期工具SimpleDateFormat
6.1 概述
日期格式化工具,可以把Date对象格式化成字符串,也可以日期字符串解析成Date对象
6.2 创建对象
new SimpleDateFormat(格式)
格式:yyyy-MM-dd HH:mm:ss
MM/dd/yyyy
6.3 常见方法
format(Date):把Date格式化成字符串
parse(String):把String解析成Date
6.4 案例:计算存活天数
public static void main(String[] args) throws ParseException {
//生存XX天
String birth = new Scanner(System.in).nextLine();
SimpleDateFormat s =new SimpleDateFormat("yyyy-MM-dd");
Date date = s.parse(birth);
long birthday = date.getTime();
long now=System.currentTimeMillis();
System.out.println((now-birthday)/1000/60/60/24);
}