Object
任何一个类的直接或间接子类
一个类即使不显式继承Object,也还是会继承Object
当然,下面会介绍一下常见的方法。需要重写的时候不要真的自己重写,应该用idea生成。。。
equals
判断两个对象是否相等的方法。
默认判断地址相等,也可以自己重写。重写equals也要重写hashcode,因为两个对象equal必须hashcode也相同,所以为了保证不出问题hashcode也要重写。
public boolean equals(Object obj) { if (obj == null) return false; if (this == obj) return true; if (! obj instanceof xxx) return false; //重点是上面 xxx obj2 = (xxx) obj; return obj2.func() == this.func(); //随便写的逻辑 }
hashcode与重写hashcode
最简单的做法是把判断用的逻辑返回。
觉得太简单可以加点固定的无意义偏移量。
toString()
默认返回包名.类名@哈希码的16进制值
包装类
就是为了让基本类型也能变成对象。
Integer
大概记住 Integer.valueOf Integer.intValue Integer.toString Integer.toBinaryString即可。
Integer内部提供了自动装箱池,-128到127之间的数已经默认装箱了。程序员使用的时候直接返回已有的。
Double
APi和Integer基本是一样的。没有装箱池的概念。
Boolean
用的很少。最起码我很少用。API和Integer类也基本相同。
Character
有些API和Integer类的API是一样的。然而还有一些方法是独有的,比如isDigit这种。
常用于在线刷OJ。
BigDecimal
没有误差的浮点类型,用于精确运算。
当然,说没有误差主要是因为 如果运算的结果不能精确表示,则直接抛出异常。。。(可以通过指定舍入模式规避异常,但四舍五入了可能就不叫精确运算了吧?)
BigInteger
和BigDecimal差不多,其实原理比较简单,我们可以自己实现一个简单的版本。
当然Java的这个做的肯定比普通程序员自己开发的好,最起码乘法是FFT打底的。
String
不可继承的类,从Java1.9以后用byte数组而不是char数组。这样可以节省空间。
在Java中有常量池的概念,第一次遇到的字符串会扔到常量池里。
String是不可变的。
常用的API有很多,我觉得掌握这些API的方法就是去刷OJ。这里还是列举一下 比如 indexOf trim subString contains 等等
初始化
通常应该直接用字面量初始化。调用构造函数一般是用数组来构造。
如果用new String(String str);的方法初始化,会在堆区创建一个str的副本。根据str在或不在常量池中,会创建1-2个对象。
连接优化
如果两个常量用+拼接,编译器会自动把两个常量优化成一个。
如果常量和变量之间用+拼接,则会优化成StringBuilder拼接。
单独说一下compareTo
这东西的顺序总容易记反。其实就是两个str的ASCII值相减。调用方法的str1 - 实际参数str2
正则表达式
这部分内容在网上有很多单独的教程。
在日常开发过程中,通常不需要自己写正则,搜一下一般都能解决需求。
或者直接写死字符即可。比如按空格分隔,直接split(" ");这是因为字符串本身也是一种这则表达式