集合
Vector,HashTable,Stack,StringBuffer,String类都是线程安全的。
哈希表中的链表指的是单向链表
LinkedHashSet继承了HashSet,在HashSet中有单独给LinkedHashSet提供了一个构造方法,是用LinkedHashMap构造的,然后LinkedHashMap继承了HashMap,又调用了HashMap的构造方法。
所以LinkedHashSet实际使用的HashMap的构造方法。
数组和集合区别:
数组大小不可变,只能存放同一种数据类型,可以存放基本数据类型和引用数据类型。
集合大小可变,可以存放不同种数据类型,只能存放引用类型,(基本数据类型自动封装箱)
文章目录
本文是List集合
Set集合看:Set集合
Map集合看:Map集合
集合案例,斗地主
ArrayList 、LinkedList 与Vector的区别?
ArrayList
底层 可变大小的数组 。查询快 ,增删慢。线程不安全
LinkedList
底层 双向链表,查询慢 ,增删快。线程不安全
Vector
线程安全的,用法 同ArrayList。
集合迭代Iterator
为什么要设计Iterator迭代器
遍历和实现分离(迭代器设计模式)
- 首先使用迭代器适用性强,因为如果用for循环遍历,需要事先知道集合的数据结构,而且当换了一种集合的话代码不可重用要修改,不符合开闭原则。而Iterator是用同一种逻辑来遍历集合。
- 其次使用Iterator可以在不了解集合内部数据结构的情况下直接遍历,这样可以使得集合内部的的数据不暴露。更安全。
注意1:next(),hasNext()
1next()
是直接获取下一个的值,从第一个开始。
2hasNext()
是判断最后一个next()
的指针还有没有下一个,如果之前没有next()
就看有没有第一个元素,只是个判断,不移动指针
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Iterator<Integer> it = list.iterator();
System.out.println(it.next());//1
System.out.println(it.next());//2
System.out.println(it.next());//3
System.out.println(it.next());//4
// next()是直接获取下一个的值,从第一个开始。
// hasNext()是判断最后一个next()的指针还有没有下一个,如果没有next()就看有没有第一个,只是个判断,不移动指针
System.out.println(it.hasNext());//false
System.out.println(it.hasNext());//false
System.out.println(it.hasNext());//false
System.out.println(it.hasNext());//false
System.out.println(it.hasNext());//false
System.out.println(it.hasNext()); //false
}
}
注意2:删除集合元素细节
for循环遍历时,不能使用集合方式删除元素。即remove(obj/index),可能会导致ConcurrentModificationException 并发修改异常。(因为在遍历的时候,删除会少一个元素,导致遍历循序变化,少一个索引值就都变了。增强for底层也是迭代器,在for的时候固定了一个迭代器,删除同样会使循序变乱)
要用迭代器的remove()方法删除
public class 自定义类元素的删除问题 {
public static void main(String[] args) {
ArrayList<Worker> list=new ArrayList<>();
list.add(new Worker("马六", 30));
list.add(new Worker("王五", 30));
list.add(new Worker("六七", 30));
list.add(new Worker("赵四", 30));
//删除姓名为马六的工人。
//for循环
/*for(Worker w:list) {
if(w.name.equals("马六")) {
// 当在遍历时,使用集合的删除方法,可能会导致ConcurrentModificationException 并发修改异常。
list.remove(w);
}
}*/
//建议使用迭代器删除
Iterator<Worker> it = list.iterator();
while(it.hasNext()) {
Worker w = it.next();
if(w.name.equals("马六")) {
it.remove();
}
}
System.out.println(list);
}
}
注意3:List常用方法中需要注意的
add(index,Element)
;//向指定索引位置插入元素。
是插入
,必须在有元素的旁边或中间插入
set(int index, E element)
将index位置的元素替换为参数。
subList(int fromIndex, int toIndex)
截子集合 包括开始索引不包括 结束索引
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a");//0
list.add("b");//1
// list.add(3,"d");//会报越界异常
list.add(2,"c");
System.out.println(list);
}
List接口特有的迭代器的特有方法
listIterator()
返回ListIterator
迭代器。该迭代器是List集合特有的迭代器。
1》hasPrevious()
判断集合中是否存在元素,逆序遍历。(从第一位开始,如果从第一位直接判断,是false)
2》previous()
返回集合中的元素 ,逆序遍历。
List遍历方法
1》 通过数组
toArray() 转换为对象数组
2》 Iterator。
iterator() 返回迭代器接口对象。
3》for循环
4》listIterator
5》增强for
LinkedList的其它特点:
可以当做堆栈与队列使用。
1> 栈 : 先进后出
(1) 压栈 : 进入栈中
(2) 弹栈: 出栈。
2> 队列:先进先出
Vector常用方法
1》elements()
相当于迭代器iterator
2》hasMoreElements
--》 hasNext()
判断集合中是否存在元素
3》nextElement
--》 next()
返回集合中的元素
Collections工具类
1.binarySearch(List<? extends Comparable<? super T>> list, T key)
采用二分法查找集合中是否存在该元素,返回索引值,要求该集合是一个有序的集合。
2.fill(List<? super T> list, T obj)
替换用obj 替换list集合中的元素。
3.reverse(List<?> list) 反转 倒序
4.shuffle(List<?> list)
随机置换,用来打乱集合顺序(重要)
5.sort(List list)
按照元素的自然顺序进行List集合的升序排序。(还有一个sort()用自定义的Comparator接口)