容器(接口)
序列:一种存放一组对象的方式
集合:提供一种存储空间可变的存储模型,存储的数据容量可以随时改变
线性结构通常是最慢的查询方式
Collection 单列 [ ]
List:按照特定顺序的保存一组元素 元素可以重复 有索引
- ArrayList:长于随机访问元素,在中间增删
- LinkedList:长于增删,弱于访问 但特性比较多
Set: 元素不能重复(HashSet TreeSet LinkedHashSet) 无索引 无序(存取顺序)
Queue:只允许在容器的一“端”插入对象,并从另外一“端”移除对象
常用方法:boolean add(E e) boolean remove(Object o) void clear()
boolean contains(Object o) boolean isEmpty() int size()
Iterator:
1)作用是遍历并选择序列的对象,不必关心数据机构底层是如何构造的
2)轻量级对象,创建的代价小
3)一般方法都是作用于容器中存储的元素而不是容器本身的
4) 只能单向移动
Collection遍历元素的方式(实现迭代器接口,使用foreach遍历 JDK1.5 Iterable)
Iteratoriterator():返回该集合元素的迭代器迭代器,是依赖于容器而存在的
boolean hasNext() 判断迭代是否有更多元素
E next() 获取迭代中当前元素,并使得迭代器指向下一个元素
(expectedModCount == ModCount) 不能用于添加元素会破坏上面等式的平衡ConcurrentModificationException(并发修改异常):产生原因为迭代器遍历元素中,通过集合对象修改了元素,造成了判断预期修改值和实际修改值不一致
listIterator(列表迭代器):boolean hasNext() E next()
boolean hasPrevious() E previous()
可以使用该方法进行元素添加,因为方法会将实际修改值赋值给预期修改值
Collection和Iterator
Collectin是描述所有顺序容器的共性的根接口,可能被认为是一个“附属接口”,java将容器和迭代器这两种形式绑定在一起,因为实现容器就意味着需要提供迭代器的方法
Collection和Iterator都可以将方法和底层容器的特定实现解耦
生成Iterator是将队列和消费队列的方法连接在一起耦合度最小的方式,并且和Collection相比,它在序列类上施加的约束也少很多
数据结构:
栈 Stack
后进先出 Last in First out LIFO 叠加栈
LinkedLsit可以实现栈数据结构
peek() pop() push() empty() toString()
队列 Queue (PriprityQueue BlockingQueue)
FIFO first in first out
用作一种可靠的将对象从程序的某个区域传输到到另外一个区域的途径,在并发编程中特别重要 可以通过LikedList实现
Queue接口的方法:offer()-元素插入到队尾,或者返回false
PriorityQueue:
优先级队列声明下一个弹出的元素是最需要的元素(优先级别最高的元素)
在PriorityQueue中使用offer() 会插入元素后,对该元素进行排序在PriorityQueue中使用自己的类,必须包括额外的功能以产生自然排序,或者必须提供自己的Comparator
Set:
定义hashCode()和equals方法确保对象的唯一性不保存重复的元素,查找是该容器中最重要的操作输出顺序的不一致,是由于它们不是遵照索引顺序的形式进行排列,而是通过自身的底层代码去实现输出的元素顺序没有带有索引的方法
-
HashSet 专门对快速查找进行优化 散列函数 定义hashCode方法
底层数据结构是哈希表
哈希表底层是数组+链表,元素为节点,使用神秘的顺序保存所有元素 -
LinkedHashSet: 使用了散列
-
底层实现是哈希表和链表,具有可预测的迭代次序
按照元素插入的顺序保存元素由链表保证元素有序,由哈希表保证元素唯一(haseCode()和equals()) -
TreeSet 红黑树数据结构 实现Comparable接口
元素有序,这里的顺序不是指的是存储的顺序,而是按照一定规则进行排序, 具体排序排序方式取决于构造方法:
TreeSet():根据元素的自然排序进行排Comparable TreeSet(Comparator
comparator):根据指定的比较器进行排序 Comparable 自然排序 内部比较器
TreeSet去重原理:调用两个比较器的返回值作判断
Map 双列 { = } Map:将对象映射到对象的能力
成对的“键值对” 在每个槽内保存两个对象,即键和与之关联的值
1、 双列
2、 操作对键有效
3、 键映射值 哈希表去重
4、 不能够直接遍历,只能通过keySet()和entrySer()间接遍历
Map.put(key,value) Map.get(key)
HashMap 提供最快的查找数据的方法
TreeMap 按照比较结果的升序保存键
LinkedHashMap按照存储顺序保存键,同时还保留了HashMap的查找速度
理解hashCode()-散列函数 bucket(桶) 通常使用质数
散列码—数组并不保存键本身,而是通过键对象生成一个数字,将其作为数组的下标。如果散列函数比较优秀,只会产生很少的list的元素不是查询整个List,而是快速地跳到数组的某个位置,只是对很少的元素进行比较,这就是hashMap会如此快的缘故
快速报错
Java容器有一种保护机制,能够防止多个线程同时修改同一个容器的内容探查容器上的任何除了你的进程所进行的操作以外的所有变化,一旦发现其他进程修改了容器,就会抛出并发修改异常