面试专题

90 阅读2分钟

Java区

String是否可以改变

        //String是不可改变的
        String s1 = "q";
        System.out.println(s1.hashCode());
        s1 += "w";
        System.out.println(s1.hashCode());
        //两次hashcode不一样,说明s1是不同的对象
        String s2 = new String("qq");
        System.out.println(s2.hashCode());
        s2 += "ww";
        System.out.println(s2.hashCode());
        //结果类似,两次hashcode不一样的

String类和内部的成员都改成类final了,是不能被改变的,

StringBuilder builder = new StringBuilder().append("aa");
        System.out.println(builder.hashCode());
        builder.append("bb");
        System.out.println(builder.hashCode());
        //这种情况下builder对象是不变的,但toString的结果的地址会改变

String中==和equals区别

==确定是否是同一个内存中的对象,equals确定是否内容相同 jdk14中的实现能看出一点小蹊跷

String str1 = "what";
        String str2 = str1 + " a nice day";
        System.out.println("what a nice day".equals(str2));
        System.out.println("what a nice day" == str2);

        //true
        //false

        String aabbcc1 = "a" + "b" + "c";
        String aabbcc2 = "abc";
        System.out.println(aabbcc1.equals(aabbcc2));
        System.out.println(aabbcc1 == aabbcc2);

        //true
        //true

如何减少OOM

先了解OOM的原因:内存泄漏或者频繁申请内存而没有得到及时的回收,所以一般有如下的解决问题方式: 1、避免内存泄漏 2、尽量不在循环中申请空间 3、尽量不在调用次数多多函数中申请内存

如何根据泛型T获取它代表的具体类类名

private Class<?> analysisClassInfo(Object object) {//object为传入的泛型类对象,如Pdd<String>
        //getGenericSuperclass()得到包含原始类型,参数化,数组,类型变量,基本数据
        Type getType=object.getClass().getGenericSuperclass();
        //获取参数化类型
        Type[] params=((ParameterizedType)getType).getActualTypeArguments();
        return (Class<?>)params[0];
    }

Serializable 和 Parcelable 的区别

SeriaLizable将整个对象根据二进制的方式转化成可存储或可传输的状态,可以在网络上进行传输,也可以存储在本地

Parcelable也可以实现相同的效果,不同点是实现原理,Parcelable将一个完整对象进行分解,并把每部分都分解成intent支持的类型

实际使用中,如果用在内存中传输的话,建议使用Parcelable,因为它的实现原理导致传输效率更高,且产生的临时变量相对较少,而SeriaLizable在序列化过程中会产生大量的临时变量,影响效率;而在持久化操作中,建议使用Serialiable,因为它占用的内存相对少,而且泛序列化过程中不会因为对象的增减字段导致反序列化失败。

Android区

Kotlin区

其他技术

闲聊