一、集合框架体系(重要!要记住!)

集合主要分为两组:单列集合(存放单个元素),双列集合(存放类似键值对元素)

Collection 接口有两个重要的子接口:List、Set,他们是实现的子类都是单列集合。
image.png

Map 接口的实现子类是 双列集合,存放的是键值对
image.png

二、Collection 接口

1. Collection接口实现类的特点

image.png

2. Collection接口常用方法,以实现子类

image.png

3. Collection接口遍历元素方式

(1)使用 Iterator(迭代器)

image.png

  • 迭代器的执行原理:

image.png

  • 迭代器接口的方法:

image.png

  • 示例
package collection_;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionIterator {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        Collection col = new ArrayList();

        col.add((new Book("三国演义","罗贯中",10.1)));
        col.add((new Book("小李飞刀","古龙",5.1)));
        col.add((new Book("红楼梦","敬雪晴",34.1)));

        System.out.println("col = " + col);

        //希望能够遍历 col 集合
        //1. 先得到 col 对应的 迭代器
        Iterator iterator = col.iterator();
        //2. 使用 while 循环遍历
        //可以输入 itit 快捷生成 while 语句
        //显示所有快捷键的快捷键 ctrl + j
        while (iterator.hasNext()) { //判断是否还有数据
            // 返回下一个元素,类型是 Object
            Object next =  iterator.next();
            System.out.println("next = " + next);
        }

        //3. 当退出 while 循环后,这时 iterator 迭代器指向最后的元素
        // iterator.next(); // NoSuchElementException
        //4. 如果希望再次遍历,需要重置我们的迭代器
        iterator = col.iterator();
        System.out.println("=====第二次遍历======");
        while (iterator.hasNext()) { //判断是否还有数据
            // 返回下一个元素,类型是 Object
            Object next =  iterator.next();
            System.out.println("next = " + next);
        }
    }
}

class Book {
    private String  name;
    private String author;
    private double price;

    public Book(String name, String author, double price) {
        this.name = name;
        this.author = author;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}

运行结果:
image.png

(2)for循环增强

image.png
增强 for 底层还是 Iterator 迭代器

Collection col = new ArrayList();
for(Object book : col) {
 System.out.println("book = " + book);   
}

三、List 接口

1. 接口介绍

image.png

2. 接口常用方法

image.png

3. List 的三种遍历方式(ArrayList、LinkedList、Vector)

(1)使用 iterator

image.png

(2)使用增强for

image.png

(3)使用普通for

image.png

4. ArrayList 注意事项

image.png

(1)ArrayList的底层操作机制源码分析(重点、难点)

  • 先说结论:

image.png

  • 分析使用无参构造器

image.png

  • 分析使用有参构造器

image.png

5. Vector 基本介绍

image.png

(1)Vector和ArrayList的比较

image.png

6. LinkedList底层结构

(1)LinkedList的全面说明

image.png

(2)LinkedList的底层操作机制

image.png
image.png

(3)ArrayList和LinkedList的比较

image.png

四、Set 接口

1. Set 接口基本介绍

image.png

2. Set接口的常用方法和遍历方式

image.png

3. HashSet

(1)HashSet说明

image.png

(2)HashSet底层机制

HaspSet底层是HashMap,HashMap底层是(数组+链表+红黑树)
image.png
image.png

4. LinkedHashSet

(1)LinkedHashSet的说明

image.png

(2)LinkedHashSet底层机制

image.png
image.png
image.png

5. HashSet和TreeSet分别如何去重的?

image.png

五、Map接口

1. Map接口实现类的特点(很实用)

image.png
image.png

2. Map接口的常用方法

image.png

3. Map接口的遍历方式

Map map = new HashMap();
map.put("邓超","孙俪");
map.put("王宝强","马蓉");
map.put("宋吉","马蓉");
map.put("aaa",null);
map.put(null,"刘亦菲");

第一组:先取出 所有的Key,通过Key 取出对应的Value

Set keyset = map.keySet();

(1)增强for

//(1) 增强for
for(Object key : keyset){
    System.out.println(key + "-" + map.get(key));
}

(2) 迭代器

//(2) 迭代器
Iterator iterator = keyset.iterator();
while (iterator.hasNext()){
    Object key = iterator.next();
    System.out.println(key + "-" + map.get(key));
}

运行结果:
image.png

第二组:把所有的values取出

Collection values = map.values();
//这里可以使用所有Collection使用的遍历方式

(1)增强for

//(1) 增强for
for (Object value : values){
    System.out.println(value);
}

(2)迭代器

//(2) 迭代器
Iterator iterator1 = values.iterator();
while (iterator1.hasNext()) {
    Object value =  iterator1.next();
    System.out.println(value);
}

运行结果:
image.png

第三组:通过EntrySet 来获取 k-v

Set entrySet = map.entrySet();

(1)增强for

//(1) 增强for
for (Object entry : entrySet){
    //将entry 转成 Map.Entry
    Map.Entry m = (Map.Entry)entry;
    System.out.println(m.getKey() + "-" + m.getValue());
}

(2)迭代器

//(2) 迭代器
Iterator iterator2 = entrySet.iterator();
while (iterator2.hasNext()) {
    Object entry =  iterator2.next();
    //System.out.println(entry.getClass());//HashMap$Node -实现-> Map.Entry(getKey,getValue)
    //向下转型 Map.Entry
    Map.Entry m = (Map.Entry) entry;
    System.out.println(m.getKey() + "-" + m.getValue());
}

运行结果:
image.png

4. HashMap底层机制

image.png

