java基础-双列集合 map

 map

Map是不是Entry的容器 Entry<K,V>是一个key-value集合

线程不安全,适合在单线程中使用

结构

数组+链表+二叉树,红黑树1.8

  1. 数组 查询快
  2. 链表 插入快
  3. 红黑树 数据多时,查询快

存储

把key对象通过hash()方法计算hash值,然后用这个hash值对数组长度取余数(默认16),来决定该对KEY对象存在哪里。默认加载因子为0.75,默认数组大小是16

扩容

扩容 一定程度上也防止了hash 碰撞

扩充次数过多,会影响性能,每次扩充表示哈希表重新散列(重新计算每个对象的存储位置) 我们在开发中尽量要减少扩充次数带来的性能问题。 存值尽量分散

api

V get(0bject key)

获取与键关联的值;返回与键关联的对象,

如果映射中没有这个对象,则返回null。实现类可以禁止键为 null

V put(K key, V value)

如果这个键已经存在,新的对象将取代与这个键关联的旧对象。这个方法将返回键关联的旧值

如果之前没有这个键,则返回 null。实现类可以禁止键或值为 null。

void putAll(Map<? extends K,? extends V> entries)

将给定映射中的所有映射条目添加到这个映射中。

相同的key值则返回原集合中的value ,不同的key则添加进去 返回为空

boolean containsKey(0bject key)

如果在映射中已经有这个键,返回 true。

boolean containsValue(0bject value)

如果映射中已经有这个值,返回 true。

void clear()

boolean isEmpty()

Set<K> keySet()

Collection<V> values()

V remove(Object key)

新API

default V getOrDefault(0bject key, V defaultValue) 8

putIfAbsent(K,V) 只会添加不存在相同key的值 避免覆盖

初始化大小

expectedSize/0.75+1

GUAVA Maps.newHashMapWithExpectedSize()

LinkedHashMap

双重链表来维护如果要保证map中存放的key和取出的顺序一致

C->B->A

新增D:D->C->B

新增C:C->D->B

LRUCache<T>

TreeMap

Hashtable

Hashtable 线程安全集合,运行速度慢

Hashtable 命运和Vector是一样的,从JDK1.2开始,被更先进的HashMap取代

HashMap 允许存储null值,null键

Hashtable 不允许存储null值,null键

基于哈希表实现(数组+链表)默认数组大小为11,加载因子0.75

扩充方式:原数组大小<<1 (*2) +1

Properties

Properties()

创建一个空属性映射

Properties(Properties defaults)

用一组默认值创建一个空属性映射

String getProperty(String key)

获得一个属性。返回与键(key)关联的值,或者如果这个键未在表中出现,则返回默认值表中与这个键 关联的值,或者如果键在默认值表中也未出现,则返回 null

String getProperty(String key,String defaultValue)

如果键未找到,获得有默认值的属性。返回与键关联的字符串,或者如果键在表中未出现,则返回默认字 符串。

0bject setProperty(String key,String value)

设置一个属性。返回给定键之前设置的值。

void load(InputStream in) throws IOException

从一个输入流加载一个属性映射。

void store(0utputStream out,String header)1.2

将一个属性映射保存到一个输出流。header 是所存储文件的第一行。

java.tang.System 1.0

Properties getProperties()

获取所有系统属性。应用必须有权限获取所有属性,否则会抛出一个安全异常。

String getProperty(String key)

获取给定键名对应的系统属性。应用必须有权限获取这个属性,否则会抛出一个安全异常。以下属性总是 允许获取

枚举和映射

EnumSet 是一个枚举类型元素集的高效实现。由于枚举类型只有有限个实例,所以EnumSet 内部用位序列实现。如果对应的值在集中,则相应的位被置为。

EnumSet类没有公共的构造器。要使用静态工厂方法构造这个集∶

