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,因为它占用的内存相对少,而且泛序列化过程中不会因为对象的增减字段导致反序列化失败。