容器:在实际开发中,需要将使用的对象存储于特定数据结构的容器中,基本类型为list,set,queue,map
java容器类类库的作用是保存对象:
1.collection:一个独立元素的序列,这些元素符合一条或多条规则,list指必须按照插入的顺序保存元素,而set不能有重复元素,queue指按照排队规则来确定对象产生的顺序
2.map:键值对对象。
collection(接口)中包含两个子接口(list,set):list为可重复集,map为不可重复集
迭代器iterator用于遍历集合的元素,删除时调用remove,remove方法必须跟在next方法的后面并且不能连续remove,除非再次next方法遍历
增强for循环:java1.5之后支持,编译器会在编译阶段自动转为迭代器模式
list中常见实现类:arraylist(动态数组):适合随机访问,linkedlist(链表,添加了作为栈,队列,双端队列的方法):适合插入和删除数据,具体实现例如:Queue<Integer> q = new LinkedList<Integer>();向上转型实现
list中集合转数组:toarray,数组转集合:aslist
collections为集合的工具类,提供了许多便于操作集合的方法
collections.sort()方法进行集合的排序,使用collection.sort排序的集合元素必须是comparable接口的实现类(bean继承comparable)并且需要重写抽象方法 int compareTo(T t)
如果需要在排序的操作中临时指定比较规则,可以使用comparator接口的回调方法,并重写int compareTo(T t1,T2)
队列(queue):先进先出:使用linkedlist实现
deque:queue的子接口,为双端队列,如果将deque限制为只从一端入队与出队,则可以实现栈(stack)的数据结构
hashset:使用了复杂的方式来存取数据,但其为最快获取元素的方式
treeset:按照比较结果的升序保存对象
linkedhashset:按照被添加的顺序保存对象
hashmap:提供了最快的查找技术(hashset为map封装后的数据结构),数据结构为hash表
treemap:按照比较结果的升序来保存对象,数据结构为内部排序的二叉树
linkedhashmap:按照插入顺序保存,同时保留了haspmap的查询速度(底层为hash表与双向循环链表共同实现)
新程序中不应该使用过时的vector,hashtable,stack
hash表原理:通过key值获得hashcode调用hash算法(hash算法例如16的取余等)确定将要存储的空间(bucket:一般为16个,并且以链表的形式存在),然后调用equals的方法和bucket找到对应的bucket后的链表(每个bucket都对应一个链表),在链表后依次递加
hashcode方法是在object方法中定义的,应该被妥善重写(object中的方法返回该对象的整数内存地址)
重写hashcode的注意点:
1.与equls方法的一致性,equals为true的两个对象的hash值应该相同
2.hashcode返回值应该符合hash算法的要求,一般可以使用ide工具提供的自动生成hashcode的方法
map遍历的方式:使用set方式遍历key或者遍历键值对
书籍:(java编程思想)