Java基础——集合

    技术2022-07-11  110

    定义

    集合可以看做是一种容器,用来存储对象信息。所有集合类都位于java.util包下。但支持多线程的集合类位于java.util.concurrent包下。

    集合的继承结构

    常用API

    1.add(E e):将指定元素添加到列表的尾部 2.add(Index,e):将指定元素添加到指定位置 3.clear():移除此列表中的所有元素 4.ensureCapacity(int minCapacity):增加容器的容量 5.isEmpty():判断集合是否为空 6.remove(index):移除此列表中指定位置上的元素 7.get(index):返回此列表中的所有元素 8.toArray():按适当顺序返回包含此列表中所有元素的数组

    测试常用方法

    ```java //测试Collection接口的功能 public class Test3_Collection { public static void main(String[] args) { //1,创建接口的对象 //!!泛型约束中,元素的类型,只能是引用类型。 Collection<Integer> c = new ArrayList(); //2,常用方法 c.add(1); c.add(2); c.add(3); c.add(4); c.add(5); System.out.println(c); System.out.println(c.contains(3)); System.out.println(c.equals(5)); System.out.println(c.hashCode()); System.out.println(c.isEmpty()); System.out.println(c.remove(2)); System.out.println(c.size()); System.out.println( Arrays.toString( c.toArray() ) ); // c.clear() //集合和集合的操作 Collection<Integer> c2 = new ArrayList(); c2.add(9); c2.add(8); c2.add(7); System.out.println(c.addAll(c2)); System.out.println(c.containsAll(c2)) System.out.println(c.removeAll(c2));//移除c2的,保留c的 //System.out.println(c.retainAll(c2));//移除c的,保留c2的 //迭代集合中元素 // Iterator<E> iterator() 返回迭代的迭代器。 Iterator<Integer> it = c.iterator(); while(it.hasNext()) {//判断是否还有元素,有返回true,进入循环体 Integer i = it.next();//next()获取元素的值 System.out.println(i); } } }```

    List接口

    概述

    有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。有序,可存放重复的元素

    特点

    1、 数据有序 2、 允许存放重复元素

    常用方法

    void add(int index, E element) 在列表的指定位置插入指定元素(可选操作)。 boolean addAll(int index, Collection<? extends E> c) 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。

    E get(int index) 返回列表中指定位置的元素。

    int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。

    int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。

    ListIterator listIterator() 返回此列表元素的列表迭代器(按适当顺序)。

    ListIterator listIterator(int index)

    返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。

    E remove(int index)

    移除列表中指定位置的元素(可选操作)。

    测试常用方法

    //测试List接口 public class Test4_List { public static void main(String[] args) { //1,创建对象 //!!List中元素特点:每个元素都有下标,元素有序,元素可重复 List<String> list = new ArrayList(); //2,常用方法 list.add("钢铁侠"); list.add("美国队长"); list.add("灭霸"); list.add("蜘蛛侠"); list.add("灭霸"); list.add(2, "test"); System.out.println(list.get(4)); System.out.println(list.indexOf("灭霸")); System.out.println(list.lastIndexOf("灭霸")); System.out.println(list.remove(0)); list.set(0, "haha"); List list2 = list.subList(2, 4);//[2,4)类似String的subString()含头不含尾 // System.out.println(list.addAll(1, list2)); //迭代器遍历 //1,可以使用Collection接口里的iterator() Iterator<String> it = list.iterator(); while(it.hasNext()) {//有元素时就获取 System.out.println( it.next() );//获取元素值 } //2,可以使用List接口里的listIterator() ListIterator<String> it2 = list.listIterator(); while(it2.hasNext()) { System.out.println( it2.next() ); } //3,可以使用数组的方式遍历 for(int i = 0 ;i < list.size(); i++) { System.out.println(list.get(i)); } for (Object obj : list) { // String s = (String)obj; System.out.println(obj); } }

    ArrayList

    概述

    存在于java.util包中。 内部用数组存放数据,封装了数组的操作,每个对象都有下标。 内部数组默认初始容量是10。如果不够会以1.5倍容量增长。 查询快,增删数据效率会降低。

    测试常用方法

    /测试ArrayList的api public class Test5_ArrayList { public static void main(String[] args) { //1,创建对象 //ArrayList底层的数据结构是数组 ArrayList<String> list = new ArrayList<String>(); //2,常用方法 list.add("tony"); list.add("jack"); list.add("rose"); list.add("lilei"); list.add("lilei"); list.add("lilei"); list.add(1, "hanmeimei"); ArrayList<String> list2 = new ArrayList<String>(); list.addAll(list2); list.addAll(1,list2); // list.clear(); System.out.println(list.contains("lilei")); System.out.println(list.get(2)); System.out.println(list.indexOf("lilei")); System.out.println(list.lastIndexOf("lilei")); System.out.println(list.isEmpty()); System.out.println(list.remove(3)); System.out.println(list.remove("rose")); System.out.println(list.size()); System.out.println(list.set(0,"haha")); System.out.println( Arrays.toString( list.toArray() ) ); //迭代器遍历ArrayList集合 //1,用Collection接口里的iterator() Iterator<String> it = list.iterator(); while(it.hasNext()) { System.out.println(it.next()); } //2,用List接口里的listIterator() ListIterator<String> it2 = list.listIterator(); while(it.hasNext()) { System.out.println(it.next()); } //3,for循环 for(int i = 0; i< list.size(); i++) { System.out.println(list.get(i)); } //4,增强for循环 for (String s : list) { System.out.println(s); } }

    LinkedList

    概述

    双向链表,两端效率高。底层就是数组和链表实现的。

    创建对象

    LinkedList() 构造一个空列表。

    常用方法

    void addFirst(E e) 将指定元素插入此列表的开头。 void addLast(E e) 将指定元素添加到此列表的结尾。 E element() 获取但不移除此列表的头(第一个元素)。 E getFirst() 返回此列表的第一个元素。 E getLast() 返回此列表的最后一个元素。 与ArrayList相似,但是Vector是同步的。所以说它是线程安全的动态数组。

    测试常用方法

    public class Test6_LinkedList { public static void main(String[] args) { //1,创建LinkedList对象 LinkedList<Integer> ll = new LinkedList(); //2,常见方法 ll.add(1); ll.add(2); ll.add(3); ll.add(4); ll.add(5); //----添加首尾元素 ll.addFirst(0); ll.addLast(9); ll.offerFirst(100); ll.offerLast(200); System.out.println(ll); //----获取首尾元素 System.out.println(ll.getFirst()); System.out.println(ll.getLast()); System.out.println(ll.peekFirst());//获取不移除 System.out.println(ll.peekLast()); //----移除首尾元素 System.out.println(ll.removeFirst());//移除 System.out.println(ll.removeLast()); System.out.println(ll); System.out.println(ll.pollFirst());//获取并移除 System.out.println(ll.pollLast()); System.out.println(ll); //迭代遍历元素 //1,通过迭代器遍历 --效率高 Iterator<Integer> it = ll.iterator(); while(it.hasNext()) { System.out.println(it.next()); } //2,通过下标遍历,是List接口的特点--效率低 for(int i = 0 ; i < ll.size() ; i++) { System.out.println(ll.get(i)); } }

    Set接口

    概述

    一个不包含重复元素的 collection。 数据无序(因为set集合没有下标)。 由于集合中的元素不可以重复。 常用于给数据去重。

    特点

    1、 数据不允许重复 2、 数据无序 3、 HashSet:底层是哈希表 4、 TreeSet:底层是TreeMap,也是红黑树的形式,

    常用方法

    略,同Collection接口

    HashSet

    概述

    底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K,存入内部的HashMap中。其中,K不许重复。此类允许使用 null 元素。

    ####三者之间的区别 Arraylist:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素 LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素 Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素

    Map

    概述

    1.可以根据键 提取对应的值 2、 键不允许重复,如果重复值会被覆盖 3、 存放的都是无序数据 4、 初始容量是16,默认的加载因子是0.75

    HashMap

    概述

    HashMap底层是一个Entry数组,当存放数据时会根据hash算法计算数据的存放位置。

    Processed: 0.010, SQL: 9