集合是java中提供的一种容器,可以用来存储多个数据。
* 数组的长度是固定的。集合的长度是可变的。
数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。
迭代器
Iterator接口
在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口`java.util.Iterator`。`Iterator`接口也是Java集合中的一员,但它与`Collection`、`Map`接口有所不同,`Collection`接口与`Map`接口主要用于存储元素,而`Iterator`主要用于迭代访问(即遍历)`Collection`中的元素,因此`Iterator`对象也被称为迭代器。
* `public E next()`:返回迭代的下一个元素。
* `public boolean hasNext()`:如果仍有元素可以迭代,则返回 true。
为什么数组和集合可以使用for循环进行迭代遍历?
解析:所有的数组和集合都实现了Iterable接口,Iterable接口中只有一个方法,iterator方法返回值类型是Iterator类型,我们将思路转到Iterator,我们发现该接口三个方法。hasNext,next和remove,最主要的是hasNext和next。他们在底层帮我们去维护的可以被迭代数组或者集合的迭代策略。
数据结构
栈
栈:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作,先进后出,栈的入口、出口的都是栈的顶端位置。
压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。
弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。
队列
队列:queue,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除,先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。例如,小火车过山洞,车头先进去,车尾后进去;车头先出来,车尾后出来。
数组
数组:Array,是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素。就像是一排出租屋有100个房间从001到100每个房间都有固定编号通过编号就可以快速找到租房子的人
查找元素快:通过索引,可以快速访问指定位置的元素
List
java.util.List 接口继承自 Collection 接口,是单列集合,List接口特点:
1. 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)
2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
List接口中常用方法
public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上
public E get(int index) :返回集合中指定位置的元素。
public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
ArrayList集合
java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,查询效率高,增删效率低,线程不安全。 ArrayList的Object数组初始化jdk1.7长度为10,1.8不添加数据默认为0,如果我们存储满了这个数组,需要存储第11个对象,扩容成原来的 1.5 倍,并将原数组内容和新的元素一起加入到新数组,
Vector
线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的
扩容成原来 2 倍
LinkedList集合
java.util.LinkedList 集合数据存储的结构是链表结构,是线性的数据存储方式,所以需要移动指针从前往后依次查找。方便元素添加、删除的集合。
public void addFirst(E e) :将指定元素插入此列表的开头。
public void addLast(E e) :将指定元素添加到此列表的结尾
public E getFirst() :返回此列表的第一个元素。
public E getLast() :返回此列表的最后一个元素。
public E removeFirst() :移除并返回此列表的第一个元素
public E removeLast() :移除并返回此列表的最后一个元素。
public E pop() :从此列表所表示的堆栈处弹出一个元素。
public void push(E e) :将元素推入此列表所表示的堆栈。
public boolean isEmpty() :如果列表不包含元素,则返回true。
LinkedHashSet
底层是一个哈希表(数组+链表+链表/黑红树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序
哈希表 jdk1.8之前 底层采用数组+链表实现,jdk1.8之后采用数组+链表+红黑树,当链表长度超过8时,转换为红黑树
哈希表(实际上是一个HashMap实例)支持,不保证set的迭代顺序,并允许使用null元素
HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。
LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复
Map map=new HashMap();
map.put("a","a");
map.put("b","b");
map.put("c","c");
Collection values = map.values();
for (String value : values) {
System.out.println(value+""+map.get(value));
}
for (String s : map.keySet()) {
String s1 = map.get(s);
}
Set> entries = map.entrySet();
for (Map.Entry m:entries){
System.out.println(m.getKey()+""+m.getValue());
}
Set keySet = map.keySet();
Iterator iterator = keySet.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(map.get(next));
}
Set> entries1 = map.entrySet();
Iterator> iterator1 = entries1.iterator();
while (iterator1.hasNext()){
Map.Entry next = iterator1.next();
next.getKey();
next.getValue();
}