集合(java)

title: 我的第一篇博客
date: 2024-05-17 20:36:01
tags: [学java(基础)]

集合

体系图一览

IMG_20240520_230540

集合相对于数组的优点

IMG_20240520_230509

实际开发根据业务逻辑选择

  1. 一组对象(单列)

  2. 一组键值对(双列)

Collection接口

List: 允许重复

LinkList/ArrayList/Vector
  1. 增删多:用 LinkList (底层维护了一个双向链表), 通过改变pre和next指向即可实现Node的增删;

  2. 改查多:用ArrayList/Vector(底层结构是可变数组), 进一步选择

Set: 不允许重复

1. HashSet
  1. 无序: HashSet[底层是HashMap,维护了一个哈希表(数组+链表+红黑树)] 添加元素步骤:

    1. 先得到hash值转换成索引值,找到对应储存位置

    2. 没有元素直接加入, 有则调用equals比较

    3. hashcode()+equals()均可被重写, 由程序猿自己制定比较规则

    4. 扩容机制:

2.TreeSet
  1. 排序: TreeSet

    1. 底层为MapSet(key即为穿入的对象, value是PRESENRT占位符)

    2. 创建TreeSet时, 使用无参构造器则使用默认的Comparator, 亦可重写比较器, 制定比较规则

    TreeSet treeSet = new TreeSet();
    TreeSet treeSet = new TreeSet(new Comparator() {
    @Override
    public int compare(Object o1, Object o2) {
    //下面 调用 String 的 compareTo 方法进行字符串大小比较
    //如果要求加入的元素,按照长度大小排序
    //return ((String) o2).compareTo((String) o1);
    return ((String) o1).length() - ((String) o2).length();
    }
3. LinkedHashSet
  1. 插入和取出顺序一致: LinkedHashSet(维护了一个(数组[存放]+双向链表[维持顺序]))

    去重机制比较
    1. HashSet:hashcode()得到hash值从而得到索引, 用equals()便利比较

    2. 用Comparator实现的compare方法比较, 该方法返回正数,0, 负数, 为0表示重复, 不添加

Map接口

1.HashMap

  1. 键无序: HashMap

    1. 底层是:哈希表(JDK7: 数组+链表)(hJDK8: 数组+链表+红黑树)

    2. 扩容机制:

      1. 第1次添加,则需要扩容tabl容量为16,临界值(threshold)为12(16*0.75)

      2. 以后再扩容,则需要扩容tab1e容量为原来的2倍(32),临界值为原来的2倍,即24

      以次类推.

      1. 在Java8中,如果一条链表的元素个数超过TREEIFY THRESHOLD(默认是8),并且table的大小>= MIN_TREEIFY_CAPACITY(默认64),就会进行树化(红黑树)

2.TreeMap
  1. 键排序: TreeMap(定制排序, 原理见TreeSet)

3.LinkedhashMap
  1. 键插入和取出的顺序一致:LinkedhashMap(原理见LinkedhashSet)

4.Properties
  1. 读取文件: Properties

遍历方法

  1. 先取出 所有的 Key , 通过 Key 取出对应的 Value, 再进行遍历

Set keyset = map.keySet();
  1. 把所有的 values 取出, 这里可以使用所有的 Collections 使用的遍历方法

Collection values = map.values();
  1. 通过 EntrySet 来获取 k-v(以增强for循环为例) 原理: Map里面的Node(Node实现了Map.Entry<K, V>)转换成Entry, 再放到EntrySet里面去, 然而Map.Entry提供了方法getKey()和getValue()

Set entrySet = map.entrySet();// EntrySet<Map.Entry<K,V>>
//(1) 增强 for
System.out.println("----使用 EntrySet 的 for 增强(第 3 种)----");
for (Object entry : entrySet) {
//将 entry 转成 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}

Collections工具类

  1. Collections是一个操作Set, List, Map等集合的工具类

  2. 提供了一系列静态的方法对集合元素进行排序, 查询等

练习题踩坑

(结果输出4个对象)

  1. hashcode()+equals()均被重写, 因此只用根据id 和name判断

  2. p1.name更改后(p1为引用数据类型, 因此set中的p1也会发生改变), 在经hashcode()计算后,在数组中位置发生变化(假设变到索引为3的位置), 因此无法删除p1

  3. set.add(new Person("1001", "CC")), 经过hashcode()计算后在索引为3的位置, 自然而然可以加入

  4. set.add(new Person("1001", "AA")),经过计算后在索引为1的位置,与修改后的p1不相同, 因而任可以加入

本文截图均来自于【零基础 快速学Java】韩顺平 零基础30天学会Java

  • 31
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
集合Java编程中常用的数据结构,用于存储一组元素。Java提供了多种集合类,包括List、Set和Map等。下面是一个使用集合Java编程示例: ```java import java.util.ArrayList; import java.util.HashSet; import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.Map; public class CollectionExample { public static void main(String[] args) { // 使用List存储一组整数 List<Integer> numbers = new ArrayList<>(); numbers.add(1); numbers.add(2); numbers.add(3); // 使用Set存储一组字符串 Set<String> fruits = new HashSet<>(); fruits.add("apple"); fruits.add("banana"); fruits.add("orange"); // 使用Map存储一组键值对 Map<String, Integer> studentScores = new HashMap<>(); studentScores.put("John", 90); studentScores.put("Lisa", 80); studentScores.put("Mike", 70); // 遍历List并打印元素 for (int num : numbers) { System.out.println(num); } // 判断Set是否包含特定元素 if (fruits.contains("banana")) { System.out.println("I like bananas!"); } // 根据键获取Map中对应的值 int johnScore = studentScores.get("John"); System.out.println("John's score: " + johnScore); // 使用迭代器遍历Map的键值对 for (Map.Entry<String, Integer> entry : studentScores.entrySet()) { System.out.println(entry.getKey() + "'s score: " + entry.getValue()); } } } ``` 上述代码演示了如何使用List、Set和Map集合类进行编程。它创建了一个存储整数的List、存储字符串的Set以及存储键值对的Map,并展示了如何遍历集合、添加元素、判断元素是否存在以及获取和修改元素等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值