Java 基础知识总结
来源:互联网 发布:网络用语ddp是什么意思 编辑:程序博客网 时间:2024/05/21 10:01
所有的相同类型的包装类独享之间值得比较,全部使用equals方法比较。
对于Integer var = ?在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用 == 进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,推荐使用equals方法进行判断。
序列化类新增属性时,请不要修改serialVersionUID字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值。
注意serialVersionUID不一致会抛出序列化运行时异常。
关于hashCode和equals的处理
1) 只要重写equals,就必须重写hashCode。
2)因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法。
3)如果自定义对象作为Map的键,那么必须重写hashCode和equals。
String重写了hashCode和equals方法,所以可我们可以使用String对象作为key来使用。
使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样的数组,大小就是list.size();
直接使用toArray无参方法存在问题,此方法返回值只能是Object[]类,若强制其他类型数组将会出现ClassCastException错误。
List<String> list = new ArrayList<String>(2);list.add("guan");list.add("bao");String[] array = new String[list.size()];array = list.toArray(array);
使用 toArray 带参方法,入参分配的数组空间不够大时,toArray 方法内部将重新分配内存空间,并返回新数组地址;如果数组元素大于实际所需,下标为[ list.size() ]的数组元素将被置为 null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致。
使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
String[] str = new String[] { "a", "b" };List list = Arrays.asList(str);
第一种情况:list.add(“c”); 运行时异常。
第二种情况:str[0]= “gujin”; 那么 list.get(0)也会随之修改。
在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,不然 Arrays.sort,Collections.sort 会报 IllegalArgumentException 异常。
1) 自反性:x,y 的比较结果和 y,x 的比较结果相反。
2) 传递性:x>y,y>z,则 x>z。
3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同。
反例:下例中没有处理相等的情况,实际使用中可能会出现异常:
new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getId() > o2.getId() ? 1 : -1; }}
使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历。
keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出key 所对应的 value。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效率更高。如果是 JDK8,使用 Map.foreach 方法。
values()返回的是 V 值集合,是一个 list 集合对象;keySet()返回的是 K 值集合,是一个 Set 集合对象;entrySet()返回的是 K-V 值组合集合。
高度注意 Map 类集合 K/V 能不能存储 null 值的情况:
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式更加明确线程池的运行规则,规避资源耗尽的风险。
Executors返回的线程池对象的弊端如下:
1)FixedThreadPool和SingleThreadPool:
允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
2)CachedThreadPool和ScheduledThreadPool:
允许的创建线程数量为Inger.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其art任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。
使用CountDownLatch进行异步转同步操作,每个县城退出前必须调用countDown方法,线程执行代码注意catch异常,确保countDown方法可以执行,避免主线程无法执行至countDown方法,直到超时才返回结果。
注意,子线程跑出异常堆栈,不能再主线程try-catch到。
java.util.Objects工具类
Java.util.Objects是Java 1.7引入的,主要是对对象的一些常用操作,比如compare、equals/deepEquals、hash/hashCode、isNull/nonNull、requiredNonNull、toString这12个常用方法。
java的方法签名
方法签名由方法的名称和它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。需注意的是,方法签名既不包含返回类型,也不包含 params 修饰符(它可用于最右边的参数)。
实例构造函数签名由它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。具体说来,实例构造函数的签名不包含可为最右边的参数指定的 params 修饰符。
- 【JAVA】Java基础知识总结
- 【Java】Java基础知识总结
- JAVA基础知识精华总结
- JAVA基础知识精华总结
- JAVA基础知识精华总结
- JAVA基础知识精华总结
- JAVA基础知识总结
- JAVA基础知识精华总结
- JAVA基础知识精华总结
- JAVA基础知识精华总结
- JAVA基础知识精华总结
- JAVA基础知识精华总结
- JAVA基础知识精华总结
- Java基础知识精华总结
- JAVA 基础知识总结
- JAVA基础知识精华总结
- JAVA基础知识精华总结
- JAVA基础知识精华总结
- Ubuntu14.04 下安装sublime Text3
- sprintf数据长度疑惑
- C++实验4
- JIRA系统CentOS系统下的开机启动设置
- 【BZOJ 1049】【HAOI 2006】数字序列【DP】
- Java 基础知识总结
- 学习PHP过程中的一些常见代码优化问题
- Linux下curses光标控制
- Swift之CIImage、CGImage、UIImage之间的相互转换
- 1103
- Java文件流下载
- 微信网页授权(senparc sdk 和 微信原接口)
- 商之翼小京东+ucenter1.6.0+discuz3.3整合经历
- 如何使用SIGINT捕捉kill信号