enumWeekday{ MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY };
EnumSet<Weekday> always = EnumSet.all0f(Weekday.class);
EnumSet<Weekday> never = EnumSet.none0f(Weekday.class);
EnumSet<leekday> workday = EnumSet.range(Weekday.MONDAY, weekday.FRIDAY);
EnumSet<Weekday> mwf = EnumSet.of(Weekday.MONDAY,Weekday.WEDNESDAY,Weekday.FRIDAY);

可以使用 Set 接口的常用方法来修改 EnumSet。

EnumMap 是一个键类型为枚举类型的映射。它可以直接且高效地实现为一个值数组。需要在构造器中指定键类型

var personInCharge = new EnumMap<Weekday,Employee>(Weekday.class)

static <E extends Enum<E>> EnumSet<E> all0f(Class<E> enumType)

返回一个包含给定枚举类型的所有值的可变集

static <E extends Enum<E>>Enunset<E> none0f(Class<E> enumType)

返回一个初始为空的可变集

static <E extends Enum<E>> EnumSet<E> range(E from, E to)

返回一个包含 from~to之间的所有值(包括两个边界元素)的可变集

static <E extends Enum<E>> EnumSet<E> of(E e)

static <E extends Enum<E>> EnumSet<E> of(E el, E e2,E e3,E e4,E e5)

static <E extends Enum<E>> EnumSet<E> of(E first,E... rest)

返回包括不为 null 的给定元素的可变集。

java,util.EnumNap<( extends Enum<K>,V> 5

EnumMap(Class<K> keyType)

构造一个键为给定类型的空的可变映射。

标识散列映射

类 IdentityHashMap有特殊的用途。在这个类中,键的散列值不是用 hashCode 函数计算的,而是用 System.identityHashCode 方法计算的。这是 Object.hashCode 根据对象的内存地址计算散列码时所使用的方法。而且,在对两个对象进行比较时,IdentityHashmap类使用=而不使用equals。

也就是说,不同的键对象即使内容相同,也被视为不同的对象。在实现对象遍历算法(如对象串行化)时,这个类非常有用,可以用来跟踪哪些对象已经遍历过。

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java单列集合双列集合的遍历方法: 1. 单列集合的遍历: - 使用迭代器(Iterator)进行遍历: ```java List<String> list = new ArrayList<>(); list.add("小鲁班"); list.add("貂蝉"); list.add("后羿"); list.add("白起"); list.add("亚瑟"); list.add("百里守约"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String name = iterator.next(); System.out.print(name + " "); } // 输出结果:小鲁班 貂蝉 后羿 白起 亚瑟 百里守约 ``` - 使用增强for循环进行遍历: ```java List<String> list = new ArrayList<>(); list.add("小鲁班"); list.add("貂蝉"); list.add("后羿"); list.add("白起"); list.add("亚瑟"); list.add("百里守约"); for (String name : list) { System.out.print(name + " "); } // 输出结果:小鲁班 貂蝉 后羿 白起 亚瑟 百里守约 ``` 2. 双列集合的遍历: - 使用迭代器(Iterator)进行遍历: ```java Map<String, Integer> map = new HashMap<>(); map.put("小鲁班", 1); map.put("貂蝉", 2); map.put("后羿", 3); map.put("白起", 4); map.put("亚瑟", 5); map.put("百里守约", 6); Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, Integer> entry = iterator.next(); String name = entry.getKey(); int value = entry.getValue(); System.out.println(name + ": " + value); } // 输出结果: // 小鲁班: 1 // 貂蝉: 2 // 后羿: 3 // 白起: 4 // 亚瑟: 5 // 百里守约: 6 ``` - 使用增强for循环进行遍历: ```java Map<String, Integer> map = new HashMap<>(); map.put("小鲁班", 1); map.put("貂蝉", 2); map.put("后羿", 3); map.put("白起", 4); map.put("亚瑟", 5); map.put("百里守约", 6); for (Map.Entry<String, Integer> entry : map.entrySet()) { String name = entry.getKey(); int value = entry.getValue(); System.out.println(name + ": " + value); } // 输出结果: // 小鲁班: 1 // 貂蝉: 2 // 后羿: 3 // 白起: 4 // 亚瑟: 5 // 百里守约: 6 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值