深入迭代器 -- foreach
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); list.add("eee"); for (String element : list) { System.out.println(element); } /** * 使用foreach循环遍历集合的底层实现: * String element; for(Iterator it = list.iterator();it.hasNext();System.out.println(element)) element = (String) it.next(); */ }
深入迭代器 -- Iterator
深入:Iterator如何遍历元素
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); list.add("eee"); list.remove("bbb"); Iterator<String> it = list.iterator(); while(it.hasNext()){ String element = it.next(); System.out.println(element); } }
需求:使用Iterator遍历元素,遍历到"bbb"时删除该元素
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); list.add("eee"); //modCount - 5 //expectedModCount - 5 Iterator<String> it = list.iterator(); while(it.hasNext()){ it.remove(); String element = it.next(); if(element.equals("bbb")){ //list.remove(element);//modCount - 6 it.remove(); } } for (String element : list) { System.out.println(element); } }
深入迭代器 -- ListIterator
需求:使用ListIterator遍历元素
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); list.add("eee"); ListIterator<String> listIterator = list.listIterator(); while(listIterator.hasNext()){ String element = listIterator.next(); System.out.println(element); } }
需求:使用ListIterator遍历元素,遍历到"bbb"时删除
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); list.add("eee"); ListIterator<String> listIterator = list.listIterator(); while(listIterator.hasNext()){ String element = listIterator.next(); if(element.equals("bbb")){ listIterator.remove(); } } for (String element : list) { System.out.println(element); } }
需求:使用ListIterator遍历元素,遍历到"bbb"时添加"xyz"
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); list.add("eee"); ListIterator<String> listIterator = list.listIterator(); while(listIterator.hasNext()){ String element = listIterator.next(); if(element.equals("bbb")){ listIterator.add("xyz"); } } for (String element : list) { System.out.println(element); } }
需求:使用ListIterator指定下标遍历元素
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); list.add("eee"); ListIterator<String> listIterator = list.listIterator(1); while(listIterator.hasNext()){ String element = listIterator.next(); System.out.println(element); } }
需求:使用ListIterator倒序遍历元素
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); list.add("eee"); ListIterator<String> listIterator = list.listIterator(list.size()); while(listIterator.hasPrevious()){ String element = listIterator.previous(); System.out.println(element); } }
< E > 创建对象时规定类型
-
E - element - 元素
-
T - Type - 类型
-
注意:设置泛型可以有多个
-
<K,V>
-
K - Key 键
-
V - Value 值
-
<N,V>
-
N - name 名
-
V - Value 值
泛型在集合中的使用
public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); list.add(100); list.add(100); list.add(100); System.out.println("-----------------------------"); MyArrayList<Integer> myArrayList = new MyArrayList<>(); myArrayList.add(100); myArrayList.add(100); myArrayList.add(100); }
泛型限定
继承关系:Object.A.B
public static void main(String[] args) { } //?表示任意类型 public static ArrayList<?> method01(){ // ArrayList<Object> list = new ArrayList<>(); // ArrayList<A> list = new ArrayList<>(); ArrayList<B> list = new ArrayList<>(); return list; } //? extends A 表示A类型或者是A的子类类型 public static ArrayList<? extends A> method02(){ // ArrayList<A> list = new ArrayList<>(); ArrayList<B> list = new ArrayList<>(); return list; } //? super A 表示A类型或者是A的父类类型 public static ArrayList<? super A> method03(){ // ArrayList<A> list = new ArrayList<>(); ArrayList<Object> list = new ArrayList<>(); return list; }
package com.qf.generic02; public class A { }
package com.qf.generic02; //此处B继承A public class B extends A{ }
ArrayList的使用
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); //添加数据 list.add("麻生希"); list.add("椎名空"); list.add("水菜丽"); list.add("朝桐光"); list.add("樱井步"); //设置指定下标上的元素 list.set(1, "侯小康"); //获取指定下标上的元素 String str = list.get(1); System.out.println("获取指定下标上的元素:" + str);//侯小康 //获取元素个数 int size = list.size(); System.out.println("获取元素个数:" + size);//5 //在指定下标上添加元素 list.add(2, "杨雪飞"); ArrayList<String> newList1 = new ArrayList<>(); Collections.addAll(newList1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素 list.addAll(newList1);//将newList1中所有的元素都添加到list集合里末尾的位置 ArrayList<String> newList2 = new ArrayList<>(); Collections.addAll(newList2, "xxx","xxx","yyy","yyy","zzz","zzz");//利用集合工具类(Collections)批量添加元素 list.addAll(3, newList2);//将newList2中所有的元素都添加到list集合里指定下标的位置 //清空集合里所有的元素 //list.clear(); System.out.println("判断集合中是否包含指定元素:" + list.contains("侯小康"));//true System.out.println("判断集合中是否包含指定集合:" + list.containsAll(newList1));//true System.out.println("获取元素在集合中第一次出现的下标:" + list.indexOf("ccc"));//12 System.out.println("获取元素在集合中最后一次出现的下标:" + list.lastIndexOf("ccc"));//13 //没有-true,有-false System.out.println("判断集合里是否没有元素:" + list.isEmpty());//false list.remove(9);//通过下标删除元素 list.remove("水菜丽");//通过数据删除元素 list.removeAll(newList1);//将list中有newList1的元素全部删除(去除交集) list.retainAll(newList2);//将list中有newList2的元素全部保留(保留交集) List<String> subList = list.subList(1, 4);//从开始下标处(包含)截取到结束下标处(排他)的元素,返回新的集合 //将集合转换为数组 Object[] array1 = subList.toArray(); System.out.println(Arrays.toString(array1));//[xxx, yyy, yyy] //将集合转换为指定类型的数组 String[] array2 = new String[3]; subList.toArray(array2); System.out.println(Arrays.toString(array2));//[xxx, yyy, yyy] System.out.println("-----------------------------------------"); //遍历集合 -- for循环 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } System.out.println("-----------------------------------------"); //遍历集合 -- foreach for (String element : list) { System.out.println(element); } System.out.println("-----------------------------------------"); //遍历集合 -- Iterator Iterator<String> it = list.iterator(); while(it.hasNext()){//判断是否有可迭代的元素 String next = it.next();//获取下一个元素 System.out.println(next); } System.out.println("-----------------------------------------"); //遍历集合 -- ListIterator ListIterator<String> listIterator = list.listIterator(); while(listIterator.hasNext()){//判断是否有可迭代的元素 String next = listIterator.next();//获取下一个元素 System.out.println(next); } }
HashSet的使用
public static void main(String[] args) { HashSet<String> set = new HashSet<>(); //添加数据 set.add("麻生希"); set.add("椎名空"); set.add("水菜丽"); set.add("朝桐光"); set.add("樱井步"); //获取元素个数 int size = set.size(); System.out.println("获取元素个数:" + size);//5 HashSet<String> newSet1 = new HashSet<>(); Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素 set.addAll(newSet1);//将newSet1中所有的元素都添加到set集合里 //清空集合里所有的元素 //set.clear(); System.out.println("判断集合中是否包含指定元素:" + set.contains("侯小康"));//false System.out.println("判断集合中是否包含指定集合:" + set.containsAll(newSet1));//true //没有-true,有-false System.out.println("判断集合里是否没有元素:" + set.isEmpty());//false set.remove("水菜丽");//通过数据删除元素 set.removeAll(newSet1);//将set中有newSet1的元素全部删除(去除交集) HashSet<String> newSet2 = new HashSet<>(); Collections.addAll(newSet2, "麻生希","水菜丽","樱井步"); set.retainAll(newSet2);//将set中有newSet2的元素全部保留(保留交集) //将集合转换为数组 Object[] array1 = set.toArray(); System.out.println(Arrays.toString(array1));//[樱井步, 麻生希] //将集合转换为指定类型的数组 String[] array2 = new String[2]; set.toArray(array2); System.out.println(Arrays.toString(array2));//[樱井步, 麻生希] System.out.println("-----------------------------------------"); //遍历集合 -- foreach for (String element : set) { System.out.println(element); } System.out.println("-----------------------------------------"); //遍历集合 -- Iterator Iterator<String> it = set.iterator(); while(it.hasNext()){//判断是否有可迭代的元素 String next = it.next();//获取下一个元素 System.out.println(next); } }
HashSet的特点
特点:无序且去重
添加步骤:
1.获取元素的hash值 -- hashCode()
2.通过hash值计算在数组中的下标
3.判断下标上是否有元素
3.1 没有元素 -- 直接添加
3.2 有元素 ---- 判断两个对象是否相同 hash && (==||equals())
3.2.1 相同 -- 不添加数据(达到去重效果)
3.2.2 不相同 -- 形成单向链表(JDK1.7头插法、JDK1.8尾插法)
遍历步骤:
遍历数组(顺序遍历)
注意:添加步骤处理数据的逻辑和遍历步骤处理数据的逻辑不一样,导致无序。
LinkedHashSet的使用
public static void main(String[] args) { LinkedHashSet<String> set = new LinkedHashSet<>(); //添加数据 set.add("麻生希"); set.add("椎名空"); set.add("水菜丽"); set.add("朝桐光"); set.add("樱井步"); //获取元素个数 int size = set.size(); System.out.println("获取元素个数:" + size);//5 LinkedHashSet<String> newSet1 = new LinkedHashSet<>(); Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素 set.addAll(newSet1);//将newSet1中所有的元素都添加到set集合里 //清空集合里所有的元素 //set.clear(); System.out.println("判断集合中是否包含指定元素:" + set.contains("侯小康"));//false System.out.println("判断集合中是否包含指定集合:" + set.containsAll(newSet1));//true //没有-true,有-false System.out.println("判断集合里是否没有元素:" + set.isEmpty());//false set.remove("水菜丽");//通过数据删除元素 set.removeAll(newSet1);//将set中有newSet1的元素全部删除(去除交集) LinkedHashSet<String> newSet2 = new LinkedHashSet<>(); Collections.addAll(newSet2, "麻生希","水菜丽","樱井步"); set.retainAll(newSet2);//将set中有newSet2的元素全部保留(保留交集) //将集合转换为数组 Object[] array1 = set.toArray(); System.out.println(Arrays.toString(array1));//[樱井步, 麻生希] //将集合转换为指定类型的数组 String[] array2 = new String[2]; set.toArray(array2); System.out.println(Arrays.toString(array2));//[樱井步, 麻生希] System.out.println("-----------------------------------------"); //遍历集合 -- foreach for (String element : set) { System.out.println(element); } System.out.println("-----------------------------------------"); //遍历集合 -- Iterator Iterator<String> it = set.iterator(); while(it.hasNext()){//判断是否有可迭代的元素 String next = it.next();//获取下一个元素 System.out.println(next); } }
LinkedHashSet的特点
继承关系:class LinkedHashSet extends HashSet
特点:有序且去重
添加步骤: 在父类HashSet的基础上,添加的元素会存储上一个元素的地址,上一个元素也会存储下一个元素的地址 -- 双向链表
遍历步骤: 找到第一个元素,再向下依次找下一个元素
LinkedList的使用
public static void main(String[] args) { LinkedList<String> list = new LinkedList<>(); //添加数据 list.add("麻生希"); list.add("椎名空"); list.add("水菜丽"); list.add("朝桐光"); list.add("樱井步"); //设置指定下标上的元素 list.set(1, "侯小康"); //获取指定下标上的元素 String str = list.get(1); System.out.println("获取指定下标上的元素:" + str);//侯小康 //获取元素个数 int size = list.size(); System.out.println("获取元素个数:" + size);//5 //在指定下标上添加元素 list.add(2, "杨雪飞"); LinkedList<String> newList1 = new LinkedList<>(); Collections.addAll(newList1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素 list.addAll(newList1);//将newList1中所有的元素都添加到list集合里末尾的位置 LinkedList<String> newList2 = new LinkedList<>(); Collections.addAll(newList2, "xxx","xxx","yyy","yyy","zzz","zzz");//利用集合工具类(Collections)批量添加元素 list.addAll(3, newList2);//将newList2中所有的元素都添加到list集合里指定下标的位置 //清空集合里所有的元素 //list.clear(); System.out.println("判断集合中是否包含指定元素:" + list.contains("侯小康"));//true System.out.println("判断集合中是否包含指定集合:" + list.containsAll(newList1));//true System.out.println("获取元素在集合中第一次出现的下标:" + list.indexOf("ccc"));//12 System.out.println("获取元素在集合中最后一次出现的下标:" + list.lastIndexOf("ccc"));//13 //没有-true,有-false System.out.println("判断集合里是否没有元素:" + list.isEmpty());//false list.remove(9);//通过下标删除元素 list.remove("水菜丽");//通过数据删除元素 list.removeAll(newList1);//将list中有newList1的元素全部删除(去除交集) list.retainAll(newList2);//将list中有newList2的元素全部保留(保留交集) List<String> subList = list.subList(1, 4);//从开始下标处(包含)截取到结束下标处(排他)的元素,返回新的集合 //将集合转换为数组 Object[] array1 = subList.toArray(); System.out.println(Arrays.toString(array1));//[xxx, yyy, yyy] //将集合转换为指定类型的数组 String[] array2 = new String[3]; subList.toArray(array2); System.out.println(Arrays.toString(array2));//[xxx, yyy, yyy] System.out.println("-----------------------------------------"); //遍历集合 -- for循环 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } System.out.println("-----------------------------------------"); //遍历集合 -- foreach for (String element : list) { System.out.println(element); } System.out.println("-----------------------------------------"); //遍历集合 -- Iterator Iterator<String> it = list.iterator(); while(it.hasNext()){//判断是否有可迭代的元素 String next = it.next();//获取下一个元素 System.out.println(next); } System.out.println("-----------------------------------------"); //遍历集合 -- ListIterator ListIterator<String> listIterator = list.listIterator(); while(listIterator.hasNext()){//判断是否有可迭代的元素 String next = listIterator.next();//获取下一个元素 System.out.println(next); } }
LinkedList独有的方法
public static void main(String[] args) { LinkedList<String> list = new LinkedList<>(); list.add("麻生希1"); list.add("麻生希2"); list.add("麻生希3"); list.add("abc"); list.add("abc"); list.add("AAA"); list.add("abc"); list.add("abc"); //添加到头部 list.addFirst("aaa"); list.offerFirst("bbb"); list.push("ccc"); //添加到末尾 list.addLast("xxx"); list.offer("yyy"); list.offerLast("zzz"); System.out.println("获取第一个元素:" + list.element()); System.out.println("获取第一个元素:" + list.getFirst()); System.out.println("获取第一个元素:" + list.peek()); System.out.println("获取第一个元素:" + list.peekFirst()); System.out.println("获取第一个元素:" + list.pop()); System.out.println("获取最后一个元素:" + list.getLast()); System.out.println("获取最后一个元素:" + list.peekLast()); //删除第一个元素 list.poll(); list.pollFirst(); list.removeFirst(); //删除最后一个元素 list.pollLast(); list.removeLast(); //删除第一次出现的元素 list.removeFirstOccurrence("abc"); //删除最后一次出现的元素 list.removeLastOccurrence("abc"); //倒序遍历 Iterator<String> descendingIterator = list.descendingIterator(); while(descendingIterator.hasNext()){ String next = descendingIterator.next(); System.out.println(next); } for (String element : list) { System.out.println(element); } }
LikedList实现队列模式
注意:队列模式 - 先进先出
public static void main(String[] args) { LinkedList<String> list = new LinkedList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); list.add("eee"); while(!list.isEmpty()){ //String element = list.pollFirst(); String element = list.removeFirst(); System.out.println(element); } System.out.println("集合的元素个数为:" + list.size());//0 }
注意:栈模式 - 先进后出/后进先出
public static void main(String[] args) { LinkedList<String> list = new LinkedList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); list.add("eee"); while(!list.isEmpty()){ String element = list.removeLast(); System.out.println(element); } System.out.println("集合的元素个数为:" + list.size());//0 }
Stack的使用
继承关系:class Stack extends Vector 特点:栈模式
public static void main(String[] args) { Stack<String> stack = new Stack<>(); //将元素添加到栈顶 stack.push("aaa"); stack.push("bbb"); stack.push("ccc"); stack.push("ddd"); stack.push("eee"); System.out.println("获取栈顶元素:" + stack.peek()); System.out.println("获取元素到栈顶的距离:" + stack.search("bbb"));//4 - 从1开始数 //判断集合是否为空内容 while(!stack.empty()){ //删除栈顶元素,并返回 String pop = stack.pop(); System.out.println(pop); } }
Vector的使用
public static void main(String[] args) { Vector<String> list = new Vector<>(); //添加数据 list.add("麻生希"); list.add("椎名空"); list.add("水菜丽"); list.add("朝桐光"); list.add("樱井步"); //设置指定下标上的元素 list.set(1, "侯小康"); //获取指定下标上的元素 String str = list.get(1); System.out.println("获取指定下标上的元素:" + str);//侯小康 //获取元素个数 int size = list.size(); System.out.println("获取元素个数:" + size);//5 //在指定下标上添加元素 list.add(2, "杨雪飞"); Vector<String> newList1 = new Vector<>(); Collections.addAll(newList1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素 list.addAll(newList1);//将newList1中所有的元素都添加到list集合里末尾的位置 Vector<String> newList2 = new Vector<>(); Collections.addAll(newList2, "xxx","xxx","yyy","yyy","zzz","zzz");//利用集合工具类(Collections)批量添加元素 list.addAll(3, newList2);//将newList2中所有的元素都添加到list集合里指定下标的位置 //清空集合里所有的元素 //list.clear(); System.out.println("判断集合中是否包含指定元素:" + list.contains("侯小康"));//true System.out.println("判断集合中是否包含指定集合:" + list.containsAll(newList1));//true System.out.println("获取元素在集合中第一次出现的下标:" + list.indexOf("ccc"));//12 System.out.println("获取元素在集合中最后一次出现的下标:" + list.lastIndexOf("ccc"));//13 //没有-true,有-false System.out.println("判断集合里是否没有元素:" + list.isEmpty());//false list.remove(9);//通过下标删除元素 list.remove("水菜丽");//通过数据删除元素 list.removeAll(newList1);//将list中有newList1的元素全部删除(去除交集) list.retainAll(newList2);//将list中有newList2的元素全部保留(保留交集) List<String> subList = list.subList(1, 4);//从开始下标处(包含)截取到结束下标处(排他)的元素,返回新的集合 //将集合转换为数组 Object[] array1 = subList.toArray(); System.out.println(Arrays.toString(array1));//[xxx, yyy, yyy] //将集合转换为指定类型的数组 String[] array2 = new String[3]; subList.toArray(array2); System.out.println(Arrays.toString(array2));//[xxx, yyy, yyy] System.out.println("-----------------------------------------"); //遍历集合 -- for循环 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } System.out.println("-----------------------------------------"); //遍历集合 -- foreach for (String element : list) { System.out.println(element); } System.out.println("-----------------------------------------"); //遍历集合 -- Iterator Iterator<String> it = list.iterator(); while(it.hasNext()){//判断是否有可迭代的元素 String next = it.next();//获取下一个元素 System.out.println(next); } System.out.println("-----------------------------------------"); //遍历集合 -- ListIterator ListIterator<String> listIterator = list.listIterator(); while(listIterator.hasNext()){//判断是否有可迭代的元素 String next = listIterator.next();//获取下一个元素 System.out.println(next); } }
Vector老的方法
理解:Vector属于元老级别的集合类(JDK1.0),JDK1.2开始才有集合框架的概念,为了将Vector保留下来,Java的设计者让Vector多实现了List接口。
public static void main(String[] args) { Vector<String> v = new Vector<>(); v.addElement("aaa"); v.addElement("bbb"); v.addElement("ccc"); v.addElement("ddd"); v.addElement("eee"); v.removeElementAt(0);//根据下标删除元素 v.removeElement("bbb");//根据数据删除元素 Enumeration<String> elements = v.elements(); while(elements.hasMoreElements()){ String nextElement = elements.nextElement(); System.out.println(nextElement); } }
List接口下的集合 ---------------------------------------------------
ArrayList 数据结构:一维数组 特点:存储数据 LinkedList 数据结构:双向列表 特点:队列模式、栈模式
Vector 数据结构:一维数组 特点:线程安全 Stack 继承关系:class Stack extends Vector 特点:栈模式 Set接口下的集合 ------------------------------------------------------
HashSet 数据结构:hash表(一维数组) 特点:无序且不可重复
LinkedHashSet 继承关系:class LinkedHashSet extends HashSet 特点:有序且去重(添加了双向链表的数据结构)
TreeSet 数据结构:
二叉树 特点:根据元素类型自然排序