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 值的情况:

集合类 Key Value Super 说明 Hashtable 不允许null 不允许null Dictionary 线程安全 ConcurrentHashMap 不允许null 不允许null AbstractMap 分权锁技术 TreeMap 不允许null 允许null AbstractMap 线程不安全 HashMap 允许为null 允许为null AbstractMap 线程不安全

线程池不允许使用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 修饰符。

0 0
原创粉丝点击