为什么需要重写toString() 方法?
我们都知道Object类是所有引用数据类型的【直接或间接的父类】;
所有子类都可以直接使用Object类中的所有方法;
但是,有些方法对我们子类来说没有任何意义;
所以我们子类可以重写父类的方法;
【
1. 父类方法不完全满足子类需求 super.父类方法();
2. 父类方法完全不满足子类需求 直接重写,不管父类
3. 父类方法完全满足子类需求 直接使用父类方法
】
String toString()
返回对象的字符串形式的地址值。对我们来说没有任何意义;所以通常情况,我们都会重写该方法;
如果某个类中有比较中的成员变量,那么就重写toString();
底层代码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
右键generate 选择重写toString
其中用到一下方法:
getClass(): 获取对象字节码对象
getName(): 获取对象的全类名
hashCode(): 获取对象的地址值的十进制表示形式
toHexString: 把十进制转成十六进制的值
重写 boolean equals(Object obj)
判断两个对象的地址值是否相等;不同的两个对象,地址值没有可能相同,所以比较地址值,没有任何意义;
所以我们通常也会重写equals(),用来比较两个对象中的成员变量(属性)是否相同;
public boolean equals(Object obj){
return this == obj;
}
// alt + insert 快捷键直接生成
public boolean equals(Object o) { //Object o = new LitterB();
if (this == o) return true; // 提高代码效率,如果是同一个对象,没有必要再往下比较
// 提高代码的健壮性 避免了空指针异常以及类型转换异常
if (o == null || getClass() != o.getClass()) return false;
// 为了使用子类特有的成员
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
StringBuilder 字符串缓冲类
只有一个用途,就是用来做大量字符串数据拼接工作;
底层是一个[可变]的数组;
因为扩容机制,导致数组长度看似在变化;
1.StringBuffer是线程安全的而StringBuilder不是,因而在多线程的环境下优先使用StringBuffer,而其它情况下推荐使用
StringBuilder,由于它更快。
2.StringBuilder和StringBuffer都继承自AbstractStringBuilder类,AbStractStringBuilder主要实现了扩容、append、
insert方法。StrngBuilder和StringBuffer的相关方法都直接调用的父类。
3.StringBuilder和StringBuffer的初始容量都是16,程序猿尽量手动设置初始值。以避免多次扩容所带来的性能问题;
4.StringBuilder和StringBuffer的扩容机制是这种:首先试着将当前数组容量扩充为原数组容量的2倍加上2,假设这个新容
量仍然小于预定的最小值(minimumCapacity),那么就将新容量定为(minimumCapacity),最后推断是否溢出,若溢出,
则将容量定为整型的最大值0x7fffffff。
构造方法:
new StringBuilder(); 创建一个空的StringBuilder对象
常用方法:
append(); 在对象后面继续追加字符串
toString(); 将StringBuilder对象转成字符串
reverse(); 将StringBuilder对象中的字符串进行反转
将数组转换成字符串形式两种方式:
方式一:
public static String showArray(int[] arr) { StringBuilder sb = new StringBuilder("["); for (int i = 0; i < arr.length; i++) { if (i == arr.length - 1) { sb.append(arr[i]); } else { sb.append(arr[i]).append(", "); } } sb.append("]"); String s = sb.toString(); return s; }
方式二:字符串拼接
public static String showArray(int[] arr) { String s = "["; for (int i = 0; i < arr.length; i++) { if (i == arr.length - 1) { s += arr[i]; } else { s += arr[i] + ", "; } } s += "]"; return s; }
总结: 前者效率更高