Java基础中的容器(续)

mac2025-12-06  10

一、比较器

1.内部比较器|自然排序:

实现java.lang.Comparable,重写 compareTo方法,在方法中自定义比较规则,默认的类型的比较规则 每次修改需要修改源码,不符合设计原则开闭原则 对修改关闭,对扩展开放

2.外部比较器|自定义比较器

实现接口java.util.Comparator<T>的接口,重写compare()方法,方法中自定义比较规则 int compare(T o1, T o2) 比较用来排序的两个参数

3.内部比较器和外部比较器的比较

内部比较器: 类实现Comparable接口,重写comparaTo() 方法 外部比较器: 规则定义在一个接口的实现类中重写的方法里面 Compatator接口 compare()方法 //主要程序 //默认升序 //Arrays.sort(p); //static <T> void sort(T[] a, Comparator<? super T> c) 第二个参数中定义当前排序的比较规则 //实现接口java.util.Comparator<T>的接口,重写compare()方法,方法中自定义比较规则 /*Arrays.soprt(p,new Comparator(){ @Override public int compare(Object o1, Object o2) { return ((p)o2).getAge() - ((p)o1).getpAge(); } });*/ //Lambda表达式,简化匿名内部p类p //Arrays.sort(p,(Object o1, Object o2) ->((p)o1).getpAge() - ((p)o2).getAge());

二、Collection 接口

1.List接口

List接口,接上一篇 链接:https://blog.csdn.net/zhiruochujian1/article/details/102845045

2.Set接口

Set接口 无序不可重复 List接口 有序可重复

(1)HashSet

底层都是有HashMap维护 底层: 哈希表(hashtable)实现的(数组+链表+红黑树) 特点: 查询,增删效率高,但是无序,不可重复 推荐使用: 推荐使用HashSet 如果两个对象的hashcode()值相同,不一定是一个对象,需要进一步比较equals() 如果两个对象的hashcode()值不相同,肯定不是一个对象 自定义引用数据类型去重问题: 重写hashcode()和equals()方法,计算桶的位置时根据对象的内容计算而非地址 import java.util.HashSet; import java.util.Set; public class Demo01 { public static void main(String[] args) { Set<String> set=new HashSet(); //boolean add(E e) 如果此 set 中尚未包含指定元素,则添加指定元素 set.add("呵呵"); set.add("不好"); set.add("啦啦"); set.add("你好"); set.add("哈哈"); set.add("呵呵"); //数据存放的的顺序和添加的不一定一致,但是一旦确定不会改变,无序不可重复 System.out.println(set); //boolean remove(Object o) 如果指定元素存在于此 set 中,则将其移除 set.remove("不好"); System.out.println(set); } }

(2)TreeSet

TreeSet 底层是由TreeMap维护 底层: 红黑树,平衡二叉树的一种 优点:默认升序排序 场景: 去重,对多个数据存在自定排序的,没有索引

三、Map接口

存储键值对类型的数据 k-v ->映射关系 k的特点: 无序的,不可重复的 -->所有的key,就是一个set集合 v的特点: 无序的,可重复 --> Collection的特点 一个key对象一个value值,如果想要对应多个,多个value值可以存在在一个数组|容器中 key相同时候,value会覆盖 //导包 import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Map01 { public static void main(String[] args) { Map<String,Integer> map=new HashMap(); //put(key,value) 添加 map.put("java-33", 23); map.put("java-32", 20); map.put("java-32", 21); map.put("java-31", 40); map.put("java-30", 35); map.put("java-29", 20); System.out.println(map); //remove(key) 返回被移出的value值 map.remove("java-32"); System.out.println(map); //包含 System.out.println(map.containsKey("java33")); System.out.println(map.containsValue(19)); //get(key)获取 System.out.println(map.get("java33")); System.out.println(map); //遍历方式 //1.keySet() 返回所有的key,组成一个set集合 Set<String> set=map.keySet(); //迭代器 iterator() Iterator<String> it=set.iterator(); while(it.hasNext()){ String key=it.next(); System.out.println(key+","+map.get(key)); //key键 } } }

1.HashMap接口

HashMap接口 底层: 哈希表的结构 初始容量:16 加载因子: 0.75 扩容:原容量的2倍 如果HashMap的key是自定义的引用数据类型,需要对key的数据的类型重写hashCode()和equals()方法,实现去重,value会覆盖 如果key相同,value不覆盖-->先判断,如果key相同就不存储,key不相同,才存储 如果需求个根据value去重,需要自己手动定义判断 containsKey() containsValue() HashMap 推荐使用 ,线程不安全,增删,查询效率高TreeMap 中的数据有按照指定规则进行排序,推荐使用TreeMapHashtable 线程安全的HashMap

2.TreeMap接口

TreeMap是一个基于红黑树结构的NavigableMap接口实现,因为key必须可比,所以key不能是null,value可以是null。同HashMap,非线程安全,遍历时修改元素会快读失败
最新回复(0)