第11章 持有对象
程序员文章站
2024-03-17 18:41:34
...
首先想说持有这词用的真好
基础知识
图描述:图中只有四种容器:Map , List , Set 和 Queue . 常用的容器用黑色的粗线框表示。(点线框表示接口,实线框表示普通的(具体的)类。带有空闲箭头的电线表示一个特定的类实现了一个接口,实心箭头表示可以生成箭头所指向类的对象。)
java有多种方式保存对象,更确切的说是对象的引用
- java容器类可以划分为两个不同的概念: Collection: 一个独立的序列 (所有的Collection,都可以用foreach) Map: 一组成对的键值对对象
- 常用的有4类容器:set map list queue
- list必须按照插入的顺序保存元素
- set不能有重复的元素
- queue按照排队的规则来确定对象的产生顺序(通常与插入的顺序相同)
-
@Suppress warnings('unchecked')
可以压制警告信息 - 向上转型也可以像其他类型一样作用于泛型(其实子类可以存放进具有父类约束的容器中):
class GrannySmith extends Apple {}
class Gala extends Apple {}
class Fuji extends Apple {}
class Braeburn extends Apple {}
public class GenericsAndUpcasting {
public static void main(String[] args) {
ArrayList<Apple> apples = new ArrayList<Apple>();
apples.add(new GrannySmith());
apples.add(new Gala());
apples.add(new Fuji());
apples.add(new Braeburn());
for(Apple c : apples)
System.out.println(c);
}
}
- 向容器中添加一组元素:
Collection<Integer> collection =
new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
Integer[] moreInts = { 6, 7, 8, 9, 10 };
collection.addAll(Arrays.asList(moreInts));
// Runs significantly faster, but you can't construct a Collection this way:
Collections.addAll(collection, 11, 12, 13, 14, 15);
Collections.addAll(collection, moreInts);
注意:Arrays.asList(*)其底层表示的还是数组,因此不能调整尺寸
List<Integer> list = Arrays.asList(16, 17, 18, 19, 20);
list.set(1, 99); // OK -- modify an element
// list.add(21); // Runtime error because the
// underlying array cannot be resized.
- Collection的打印风格:[rat, cat, dog, dog]
- Map的打印风格:{dog=Spot, cat=Rags, rat=Fuzzy}
- ArrayList和LinkedList都是list类型,它们都可以保存元素的顺序,只是在某些操作上的性能不同
- 注意:对于内置对象,java负责编写了equals方法,但是自己编写的类,却没有 -
set
- set对于每个值都只保存一个对象
- HashSet使用最复杂的技术保存对象,但是能够最快的获取元素,但不能保持顺序。TreeSet按照比较的结果升序保存对象。LinkedHashSet按照添加的顺序保存对象,同时保存了HashSet的查找速度
- set不保存重复的元素
- TreeSet将元素存储在红-黑树的数据结构中,二HashSet使用的是散列函数。LinkedHashList因为查询速度的原因也使用了散列。
map
- map也有HashMap, TreeMap, LinkedHashMap,性质同Set. -
list
- 有两种基本类型:
- ArrayList: 擅长于随机访问,插入和删除操作较慢
- LinkedList:擅长插入和删除,随机访问相对较慢
Queue
- 队列在并发任务中非常的重要
- LinkedList 提供了方法以支持队列的行为,并且它也实现了 Queue 接口.
- offer() 将一个元素插入到队列尾,或者返回 false
- peek() 和 element() 都在不移除的情况下返回队头, 但是peek()方法在队列为空时,返回null element() 会抛出NoSuchElementException异常
- poll() 和 remove() 方法将移除并返回队头, 在队列为空的时候,poll会返回null, remove会抛出NoSuchElementException异常
-
PriorityQueue
- 当时用 offer() 插入一个对象的时候,这个对象会在队列中被排序。默认的排序是使用对象在队列中的 自然顺序,但是可以通过Comparator来修改这个顺序。 -
下一篇: 线程状态