易混淆知识点(重写toString()方法)

为什么需要重写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;
}

总结:  前者效率更高 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值