第四天Java基础02(集合)

本文深入讲解Java集合框架,包括List、Set、Map等接口及其实现类如ArrayList、LinkedList、HashSet、HashMap的特性与应用场景,探讨数据结构如栈、队列、数组、链表和红黑树的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.栈、队列、数组、链表、红黑树

1.栈的结构为桶型,(先进后出)
2.队列为管型,(先进后先出)
3.数组长度不变,增删的时候会新建数组(查询快,增删慢)
4.链表的地址不是连续的,所以查询慢,增删的时候对整体没有影响(查询慢,增删块)
在这里插入图片描述
5.红黑树
查询速度非常快
在这里插入图片描述

2.List接口(ArrayList、LinkedList)

1.有序、有索引、允许重复元素
2.ArrayList底层使用数组,所以查询快
(System.arraycopy(,))
3.LinkedList列表结构,查询慢,增删快,里面包含了大量操作首尾元素的方法

3.Vector

1.祖先级别的集合

4.Set接口(HashSet、哈希值、哈希表)

1.HashSet集合,实现了Set接口,不允许储存重复元素,没有索引不能用for遍历。无序集合,底层是个哈希表结构,查询速度非常快。
2.由于没有索引,所以可以用迭代器遍历,也可以用foreach遍历。
3.哈希值是十进制的数,是一个逻辑地址,不是实际地址。
4.hashCode();方法可以打印哈希地址,
在这里插入图片描述
5.HashSet在存值的时候分为两步判断,第一步hashCode(),如果不同就存入,如果相同就调用equals判断。
6.哈希表(数组+链表(红黑树))

5.HashSet存自定义的类型

1.必须重写hashCode和equals.

6.LinkedHashSet

1.在HashSet的基础上又加上了链表。
2.由于这条链表记录了存入位置,所以它是有序的。

7.可变参数的使用与原理

1.其底层原理是数组
2.一个方法中只能有一个可变参数
3.可变参数只能写在最末尾
4.终极写法

public void name(int...arr){
	//这就是可变参数
}

8.集合的工具类(Collections)

1.Collections.addAll(list,“A”,“B”,“C”,…);//批量添加
2.Collections.shuffle(list);//打乱顺序;
3.Collections.sort(lsit);//按照默认排序
4.如果需要对自定义的类进行排序,类中必须实现Comparable接口,并重写compareTo()方法,重新定义排列规则。
5.compareTo(this)- 参数 升序反过来降序。
在这里插入图片描述
6.sort方法的另一种使用方式

public static void main(String[] args) {
        ArrayList<User> arr = new ArrayList<>();
        arr.add(new User("迪丽热巴",15));
        arr.add(new User("古力娜扎",16));
        arr.add(new User("玛尔扎哈",14));
        Collections.sort(arr, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return o2.getAge() - o1.getAge();
            }
        });
    }

9.Map集合

9.1Map<K,V>

1.双列集合Key,Value
2.Key,Value两者的类型可以不同
3.Key不允许重复,Value允许
4.K与V一一对应

9.2HashMap<K,V>

1.继承Map<k,v>
2.使用了哈希表
3.是无序集合

9.3LinkedHashMap<K,V>

1.加上链表后成为有序集合,存取元素的顺序一致。

9.4Map中常用的方法

9.1.四种方法

Map<String,String> map = new HashMap<>();
        //1.put方法往集合中添加k,v返回被替换的v,如果没有返回null
        String m1 = map.put("A","a");
        //2.remove方法删除K元素返回被删除的V
        String a = map.remove("A");
        //3.get方法获取K对应的V,没有返回null
        String a1 = map.get("A");
        //4.containsKey判断是否存在指定的K
        boolean a2 = map.containsKey("A");

9.2.第一种遍历Map

 public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        String m1 = map.put("A","a");
        String m2 = map.put("B","b");
        String m3 = map.put("C","c");
		//使用迭代器也可以使用增强for循环
        Set<String> k = map.keySet();
        Iterator<String> iterator = k.iterator();
        while(iterator.hasNext()){
            String k = iterator.next();
            String v = map.get(next);
            System.out.println(v);
        }

    }

9.3.第二种遍历方式(Entry)

public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        String m1 = map.put("A","a");
        String m2 = map.put("B","b");
        String m3 = map.put("C","c");

        Set<Map.Entry<String, String>> entries = map.entrySet();
        for (Map.Entry<String,String> e:entries) {
            String key = e.getKey();
            String value = e.getValue();
            System.out.println(key+":"+value);
        }

    }

9.4.HashMap储存自定义类型的K与V

存自定义的Map时一定要注意,重写hashMap和equals方法,确保K的唯一性。

9.5.LinkedHashMap集合

区别在于有序集合。

9.6.Hashtable集合

1.不允许存null
2.早期的双列集合,比较冷门
3.线程安全
4.Hashtable的子类,Properties与IO流集合,仍然热门。

10.map小练习

public static void main(String[] args) {
        Map<Character,Integer> map = new HashMap<>();
        Scanner sc = new Scanner(System.in);
        System.out.println("亲输入字符串:");
        String str = sc.next();
        char[] chars = str.toCharArray();
        for (char aChar : chars) {
            if(map.containsKey(aChar)){
                Integer Value = map.get(aChar);
                map.put(aChar,++Value);
            }else{
                map.put(aChar,1);
            }
        }
        Set<Character> cs = map.keySet();
        for (Character key : cs) {
            Integer Value = map.get(key);
            System.out.println(key+":"+Value);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值