第3章 集合主题
List的行为:
List是除数组之外最基本的对象存储和检索方式,基本操作如下:
Set的行为:
Set的意义在于测试成员身份,也可以用于删除重复元素。
Map的函数式操作是由Map.Entry对象组成的Set。这个Set又包含了stream 和parallelStream方法。
TreeMap 和 ConcurrentSkipListMap 都实现了NavigableMap 接口,这个接口的目的是解决需要选择某个 Map中部分元素的问题。
填充集合:
第一个参数表示列表大小,第二个参数表示要添加的对象。
该方法生成的列表是固定数组大小,无法再通过其他方法添加元素,不然会报错。
public class FillTest {
public static void main(String[] args) {
List stringList = Collections.nCopies(4, "hello");
System.out.println(stringList);
stringList.add("88");
System.out.println(stringList);
}
}
2. Colletions.fill()
第一个参数表示非空的数组,第2个参数是待添加的对象数据。
该方法是用第2个参数覆盖第一个参数数组里的所有元素。
public class FillTest {
public static void main(String[] args) {
List stringList = new ArrayList<>();
stringList.add("99");
System.out.println(stringList);
Collections.fill(stringList, "hello");
System.out.println(stringList);
}
}
Set与存储顺序:
集合
行为
Set接口
向Set中添加的每个元素都必须是唯一的,Set不会添加重复的元素。被添加到Set中的对象必须至少定义了equals方法,用以确定确定对象的唯一性。Set继承了Collection,而且没有添加任何东西。Set接口不保证以任何特定的顺序维护元素
HashSet
用于对快速查找时间要求较高的Set,要添加的元素必须定义hashcode和equals方法
TreeSet
有序的Set,底层是一个树结构。通过这种方式,我们可以从某个Set提取出一个有序的序列。要添加的元素必须实现Comparable接口。
LinkedHashSet
拥有HashSet的查找速度,但是内部使用了一个链表维护者我们添加元素的顺序,即插入顺序。因此,当我们在这个Set上迭代时,结果是以插入顺序出现的。要加入的元素必须定义hashcode和equals方法。
Queue:
给一端放入元素,从另一端取出元素。
PriorityQueue,优先级队列,要求放入队列中的对象实现了Comparable接口,并重写compareTo方法。
Deque,双端队列,可以在任意一端添加和移除元素。
Map:一组键-值对的集合。
集合
行为
HashMap
基于哈希表实现,使用这个类代替旧的HashTable,提供了常数时间的键值对插入和定位性能。可以通过构造器来调整其性能,因为构造器支持设置这个哈希表的容量capacity 和负载因子 load factor
LinkedHashMap
类似于HashMap,但是在便利时会以插入的顺序或最近最少使用LRU的顺序获得键值对。除遍历之外,性能比HashMap稍低。对于遍历情况,因为它用了链表来维护内部顺序,所以更快一些。
TreeMap
基于红黑树实现,当我们查看键或者键值对时,会发现他们是有序的(顺序通过Comparable或者Comparator来确定)。TreeMap的要点是,我们会以有序的方式得到结果。TreeMap是唯一提供了subMap方法的Map,它会返回树的一部分。
WeakHashMap
由弱键组成的Map,该映射锁引用的对象可以被释放。它是为解决特定类型的问题而设计的。如果在这个映射之外,已经没有指向某个特定键的引用,那么可以对这些健进行垃圾收集。
ConcurrentHashMap
线程安全的Map,没有使用同步锁。
IdentityHashMap
哈希映射,它使用 == 而不是equals 来比较键。仅用于解决特殊类型的问题,并非通用。
第4章 注解
注解是一个很受欢迎的Java新特性,它是一种结构化且接受类型检查的向代码中添加元数据的方法,并且不会导致代码被渲染得混乱和不可读。
它可以帮助我们免除部署描述文件和其他生成文件的编写工作。
Java中仅有少量的注解。
Java5引入了3个注解:
Java7引入:
Java8引入:
还有几个注解是用于创建注解时使用的。
定义注解:
注解的定义要求必须要有元注解@Target和@Retention。
@Target定义了该注解可以在何处应用,例如方法或字段。
@Retention定义了该注解在源代码(SOURCE)、类文件CLASS、运行时RUNTIME中是否可用。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
}
注解通常包含一些可以设定值的元素,元素看起来比较像接口的方法,只不过可以指定默认值,非null的。
没有任何元素的注解被称为标记注解。
元注解:
注解里的元素
注解元素默认值不能为null,因为这导致很难让处理器去判断某个元素存在与否,但是可以通过检查该元素是否为特殊值来绕过这个限制。
注解不支持继承:
无法对@interface 使用 extends关键字。但是可以在注解里嵌套其他注解来优雅的去实现此效果。
注解的解析:
使用到Java的反射机制,class对象中的getAnnotation方法可以获取这个class上被使用的注解。