10.集合框架

1.Collection

1.1.List

1.1.1.ArrayList 类

基于数组算法的列表,底层其实就是一个 Object 数组
常用方法的 API:

方法名 作用 调用语法
add(E e) 添加元素,E 是创建集合时定义的泛型,添加的元素的类型就是传入的这个泛型类型 集合对象.add(E e)
remove(int index)、remove(Object 0) 删除元素,第一个方法是根据元素的索引删除;第二个方法时直接根据元素的内容删除元素,第二个方法时 List 集合的父类 collection 中的方法 集合对象.remove(int index)
set(int index, E e) 修改元素,第一个形参就是需要修改的元素索引,第二个集合对象.形参就是修改后的值 集合对象.set(int index, E e)
get(int index) 根据索引获取元素 集合对象.get(int index)
size() 获取集合的长度 集合对象.size()
isEmpty() 判断集合是否为空 集合对象.isEmpty()
contains(Object o) 判断集合是否包含目标元素 集合对象.contains(Object o)
toArray() 将集合转换为数组 集合对象.toArray()
public class ArrayListDemo1 {
    public static void main(String[] args) {
        // 创建一个默认长度的列表对象
        List list = new ArrayList();
        // 打印集合中元素的个数
        System.out.println("元素数量:"+list.size());//0
        // 添加操作:向列表中添加4个元素
        list.add("Will");
        list.add(100);
        list.add(true);
        list.add("Lucy");
        // 查询操作:
        System.out.println("列表中所有元素:"+list);//输出:[Will, 100, true, Lucy]
        System.out.println("元素数量:"+list.size());//4
        System.out.println("第一个元素:"+list.get(0));//Will
        
        // 修改操作:把索引为2的元素,替换为wolfcode
        list.set(2, "wolfcode");
        System.out.println("修改后:"+list);//输出:[Will, 100, wolfcode, Lucy]
        // 删除操作:删除索引为1的元素
        list.remove(1);
        System.out.println("删除后:"+list);//输出:[Will, wolfcode, Lucy]
    }
}

1.1.2.LinkedList 类

底层采用链表算法,实现了链表、队列、栈的数据结构。无论是链表还是队列,主要操作的都是头和尾的元素。
LinkedList 常用方法的 API:

方法名 作用 调用语法
addFirst() 从链表的开头处添加元素 对象.addFirst()
addLast() 从链表的结尾处添加元素 对象.addLast()
getFirst() 获取到链表开头处的第一个元素 对象.getFirst()
getLast() 获取到链表结尾处的最后一个元素 对象.getLast()
removeFirst() 删除链表开头处的第一个元素 对象.removeFirst()
removeLast() 删除链表结尾处的最后一个元素 对象.removeLast()

其余方法

boolean offerFirst(Object e) 在此列表的开头插入指定的元素。
boolean offerLast(Object e) 在此列表末尾插入指定的元素。
Object peekFirst() 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
Object peekLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。
Object pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
Object pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。
void push(Object e) 将元素推入此列表所表示的栈。
Object pop() 从此列表所表示的栈处弹出一个元素。
Object peek() 获取但不移除此列表的头(第一个元素)。
public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        //添加元素
        list.addFirst("A");
        list.addFirst("B");
        System.out.println(list);
        list.addFirst("C");
        System.out.println(list);
        list.addLast("D");
        System.out.println(list);
        //获取元素
        System.out.println("获取第一个元素:" + list.getFirst());//C
        System.out.println("获取最后一个元素:" + list.getLast());//D
        //删除元素
        list.removeFirst();
        System.out.println("删除第一个元素后:" + list);//[B, A, D]
        list.removeLast();
        System.out.println("删除最后一个元素后:" + list);//[B, A]
    }
}

//结果
[B, A]
[C, B, A]
[C, B, A, D]
获取第一个元素:C
获取最后一个元素:D
删除第一个元素后:[B, A, D]
删除最后一个元素后:[B, A]

1.2.Set

特点

  • 不允许元素重复
  • 不会基类元素的添加先后顺序

Set 只包含从 Collection 继承的方法,当试图添加两个相同元素进 Set 集合,添加操作失败,add() 方法返回 false
常用的实现类:

  • HashSet 类:底层采用哈希表实现,开发中使用最多的实现类
  • TreeSet 类:底层采用红黑树实现,可以对集合中元素排序,使用不对

HashSet 和 TreeSet 类的 API 都是一样的

方法名 作用 调用语法
add(E e) 添加元素,E 是创建集合时定义的泛型,添加的元素的类型就是传入的这个泛型类型 集合对象.add(E e)
remove(int index)、remove(Object 0) 删除元素,第一个方法是根据元素的索引删除;第二个方法时直接根据元素的内容删除元素,第二个方法时 List 集合的父类 collection 中的方法 集合对象.remove(int index)
set(int index, E e) 修改元素,第一个形参就是需要修改的元素索引,第二个集合对象.形参就是修改后的值 集合对象.set(int index, E e)
get(int index) 根据索引获取元素 集合对象.get(int index)
size() 获取集合的长度 集合对象.size()
isEmpty() 判断集合是否为空 集合对象.isEmpty()
contains(Object o) 判断集合是否包含目标元素 集合对象.contains(Object o)
toArray() 将集合转换为数组 集合对象.toArray()

