Object超类
在Java中,如果一个类没有明确地指出超类,那么Object就是这个类的超类。实际上,Object类是所有类超类,这个类定义了一些重要的方法。
...在Java中,如果一个类没有明确地指出超类,那么Object就是这个类的超类。实际上,Object类是所有类超类,这个类定义了一些重要的方法。
...这是Java方法调用的2个术语,用来描述Java虚拟机方法调用的2种机制。
...原子性一般指原子操作,原子操作不能被线程调度机制中断,一旦操作开始,那么它一定可以在可能发生的上下文切换之前完成。Java语言规范规定了对基本对象(long和double除外)的读写操作是原子的。
不能将原子性和同步划等号!更不能使用原子性来代替同步,当你想使用原子性代替同步写出无锁代码时,思考 Brain Goetz 的建议:
...If you can write a high-performance JVM for a modern microprocessor, then you are qualified to think about whether you can avoid synchronizing.
LinkedHashMap
(链表散列映射)是HashMap
的导出类,像LinkedHashSet
与HashSet
的关系一样。
其与HashMap
的差别在于其使用LinkedList
来维护键值对插入的顺序,其插入机制和HashMap
是一致的。
LinkedHashMap
和HashMap
的性能相差不大,与HashSet
和LinkedHashSet
一致:
集合 | 特征 |
---|---|
HashMap | HashMap 基于散列表,插入和查询键值对的开销是固定的 |
LinkedHashMap | 和HashMap 类似,不过其使用LinkedList 维护内部次序,因此其迭代顺序是插入顺序或者LRU(最近最少使用)次序,性能稍差于HashMap |
抽象类是由abstract
关键字修饰的类。将一个普通类用abstract
修饰,它就是抽象类。
若使用abstract
修饰方法,那么称该方法为抽象方法,抽象方法没有方法体。
HashMap
基于散列表,散列表中每一个Node节点(桶)是链表,当两个条目(entry)的key的hash值对桶数(capacity)取模的值相等时,这两个entry会存储在同一个链表中。但当链表中元素达到一定数目时,链表结构会转变为树结构。
本文从初始化,扩容,插入,获取,删除这几个方面深入讨论了HashMap
的实现细节。
...此文中没有讨论
HashMap
中涉及到树结构的源码。
使用synchronized
关键字对整个方法加锁(防止其他线程访问整个方法)往往会带来更大的性能开销,如果你只想保护某些代码块,可以使用同步代码块,这一段被锁保护的代码块就称为临界区( critical section ),前面的显式锁所保护的区域以及使用synchronized保护的代码块都是临界区。
Java 函数式接口和Lambda表达式是 Java 8 中引入的一个重要概念,它允许你将行为作为参数传递给方法,从而实现更简洁、更灵活的代码。
Lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。
...要创建一个任务,通常实现Runnable
接口。不幸的是,Runnable
接口的run()
方法返回void
,因此,其并不适合处理计算任务。
考虑一个经典的问题:用多线程分段计算0-100的加和,我们需要把每个线程计算的值汇总,然后再求和,那么应该怎样获取每个任务返回值呢?
Java提供了Callable
和Future
接口,使任务有提供返回值的能力。