Java核心技术 卷1 基础知识—集合 (2)

ArrayList封装了一个动态再分配的对象数组,但Vector类也能实现该功能
但Vector类的所有方法都是同步的,是线程安全的,而ArrayList方法不是同步的,即非线程安全
若是单线程访问则推荐使用ArrayList类,因为相比之下,ArrayList更快

3.散列集

有一种众所周知的数据结构,可以快速查找所需的对象,这既是散列表(hash table)
散列表为每个对象计算一个整数,称为散列码(hash code)
具有不同数据域的对象将产生不用的散列码

在Java中,散列表使用链表数组实现

Java集合类库中,提供了一个HashSet类,它实现了基于散列表的值,用add方法添加元素
contains方法快速地查看是否某个元素已经出现在集合中

散列集迭代器将依次访问所有的桶
由于散列将元素分散在表的各个位置,所以访问它们的顺序几乎是随机的
当不关心集合中的元素顺序时才应该使用HashSet

4.树集

TreeSet与散列集十分相似,不过,它比散列集有所改进
树集是一个有序集合
可以以任意顺序插入到集合中。在对集合进行遍历时,每个值将自动按照排序后的顺序呈现

Set<String> set = new TreeSet<>(); set.add("Bob"); set.add("Amy"); set.add("Carl"); for (String s: set) { System.out.println(s); }

每个值将按照顺序打印出来:Amy Bob Carl。

TreeSet的排序是用树结构完成的,当前实现用的是红黑树
红黑树本身就是一个二叉排序树,即每次放入一个元素时,该元素都会被放置在正确的位置上
要使用树集,树集中的元素必须要能够相互比较

5.队列

队列:可以在尾部添加元素,在头部删除元素
有两个端头的队列,即双端队列,可以在头部和尾部用时进行插入或者删除元素

优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索
也就是说,无论何时调用remove方法,总会获得当前优先级队列中最小的元素

优先级队列使用了堆(最小堆)这一数据结构来实现

三.映射 1.基本映射操作

映射用来存放键值对。如果提供了键,就能找到值
Java中提供了两个映射的通用实现:HashMap和TreeMap。这两者都实现了Map接口
HashMap对键进行散列
TreeMap是用键的整体顺序对元素进行排序,并将其组织成搜索树

Map<String,String> staff = new HashMap<>(); /*使用put方法来添加元素*/ staff.put("987-98-996","harry"); staff.put("123-456-789","Alice"); String; /*使用get方法来检索对象*/ String value = staff.get(id); System.out.println(value); /*当key不能存在时,一般会返回null*/ /*使用getOrDefault方法,可以指定key不存在时返回的值*/ String errorId="123"; String defaultValue = staff.getOrDefault(errorId,"0"); System.out.println(defaultValue); /*迭代处理映射的键和值*/ staff.forEach((k,v)-> System.out.println("k="+k+"v="+v)); 2.映射视图

集合框架不认为映射本身是一个集合
不过,可以得到映射的视图——这是实现了Collection接口或者某个子接口的对象
对应的映射视图有:

Set<K> keyset() Collection<V> values() Set<Map.Entry<K,V>> entrySet()

上述的三个方法会分别返回键集、值集合以及键/值对集
于是,可以得到我们Map的对应的遍历方法

Map<Integer,String> map = new HashMap<>(); map.put(1,"hello"); map.put(2,"world"); //对应的遍历方法 // 1.keySet for(Integer key:map.keySet()){ System.out.println(key); System.out.println(map.get(key)); } //2.values for(String value:map.values()){ System.out.println(value); } //3.enterSet for(Map.Entry<Integer, String> entry:map.entrySet()){ System.out.println(entry.getKey()); System.out.println(entry.getValue()); } 四.遗留的集合

HashTable类
HashTable类与HashMap类的作用一样
实际上它们拥有相同的接口
与Vector类一样,HashTable也是同步的
如果对同步性或者遗留代码的兼容性没有任何要求,就应该使用HashMap
如果需要并发访问,则要使用ConcurrentHashMap

枚举
遗留集合使用Enumeration接口对元素顺序进行遍历。
该接口有两个方法:hasMoreElements和nextElement。

属性映射
属性映射(property map)是一个类型非常特殊的映射结构。

键与值都是字符串

表可以保存得到一个文件中,也可以从文件中加载

使用一个默认的辅助表

实现属性映射的Java平台类称为Properties

属性映射通常用于程序的特殊配置选项


从1.0版本开始,标准类库中就包含了Stack类,有push和pop方法
还有peek方法,返回栈顶元素却不弹出

位集
Java的BitSet类用于存放一个位序列。
如果需要高效地存储位序列(例如,标志)就可以使用位集。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzsxzf.html