1.Object类
1.概念
- 物体类,所有类的父类
2.为什么需要Object
- Object里面具备了所有子类应该有的共同功能,为了使子类使用这些功能,所以所有类都直接或间接的继承Object类
3.Object常用的两个方法
public String toString()
- 该方法未重写前默认返回对象地址
- 该方法重写后可以返回对象属性内容
public boolean equals(Object obj)
- 该方法未重写前默认返回对比对象地址(==)
- 该方法重写后会先对比对象地址和对象类型(提高效率),在逐个对比对象的属性内容
4.补充(面试题)
int[] arr = {1,2,3};
char[] arr2 = {'a'.'b','c'}
System.out.println(arr);//返回地址
System.out.println(arr2);//返回字符数组元素
这里出现了同个方法不同参数不同结果(方法重载)
5.equals内部
Objec的equals底层源码
public boolean equals(Object obj) {
return (this == obj);
}
- 只对比两个对象的地址值(可能会出现空指针异常)
public boolean equals(Object obj) {
return (null == obj);
}
- 所以重写equals方法后会使用Objects工具类的静态equals方法通过短路优化空指针异常,但是底层还是equals方法
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
- 这里使用了或运算,只有当a和b两个对象地址值不相同时才会进行后面判断,然后会判断a是否为空,a为空时不会进行equals操作,就不会有空指针异常
2.日期类
1.Date的概念
- 日期类,模拟日期形式的时间
2.Date的构造方法
- public Date():表示当前日期
- public Date(long date):表示传入毫秒的日期(从1970年1月1日0时0分开始(会随时区变化))
3.Date未过时的常用方法
- public long getTime():返回日期对象的毫秒值
4.DateFormat日期格式化类
- 注:因为DateFormat为抽象类,所以这里用其子类SimDateFormat
5.SimDateFormat的构造方法
- public SimpleDateFormat(String pattern):根据pattern的格式进行格式化或解析
6.日期格式规则
-
y:年(year)
-
M:月(Month)
-
d:日(day)
-
H:时(Hour)
-
m:分(minute)
-
s:秒(second)
7.DateFormat的常用方法
- public String format(Date date):格式化(Date->String)
- public Date parse(String source):解析(String->Date)
8.示例
通过当前时间日期对象的毫秒减去格式化的日期时间对象的毫秒得到出生年数
Date d = new Date();//获得当前日期
String s = "2000年11月06日";
System.out.println(sim.format(d));//解析
SimpleDateFormat sim = new SimpleDateFormat("yyyy年MM月dd日");//日期格式化类
Date d2 = sim.parse(s);//格式化
System.out.println(((d.getTime()-d2.getTime())/1000/60/60/24/365)+"年");
3.日历类
1.概念
- 将所有可能用到的时间信息封装为静态成员变量
2.获得日历类对象
- 因为Calendar抽象类不能直接创建对象,而是通过静态方法调用获得子类对象
- public static Calendar getInstance():获得Calendar的子类对象
3.日历类的常用方法
- public int get(int field):返回给定日历字段的值。
- public void set(int field, int value):将给定的日历字段设置为给定值。
- public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
- public Date getTime():返回一个表示此Calendar时间值的Date对象。
4.日历类的字段(field)
- YEAR:年
- MONTH:月(从0开始,可以+1使用)
- DAY_OF_MONTH:月中的天
- HOUR:时(12小时制)
- HOUR_OF_DAY:时(24小时制)
- MINUTE:分
- SECOND:秒
- DAY_OF_WEEK:周中的天(周天开始0-6)
5.示例
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2020);//设置年份
c.set(Calendar.MONTH, 4);//设置月份(0-11)
c.set(Calendar.DAY_OF_MONTH, 20);//设置月中天数
System.out.println(c.get(Calendar.DAY_OF_WEEK));//返回该日历类的所在星期几(0-6)
- 返回2020年5月20日的那天是星期几
4.System类
1.概念
- 提供了大量静态方法,可以获取与系统相关的操作
2.常用方法
- public static long currentTimeMillis():返回以毫秒为单位的当前时间。
- public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):将数组中指定的数据拷贝到另一个数组中。
3.currentTimeMillis的应用
long start = System.currentTimeMillis();
//需要进行测试的代码
long end= System.currentTimeMillis();
System.out.println(end-start);
- 通过定义测试开始前的时间和测试结束后的时间
将结束时间减去开始时间得到测试代码执行时间
4.arraycopy的拷贝数组的使用
- public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
- 将src数组从srcPos索引位置拷贝到dest数组的destPos索引位置,拷贝元素个数是length
5.字符串缓冲区
1.出现原因
因为Sring对象内容是常量,来自常量池,所以每次进行字符串拼接时,总会在内存中创建一个新的对象
为了效率问题,这里先创建一个容器(缓冲区)来存储字符串(默认为16字符),当字符串长度大于缓冲区时会进行扩容
2.常用构造方法
- public StringBuilder/StringBuffer():创建空的缓冲区
- public StringBuilder/StringBuffer(String str):创建缓冲区并放入字符串
3.常用成员方法
- public StringBuilder append(…):添加任意类型数据的字符串形式,并返回当前对象自身。
- public String toString():将缓冲区转换为字符串
- public StringBuilder reverse(),将缓冲区反转
4.链式调用
new StringBuilder("abc").reverse().toString();
5.StringBuilder与StringBuffer的区别
- StringBuilder:线程不安全,效率高
- StringBuffer:线程安全,效率低
6.缓冲区的内存位置
StringBuffer sb = new StringBUffer("a");
StringBuffer sb2 = sb.append("b");
System.out.println(sb==sb2);
- 上面的结果是true,因为sb2的缓冲区指向了sb缓冲区
6.包装类
1.基本类型和其对应的包装类
- byte -> Byte
- short -> Short
- int -> Integer
- long -> Long
- float -> Float
- double -> Double
- char -> Character
- boolean -> Boolean
2.自动拆装箱(JDK1.5)
- 装箱:基本类型->包装类
使用方法:Integer i = Integer.valueOf(数据); - 拆箱:包装类->基本类型
使用方法:int num = i.intValue();
3.自动拆装箱示例
- 原代码
Integer i = 4;
i = i+5;
- 反编译后
Integer i = Integer.valueOf(4);
i = Integer.valueOf(i.intValue()+5);
4.自动拆装箱面试题
Integer i = 127;
Integer j = 127;
Integer i2 = 200;
Integer j2 = 200;
Integer i3 = new Integer(127);
Integer j3 = new Integer(127);
Integer i4 = new Integer(127);
Integer j4 = new Integer(127);
System.out.println(i==j);//true
System.out.println(i2==j2);//false
System.out.println(i3==j3);//false
System.out.println(i4==j4);//false
- 原因如下:
因为这里使用了自动装箱(Integer.valueOf() ),它的源码如下
static final int low = -128;
static final int high;
int h = 127;
high = h;
static final Integer cache[];
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
当数据进行自动装箱时会调用valueOf方法传入该数据,方法内会先判断数据是不是在常量-128到127之间,如果在就返回常量字符数组内的数据,不在就new一个Integer对象
7.基本类型与字符串之间的转换
- 注:除了Charecter类(因为字符不能存放字符串)
以下方法全部为静态修饰,可以通过类名调用:
- public static byte parseByte(String s):String->byte
- public static short parseShort(String s):String->short
- public static int parseInt(String s):String->int
- public static long parseLong(String s):String->long
- public static float parseFloat(String s):String->float
- public static double parseDouble(String s):String->double
- public static boolean parseBoolean(String s):String->boolean