java集合 List Set Map

概述

List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
Set下有HashSet,LinkedHashSet,TreeSet
List下有ArrayList,Vector,LinkedList
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap

集合的概念:

对象的容器,和数组类似,定义了对多个对象进行操作的常用方法。

List 有序、有下标、元素可以重复

  1. ArrayList
    底层数据结构是数组,查询快,增删慢,线程不安全,效率高
  2. LinkedList
    底层数据结构是链表,查询慢,增删快,线程不安全,效率高
  3. Vector
    底层数据结构是数组,查询快,增删慢,线程安全,效率低

Set 无序、无下标、元素不可重复

  1. HashSet (无序,唯一)
    存储结构:哈希表(数组+链表+红黑树),通过hashCode和equals来保证元素唯一
    特点
    基于HashCode计算元素存放位置利用31这个质数,减少散列冲突31提高执行效率 31 * i = (i << 5) - i 转为移位操作当存入元素的哈希码相同时,会调用equals进行确认,如果结果为true,则拒绝后者存入
  2. TreeSet
    存储结构:红黑树
    特点
    基于排列顺序实现元素不重复实现SortedSet接口,对集合元素自动排序,元素对象的类型必须实现Comparable接口,指定排序规则通过CompareTo方法确定是否为重复元素

Map 存储一对数据,无序、无下标,键不可重复,值可重复

1.HashMap
JDK1. 2版本,线程不安全,运行效率快;允许用null作为key或是value。

原码分析总结

  • HashMap刚创建时,table是null,节省空间,当添加第一个元素时,table容量调整为16

  • 当元素个数大于阈值(16*0.75 = 12)时,会进行扩容,扩容后的大小为原来的两倍,目的是减少调整元素的个数

  • jdk1.8 当每个链表长度 大于8 ,并且数组元素个数大于等于64时,会调整成红黑树,目的是提高效率

  • jdk1.8 当链表长度 小于6 时 调整成链表

  • jdk1.8 以前,链表时头插入,之后为尾插入

  • Hashtable
    JDK1.0版本,线程安全,运行效率慢;不允许null作为key或是value。

  • Properties
    Hashtable的子类,要求key 和value都是String。通常用于配置文件的读取。

  • TreeMap
    实现了SortedMap接口(是Map的子接口),可以对key自动排序。

    泛型

  • 本质是参数化类型,把类型作为参数传递

  • 常见形式有泛型类、泛型接口、泛型方法

  • 语法 T成为类型占位符,表示一种引用类型,可以写多个逗号隔开

  • 好处 1. 提高代码重用性 2. 防止类型转换异常,提高代码安全性

泛型集合

概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致

特点

  • 编译时即可检查,而非运行时抛出异常
  • 访问时,不必类型转换(拆箱)
  • 不同泛型之间应用不能相互赋值,泛型不存在多态

Collections 集合工具类,定义了除了存取以外的集合常用方法

copy复制、reverse反转、shuffle打乱

// list转成数组
Integer[] arr = list.toArray(new Integer[10]);
sout(arr.length);
sout(Array.toString(arr));

// 数组转成集合
// 此时为受限集合,不能 添加和删除!
String[] name = {"张三","李四","王五"};
List<String> list2 = Arrays.asList(names);

// 把基本类型数组转为集合时,需要修改为包装类
Integer[] nums = {100, 200, 300, 400, 500};
List<Integer> list3 = Arrays.asList(nums);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值