美文网首页
JavaSE进阶(Set集合,Map集合)

JavaSE进阶(Set集合,Map集合)

作者: 扶光_ | 来源:发表于2023-08-19 20:18 被阅读0次

一,Set

无序:存储顺序不一致
不可重复:元素可以去除重复
无索引:没有带索引的方法,不能使用for循环遍历

  • HashSet:无序,不重复,无索引
  • LinkedHashSet:有序,不重复,无索引
  • TreeSet:排序,不重复,无索引

同样也可以使用多态的写法

Set<String> sets = new HashSet<>();//如果想更改 直接更改后面的LinkedHashSet
其他基本功能与Collection API 一致

HashSet集合的底层原理

底层是采取哈希表存储的数据
(哈希表是一种对于增删改查数据性能都比较好的结构)
jdk8之前 ,底层使用数组+链表组成
jdk8之后,底层使用数组+链表+红黑树组成

  • 哈希值
    是jdk根据对象的地址,按照规则算出来的int类型的数值
    public int hashCode();返回对象的哈希值
    底层逻辑
    jdk1.8 之后,当链表过长时会影响查询速度,所以当链表长度超过8时会自动转换为红黑树
   public static void main(String[] args) {
        Set<Student> sets = new HashSet<>();
        Student s1 = new Student("张三");
        Student s2 = new Student("张三");
        Student s3 = new Student("张三");

        sets.add(s1);
        sets.add(s2);
        sets.add(s3);
        System.out.println(sets);
    }
hashset

那么为什么存储对象的时候没有去重复呢,
因为Set集合判断是否重复,首先要基于同一个对象判断哈希值是否一样,然后在判断equals方法

解决方法重写hashCode和equals方法
因为子类重写优先调用子类重写方法

LinkedHashSet

有序,不重复,无索引
底层原理:

依然还是哈希表,只是每个元素多了双链表机制记录存储顺序

TreeSet

不重复,无索引,可排序(默认升序)
底层原理:

基于红黑树数据结构来实现的,增删改查性能都比较好

对于自定义的Student等对象而言 ,无法直接排序
解决方法

  • 1让自定义的类,实现(implements)comparable<Student>泛型接口重写里面的compareTo方法来制定比较规则
  • 2TreeSet集合的有参构造器可以设置comparator接口对应比较器对象,来制定比较规则
    Set<Apple> apples = new TreeSet<>(new comparator<Apple>());
    规则方式
    第一个>第二个 返回正整数

如果希望元素可重复,有索引,查询快用ArrayList
如果希望元素可以重复又有索引,增删首尾快LinkedList
如果希望增删改查都快,不重复,无索引,无序HashSet
如果希望增删改查都快,元素不重复,有序,无索引LinkedHashSet
如果希望对象排序TreeSet

二,集合的工具类

可变参数

用在形参中可以接收多个数据

格式:数据类型...变量

public static void sum(int...num){}

需求.如我们定义一个求和方法,可以完成
求一个参数的和,计算两个参数的和,又可以计算三个参数的和,又可以没有参数计算,如何实现

public static void sum(int...num){
//其实传进来的参数其实就是放在一个数组
    遍历数组元素解决就好
    }

注意

  • 一个形参列表可变参数只能有一个
  • 可变参数必须放在形参列表最后面

Collection工具类

帮助我们来操控集合的

  • 1.为任意集合批量加数据
List<String> names = new ArrayList<>();
Collections.addAll(names,"张三","李四","王五");
  • 2 打乱List集合顺序
Collectins.shuffle(names);

shift+f6 同步改名字

  • 3 对于List集合进行默认规则排序
Collectins.sort(list);

三,Map集合

就是键值对
如购物车中商品对应的价格


image.png

map集合的键是无序,不重复的

HashMap:无序,不重复,无索引,值无要求

Map<String,Integer> maps = new HashMap<>();
maps.put("上衣",100);//添加数据

LinkedHashMap:有序,不重复,无索引

TreeMap:排序,不重复,无索引

Map集合相关API

maps.put(键,值);添加元素
maps.clear(); 清空集合
maps.isEmpty();判断是否为空
maps.get(键);根据键获取每个元素
maps.remove(键);根据键删除元素,返回对应的值
maps.containValue(值);判断是否包含某个值
Set<String> keys = maps.keySet();获取全部键的集合
Collection<Integer> values = maps.values();获取全部值的集合
maps.size();集合的长度
map1.putAll(map2);(map2元素拷贝到map1中)合并其他map集合

3.1map集合遍历 键找值

流程:先获取全部键set集合,遍历set集合用get方法取值

// 1拿到所有的键
Set<String> sets = maps.keySet();
// 2遍历每个键提取值
for(String key:keys){
    int value = maps.(key);
    system.out.println(key,value);
    }

3.2键值对

把键值对当成一个整体来遍历.
流程:先把map集合转换成Set集合,set集合每个元素都是键值对实体类型了 ,然后遍历set集合,提取键和值

为什么要转成set集合,因为map集合中 衣服=100,这个元素没法确定什么类型,没法forEach遍历

// 1把map集合转换为set集合 ctrl+alt+A 自动补全
Set<Map.Entry<String,Integer>> entries = maps.entrySet();
// 2开始遍历
for(Map.Entry<Map.Entry<String,Integer >entry:entries){
  String s = entry.getKey();
int calue = entry.getValue()
    }
#### 3lambda表达式遍历

maps.forEach(key,value)->{
system.out.println(key,value);
}

### 不可变集合
是不允许被修改,添加,删除的集合,如集合中有高考成绩等等

List<Double > list = List.of(422,523);

List Set Map,都存在of方法可以创建不可变集合

相关文章

网友评论

      本文标题:JavaSE进阶(Set集合,Map集合)

      本文链接:https://www.haomeiwen.com/subject/qcufmdtx.html