  • 扩容机制

image.png

5. Hashtable基本介绍

image.png

(1)Hashtable的底层

image.png

(2)Hashtable和HashMap对比

image.png

6. Map接口实现类-Properties

image.png

六、总结-开发中如何选择集合实现类(记住)

image.png

七、Collections工具类

image.png

示例1:

package Collections_;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

@SuppressWarnings({"all"})
public class collections_ {
    public static void main(String[] args) {

        List list = new ArrayList();
        list.add("tom");
        list.add("smith");
        list.add("king");
        list.add("milan");

        //reverse(List) 反转 List 中元素的顺序
        Collections.reverse(list);
        System.out.println("list = " + list);

        //shuffle(List) 对 List 集合元素进行随机的排序
        Collections.shuffle(list);
        System.out.println("list = " + list);

        //sort(List) 根据元素的自然顺序对指定 List 集合元素按升序排序
        System.out.println("自然排序后:");
        Collections.sort(list);
        System.out.println("list = " + list);

        //sort(List,Comparator) 根据指定的 Comparator 产生的顺序对 List 集合排序
        //比如,字符串的长度大小排序
        System.out.println("按字符串长度排序后:");
        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //可以加入校验代码
                return ((String)o1).length() - ((String)o2).length();
            }
        });
        System.out.println(list);

        System.out.println("交换位置0和1的元素后:");
        //swap(List,int,int) 将指定 List 集合中的 i 处元素和 j 处元素进行互换
        Collections.swap(list,0,1);
        System.out.println(list);
    }
}

代码运行结果:
image.png

image.png
示例2:

package Collections_;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

@SuppressWarnings({"all"})
public class collections02_ {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("tom");
        list.add("smith");
        list.add("king");
        list.add("milan");

        //Object max(Collection) 根据元素的自然顺序,返回给定集合中的最大元素
        System.out.println("自然顺序的最大元素 = " + Collections.max(list));

        //Object max(Collection,Comparator) 根据 Comparator 指定的顺序, 返回给定集合中的最大元素
        //比如返回长度最大的元素
        Object maxObject = Collections.max(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o1).length() - ((String)o2).length();
            }
        });
        System.out.println("长度最长的元素="+maxObject);

        //Object min(Collection) 根据元素的自然顺序,返回给定集合中的最小元素
        //Object min(Collection,Comparator) 根据 Comparator 指定的顺序, 返回给定集合中的最小元素
        //此处参考 max 即可

        //int frequency(Collection,Object) 返回指定集合中指定元素的出现次数
        System.out.println("tom出现的次数="+Collections.frequency(list,"tom"));

        //void copy(List dest,List src) 将 src 中的内容复制到 dest 中
        ArrayList dest = new ArrayList();
        //为了完成一次完整的拷贝,我们需要先给dest赋值,大小和list.size()一样
        for(int i = 0; i < list.size(); i++){
            dest.add("");
        }
        //拷贝
        Collections.copy(dest,list);
        System.out.println("dest = " + dest);

        //boolean replaceAll(List list,Object oldVal,Object newVal) 使用新值替换 List 对象的所有值
        Collections.replaceAll(list,"tom","汤姆");
        System.out.println("list替换后 = "+list);
    }
}

代码运行结果:
image.png

版权声明:本文为zhenyucode原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhenyucode/p/16438454.html