Java编程思想读书笔记(11)
第11章 持有对象
Java有多种方式保存对象(对象的引用)。Java类库中提供了一套相当完整的容器类来解决问题,称为集合类。Java容器类都可以自动地调整自己的尺寸。
11.1泛型和类型安全的容器
使用Java泛型来创建类会非常复杂,所以通常用预定义的泛型(如:ArrayList<Apple> apples=new ArrayList<Apple>())。
练习1:创建一个新类Gerbil,包含int gerbilNumber,在构造器中初始化它。添加一个新方法hop(),用以打印号码和它正在跳跃的信息。创建一个ArrayList,并向其中添加一串Gerbil对象。使用get()遍历List,并且对每个Gerbil调用hop()。
import java.util.ArrayList;
//P218练习一
public class Gerbil {
int gerbilNumber;
public Gerbil(int gerbilNumber) {
this.gerbilNumber=gerbilNumber;
}
public void hop() {
System.out.println(gerbilNumber+"正在跳跃!");
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
ArrayList<Gerbil> gerbillist=new ArrayList<Gerbil>();
for(int i=1;i<11;i++) {
Gerbil gerbil=new Gerbil(i);
gerbillist.add(gerbil);
}
for(int i=0;i<10;i++) {
gerbillist.get(i).hop();;
}
}
}
结果如下:
11.2基本概念
Java容器类类库的作用是保存对象,并将其划分为两个不同的概念。
1)Collection。一个独立元素的序列。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队顺序来确定对象产生的顺序。
2)Map。一组成对的“键值对”对象,允许用键值查找对象。关于容器类的简介参考自:https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Java%20%E5%AE%B9%E5%99%A8.md
1. Set
- HashSet:基于哈希实现,支持快速查找,但不支持有序性操作,例如根据一个范围查找元素的操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。
- TreeSet:基于红黑树实现,支持有序性操作,但是查找效率不如 HashSet,HashSet 查找时间复杂度为 O(1),TreeSet 则为 O(logN);
- LinkedHashSet:具有 HashSet 的查找效率,且内部使用链表维护元素的插入顺序。
2. List
- ArrayList:基于动态数组实现,支持随机访问;查找快。插入删除慢。
- Vector:和 ArrayList 类似,但它是线程安全的;查找慢,插入删除快。
- LinkedList:基于双向循环链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。
3. Queue
- LinkedList:可以用它来支持双向队列;
- PriorityQueue:基于堆结构实现,可以用它来实现优先队列。
- HashMap:基于哈希实现;
- HashTable:和 HashMap 类似,但它是线程安全的,这意味着同一时刻多个线程可以同时写入 HashTable 并且不会导致数据不一致。它是遗留类,不应该去使用它。现在可以使用 ConcurrentHashMap 来支持线程安全,并且 ConcurrentHashMap 的效率会更高,因为 ConcurrentHashMap 引入了分段锁。
- LinkedHashMap:使用链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。
- TreeMap:基于红黑树实现。
11.3添加一组元素,11.4容器的打印省略
11.5List
List可以将元素维护在特定的序列中。List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和移除元素。
- ArrayList
- LinkedList
List允许在创建后添加和移除元素。
方法:
- contains():确定某个对象是否在列表中。
- remove():如果想移除某个对象,就可以将这个对象的引用传递给remove()。
- indexOf():如果有一个对象的引用,可以用indexOf()来发现该对象在List中所处位置的索引编号。
- subList():从较大的一个列表中创建出一个片段。参数为起始索引和结束索引。
- removeALL():移除所有特定的类。
- set(index,Object):替换索引位置的对象。
- addALL():添加列表。
- isEmpty():判断列表是否为空。
- toArray():转换为对象数组。
11.6迭代器
Iterator:
- 使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
- 使用next()获得序列中的下一个元素。
- 使用hasNext()检查序列中是否还有元素。
- 使用remove()将迭代器新近返回的元素删除。
11.7LinkedList
添加了可以将其用作栈、队列和双端队列的方法。
方法:
- getFirst(),element():返回列表的头,并不移除它。如果List为空,则抛出NoSuchElementException。peek()在列表为空时返回null。
- removeFirst(),remove():移除并返回列表的头,列表为空时抛出NoSuchElementException。poll()在列表为空时返回null。
- addFirst(),add(),addLast():将某个元素插入到列表的尾部。
- removeLast():移除并返回列表的最后一个元素。
11.8Stack
方法:
- push(T v):元素入栈。
- peek():返回栈顶元素并不移除。
- pop():元素出栈。
11.9Set
11.10Map
方法:
- get():通过键值得到value。
- containsKey():判断是否含有键值。
- containsValue():判断是否含有某个值。
11.11Queue
LinkedList可以作为Queue的一种实现。
方法:
- offer():允许的情况下,将一个元素插入队尾。
- peek(),element():在不移除的情况下返回队头。队伍为空element()抛出NoSuchElementException,peek()返回null。
- poll(),remove():移除返回队头。队伍为空remove()抛出NoSuchElementException,poll()返回null。
11.11.1PriorityQueue
调用offer()方法来插入对象时,这个对象在队列中会被排序。可通过设定自己的Comparator来修改排序规则。PriorityQueue可以确保当你调用peek()、poll()、remove()方法时,获取的是队列中优先级最高的元素。
上一篇: MySQL自定义函数