1.2.1.HashSet 类

是 Set 接口的实现类,底层数据结构是哈希表,集合容器不吉利元素的添加顺序,也不允许元素重复。通常也说 HashSet 中的元素是无序的、唯一的

public class HashSetDemo {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        //添加操作:向列表中添加4个元素
        set.add("Will");
        set.add("wolf");
        set.add("code");
        set.add("Lucy");
        
        //查询操作:
        System.out.println("集合中所有元素:" + set);//[code, wolf, Will, Lucy]
        System.out.println("元素数量:" + set.size());//4
        System.out.println("是否存在某个元素:" + set.contains("code"));//true
        System.out.println("是否存在某个元素:" + set.contains("code2"));//false
        
        //删除操作:删除code元素
        set.remove("code");
        System.out.println("删除后:" + set);//[wolf, Will, Lucy]
        
        //使用for-each遍历
        for (String ele : set) {
            System.out.println(ele);
        }
        
        //使用迭代器遍历
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            Object ele = it.next();
            System.out.println(ele);
        }
    }
}

1.2.2.TreeSet 类

其底层才有红黑树算法,会对存储的元素对象默认使用自然排序(从小到大)
注意:必须保证 TreeSet 集合中的元素对象是相同的数据类型,否则报错

public class TreeSetDemo{
    public static void main(String[] args) {
        Set<String> set = new TreeSet<>();
        set.add("wolf");
        set.add("will");
        set.add("sfef");
        set.add("allen");
        System.out.println(set);// [allen, sfef, will, wolf]
    }
}

2.Map

Map 常用的 API:
添加操作

boolean put(Object key,Object value):存储一个键值对到Map中
boolean putAll(Map m):把m中的所有键值对添加到当前Map中

删除操作

Object remove(Object key):从Map中删除指定key的键值对,并返回被删除key对应的value

修改操作

无专门的方法,可以调用put方法,存储相同key,不同value的键值对,可以覆盖原来的。

查询操作

int size():返回当前Map中键值对个数
boolean isEmpty():判断当前Map中键值对个数是否为0.
Object get(Object key):返回Map中指定key对应的value值,如果不存在该key,返回null
boolean containsKey(Object key):判断Map中是否包含指定key
boolean containsValue(Object value):判断Map中是否包含指定value
Set keySet():返回Map中所有key所组成的Set集合
Collection values():返回Map中所有value所组成的Collection集合
Set entrySet():返回Map中所有键值对所组成的Set集合

2.1.HashMap

HashMap底层基于哈希表算法,Map中存储的key对象的hashCode值决定了在哈希表中的存储位置,因为Map中的key是Set,所以不能保证添加的先后顺序,也不允许重复。
HashMap key的底层数据结构是哈希表

案例: 统计一个字符串中每个字符出现次数

public class HashMapDemo2{
    public static void main(String[] args) {
        String str = "ABCDEFABCDEABCDABCABA";
        //把字符串转换为char数组
        char[] charArray = str.toCharArray();
        //Map的key存储字符,value存储出现的次数
        Map<Character, Integer> map = new HashMap<>();
        //迭代每一个字符
        for (char ch : charArray) {
            //判断Map中是否已经存储该字符
            if (map.containsKey(ch)) {
                Integer count = map.get(ch);
                //如果已经存储该字符,则把出现次数加上1
                map.put(ch, count+1);
            }else {
                //如果没有存储该字符,则把设置次数为1
                map.put(ch, 1);
            }
        }
        System.out.println(map); 
    }
}

2.2.TreeMap

TreeMap key底层基于红黑树算法,因为Map中的key是Set,所以不能保证添加的先后顺序,也不允许重复,但是Map中存储的key会默认使用自然排序(从小到大),和TreeSet一样,除了可以使用自然排序也可以自定义排序。

需求:测试HashMap和TreeMap中key的顺序

public class App {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("girl4", "杨玉环");
        map.put("girl2", "王昭君");
        map.put("key1", "西施");
        map.put("key3", "貂蝉");
        System.out.println(map);
        //-------------------------------------------
        map = new TreeMap<>(map);
        System.out.println(map);
    }
}

结果:
{key1=西施, girl4=杨玉环, key3=貂蝉, girl2=王昭君}
{girl2=王昭君, girl4=杨玉环, key1=西施, key3=貂蝉}

3.集合元素变量

对集合中的每一个元素获取出来

List<String> list = new ArrayList<>();
list.add("西施");
list.add("王昭君");
list.add("貂蝉");
list.add("杨玉环");


使用for遍历

for (int index = 0; index < list.size(); index++) {
    String ele = list.get(index);
    System.out.println(ele);
}

使用迭代器遍历
Iterator表示迭代器对象,迭代器中拥有一个指针,默认指向第一个元素之前,

  • boolean hasNext():判断指针后是否存在下一个元素
  • Object next():获取指针位置下一个元素,获取后指针向后移动一位
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String ele = it.next();
    System.out.println(ele);
}

使用 for-each 遍历(推荐使用)

for (String ele : list) {
    System.out.println(ele);
}

for-each操作集合时,其实底层依然是Iterator

posted @ 2024-05-06 00:18  落落的学习  阅读(8)  评论(0编辑  收藏  举报