第十一章 持有对象

集合类:List、Set、Queue、Map

11.1 泛型和类型安全容器

ArrayList apples = newArrayList(); //可以存放任何object

ArrayList<Apple> apples= new ArrayList<Apple>();//声明只能存放apple类型,是更安全的。

get() size() add()等常用函数。

 

11.2 基本概念

java容器类类库:保存对象。分:Collection和Map

Collection:一个独立元素的序列,这些元素都服从一条或多条规则。

Map:一组成对的“键值对”对象,允许使用键来查找。

Set在add()时,有去除重复的检查。

 

11.3 添加一组元素

[1]   向一个Collection中添加一组元素,Arrays.asList(),Collection.addAll()

[2]   List<Integer> list =Arrays.asList(14,15); 初始化的list,无法修改大小,底层仍然是数组。

[3]   AsList(a,b)返回类型根据决定的,不能自动向上转型,可以显式转换。

List<Snow> snow4 =Arrays.<Snow> asList(new Light(), new Heavy());

[4]   Map更复杂,只能使用另一个Map来初始化。

 

11.4 容器的打印

数组打印要Arrays.toString(),容器打印可以直接使用System.out.print();

List:ArrayList 和LinkedList,按插入顺序保存元素,不同在于执行某些操作时的性能。

Set:HashSet,最快获取元素,保存顺序无意义;TreeSet,按增序存储;LinkedSet,按插入顺序保存。

Map:添加是put(key,value),HashMap,TreeMap,LinkedMap保存顺序与对应名称一样。后面键相同的插入,会覆盖掉之前键对应的值

 

11.5 List

将元素维护在特定的序列中。

ArrayList 随机访问元素,插入删除较慢

LinkedList 插入删除代价低,随机访问比较慢

有很多方法sort() , remove(), add(),containAll(), 等等

从一个list中生成sublist,删除list中的sublist时,要先copy再,copy.removeAll(sublist),再将copy赋值给list. 否则会有CurrentModifyException

 

11.6 迭代器

是一个对象,用来遍历并选择序列中的对象。轻量级对象,创建代价小。

Iterator只能单向移动,只有四种操作,

[1]   Iterator()返回一个Iterator(序列中的第一个元素);

[2]   next()获取下一个元素;

[3]   hasNext()是否有其他元素;

[4]   remove()将迭代器新近返回的元素删除。

迭代器统一了对容器的访问方式。

Iterator<String> it =list.iterator(); //获取迭代器

ListIterator可以双向移动,set()方法替换访问的最后一个元素,hasPrevious()等

ListIterator<String> it= list.listIterator();

 

11.7 LinkedList

执行插入删除操作时更高效,还添加了可以用作栈,队列或双端队列的方法。poll() peek()

removeFirst() , addFirst(), offer()等。

 

11.8 Stack

栈:先进后出。

LinkedList 可以很好的实现Stack的功能,pop() push()等。默认包在java.util.Stack

栈可以用来表达式求值。

 

11.9 Set

Set不保存重复元素,经常被使用来测试归属性,测试某个对象是否在Set中。

要求查找效率高,多用HashSet,使用了散列,输出是无序的。

TreeSet可以按序(字典序)输出,可以传入构造器,修改字典序结构不区分大小写。

Set<String> words = newTreeSet<String>(String.CASE_INSENSITIVS_ORDER);

 

11.10 Map

[1]   Map由键和值两部分组成,键相当于Set,值相当于Collection。整体是Set,不能重复。Map<Integer,Integer> m =new HashMap<Integer,Integer>();

[2]   扩展,Map中的键和值可以是对象或容器。

[3]   Map<Person, List<?extends Pet>>  petPeople = newHashMap<Person, List<? extends Pet>>(); “?”就是通配符,而“? extends Pet”则表示通配符“?”的上界为Pet,换句话说就是,“? extends Pet”可以代表Pet或其子类,可代表不了Pet的父类(如Object),因为通配符的上界是Pet

 

11.11 Queue

[1]   先进先出,用作将对象从程序的某个区域传输到另一个区域,LinkedList实现了Queue接口。Queue<Integer> q = newLinkedList<Integer>();

[2]   q.offer()将元素插入队尾,peek() element()返回队头不删除,poll() remove()返回队头且删除。

[3]   优先级队列,PriorityQueue<Integer> q = new PriorityQueue<Integer>();下一个弹出的元素是最需要的,即优先级最高的。插入对象时,会被排序(通过自己提供的Comparator),默认是自然排序(从小到大)。

 

11.12 Collection 和Iterator (待看懂 )

[1]   Collection是描述所有序列容器的共性的根接口,附属接口,抽象出来的。

[2]   使用接口是它可以使我们能够创建更通用的代码。

[3]   C++中没使用任何公共基类,共性通过使用迭代器来完成。

[4]   如果实现Collection,就必须实现iterator(),通过继承AbstractCollection类。

 

11.13 Foreach与迭代器

foreach语法主要用于数组,也可用于任何Iterable(Collection等的基类,也就是List,Set等都可以用foreach。

适配器方法:在默认的向前迭代的基础上,添加向后迭代。不能用覆盖,而是添加可以产生Iterable对象的方法。

Arrays.asList()产生的list对象使用底层数组作为物理存储。

 

11.14 总结

总结非常全面

常用的ArrayList、 LinkedList 、 HashSet 、HashMap

数组不可扩容,容器可以。

过期的不要用Vector、Stack等

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值