Java集合学习笔记

 集合

一.Java集合分为Collection和Map两种接口

Collection:存储单列数据,定义存储一组对象(非对象类自动装箱)的方法的集合。Collection下未提供相关的实现类,而是细分提供多个子接口。

*contains方法:判断集合中是否含有某元素,两者比较的不是地址,而是内容,用equals方法按顺序依次比较集合中的元素,所以元素如果是自定义的类,要重写equals方法,否则调用父类。

*removeAll方法:求两个集合的差集,对调用方法的集合进行修改,改变调用集合的内部元素。

*retainAll方法:获取两集合的交集,并修改调用方法的集合的元素

*equals方法:比较相同时对元素的顺序有要求

*集合转数组:调用array的静态方法asList():传参需为包装类的对象,否则可能会以数组作为一个整体读入

*迭代器:Iterator为设计模式的一种,主要用途为遍历集合中的元素;访问容器对象中的各个元素,但不需要暴露对象内部的细节。具体的执行原理与栈相仿。迭代器不是容器

         next方法:读取元素,越界抛异常

         hasNext方法:判断下一个下标是否还有元素,一般与next方法在while中搭配使用

*每调一次iterator方法,都会生成一个全新的迭代器

*foreach增强for循环:for(对象类型 局部变量:被遍历的对象),方法内部靠迭代器实现,工作流程为:被遍历对象自动按序抓取一个元素赋给局部变量,for中的执行语句执行命令操纵局部变量

     List接口(动态数组):元素有序可重复,且支持动态扩容。

                 ArrayList:作为List接口的主要实现类,线程不安全,但效率较高,底层采用Object数组实现。初始化时数组不分配内存,在第一次调用add时才分配内存,在输入元素长度和默认值10中取最大,默认扩容大小为1.5倍。当元素数目超过整形最大值时报错。

                 *remove方法中,索引优于元素,元素还需要装箱。如果要删去与索引有重叠的元素时,使用new加数据类,如new Integer(1)。

           LinkedList:对于频繁插入删除操作,使用此类效率更高,底层采用双向链表储存。

                 Vector:作为List接口的古老实现类,线程安全但效率低,底层采用Object数组储存。初始长度为10,扩容时默认为2倍

     Set接口:元素无序且不可重复。

     *无序性:不等于随机性,存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值进行存储

     *不可重复性:对添加的元素进行equals判断和地址判断,使相同的元素只能添加一个

                 HashSet:作为Set接口的主要实现类,线程不安全,可以储存null值。先调用元素所在类的hashcode()方法算出哈希值,通过地址哈希值和内容判断是否重复,遇到相同哈希值但内容不同的情况时,使用链表进行并列连接。底层实现依靠hashMap,利用的是HashMap中的Key,value中的并不是null(防止调用时出现空指针),而是Object静态对象,所有的Key都指向一个Object对象。

                 *改变初始元素的属性值可能使元素hash值发生改变,而原先存储元素的位置已经固定,可能无法被修改后的元素hush搜索到

                 *必须要重写hushcode,如果不重写调用的就是object中的hash方法,得到的结果随机计算,无法达到去重的效果。

                 *重写的方法尽量保持一致性,以确保相等的对象具有相等的散列函数

                 LinkedHashSet:作为HashSet的子类,在遍历内部元素时,可以按添加的顺序进行遍历,使用多加一对引用的方式实现

                 TreeSet:可以按照添加对象的指定属性进行自动由小到大排序,只能储存同一类的对象。当出现多个属性的类作为元素时,需要指定TreeSet的排序方式,即自然排序或定制排序。TreeSet通过比较器comparTo()比较,如果返回值是0就认为两值相同,后添加的元素无法进入TreeSet;定制排序在声明TreeSet()中填入参数,用compartor进行比较,比较两个参数是否相同的方法为compare返回值是否为0。

Map(函数性质):双列数据,保存具有映射关系的键值对的集合。Map提供相关实现类

*key是不重复的,且是无序的,用Set存储;value可重复且无序,用collection存储;一个key和一个value构成一个Entry对象,Entry对象为无序且不可重复的,使用Set存储

                 HashMap:作为Map接口的主要实现类:线程不安全,效率高,可以存储null值的key和value。底层采用数组加链表加红黑树的结构

                 *用CurrentHashMap解决线程安全问题,实现分段锁的技术,不同线程操纵不同的锁

                 *底层实现原理:底层先不创建数组,第一次调用put时,生成长度为16的Node数组(Node带有一个指针)。计算键的哈希值,再计算哈希值确定存放位置,如果位置上的数据不为空,则比较键的哈希值,再比较键的equals。如果不相同,以链表的方式存储;如果都相同,则新加入的键值覆盖原有的键值。Node数组扩容时默认为原来的两倍

                 *当数组的某一索引位置上的元素以链表的形式存在的数据个数大于8且当前数组的长度大于64时,此位置上的所有数据元素改为使用红黑树

                 *jdk7中的源码分析:capacity的移位工作机制决定了数组生成的长度是2的指数;加载因子loadFactor影响临界值,当数组中实际存储长度大于临界值时,数组自动扩容。默认loadFactor大小为0.75;在得到哈希值(不完全依赖hashcode方法)之后通过多次抑或和位移操作,最后使用与操作得到数组中应存放的位置;扩容的前提,同时满足长度大于临界值和新元素存放的位置为空。在扩容之后重新计算哈希值确定位置

                 *jdk8中的源码分析:空参构造器初始仅初始化加载因子;Node本质上是Entry的子类当单一索引链表长度超过8时,若数组长度不超过64,优先扩容

                 *设立临界值的原因,防止数组上串联太长链表但数组本身存放索引极少,目的在于减少链表的出现

                 *clear()方法并不是把Map清成null,而是把内部数据清空

                 LinkedHashMap:HashMap的子类,在原有的HashMap基础上增加了一对指针,指向前一个和后一个指针,保证在遍历map元素时可以按照添加的顺序实现遍历

                 *LinkedHashMap本身没有put方法,调用的是父类HashMap中的方法。Put方法没有被重写,重写的是newNode()方法,同时LinkedHashMap中的Entry继承了HashMap中的Node,在Node的基础上增加了一对指针,记录增加元素的先后

                 TreeMap:保证按照键值对的key进行排序,实现排序遍历,底层使用红黑树结构。要求key必须是由同一个类创建的,按key进行自然排序或定制排序

                 Hashtable:作为Map的古老实现类:线程安全效率低,不能存储null值的key和value

                 Properties:Hashtable的子类,常用来处理配置文件,将物理上的文件读入内存中。key和value都是String类型。

                 *使用Resource Bundle自动生成properties文件,使用file要自行补上后缀。使用pros方法读取文件和获得信息,找不到相应值就返回null。在使用后需要关闭流。

                  *考虑到出现异常后可能无法关闭文件,可以搭配try-catch使用

二.Collections工具类

Collections是操作List、Set和Map的工具类

    *copy()方法:使用copy时注意长度问题,目标List的长度必须大于等于被复制的List的长度。在撑起目标List长度的时候注意不能在括号中直接赋长度,size是List中实际存在的元素个数,而在括号中直接赋长度只是开闭如此长度的空间,其size依旧是0。应使用new Object[list.size()]来充填size。

    *使用synchronizedxxx()的方法将线程不安全的集合转变成线程安全的集合,如synchronizedList()

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值