java中的集合,泛型

集合与数组的区别
1.集合长度可变(自动扩容),数组不行。
2.集合只能存储引用数据类型,数组可以存储引用数据类型也可以存储基本数据类型。

集合类的体系结构
1.单列集合:Collection
2.双列集合:Map
Collections
Collection集合的工具包装类,里面全是静态方法。
1.public static <T extends Comparable<? super T>> void sort (List list) // 该方法能将Collection集合中的元素按升序排序。
2.public static void reverse(List<? > list) // 将集合中的元素反转。
3.public static void shuffle(List<? > list) // 使用默认随机源随机排列指定的列表。(使用场景:模拟洗牌)
Collection
1.List集合:可重复有序。其中有ArrayList和LinkedList

  1. List的特有方法:void add(index, E) // 在指定位置插入指定元素。
  2. E remove(index) // 删除指定位置元素并返回该元素。
  3. E set() // 修改指定位置的元素并返回被修改的元素。
  4. E get() // 返回指定位置的元素。
  5. ArrayList数组读取效率高,写效率底。而LinkedList链表集合读取效率低,写效率高。
  6. ArrayList源码解析
    底层实现:数组。
    size变量:记录下次操作的位置,记录目前ArrayList中的元素个数。
    自动扩容:空参构造默认为0,在添加时自动扩容为10。ArrayList有参构造默认大小为10,当超出容器范围时自动扩容一个新的大小为原来1.5倍的ArrayList并把原来的数据拷贝进新的ArrayList中。

2.Set集合:元素不可重复,存取无序,没有索引。其中有HashSet和TreeSet

  1. TreeSet特点
    底层:红黑树实现。
    1.按照规则自动排序。
    2.当使用自定义泛型时,需要实现Comparable接口并重写compareTo方法制定排序规则,称为自然排序。
    3.若自定义类型没有实现Comparable接口,还可以使用比较器,称为比较器排序。
    在这里插入图片描述
    4.默认使用自然排序的方式,当自然排序不能满足需求时用比较器排序。

  2. HashSet特点
    底层:哈希表结构。
    JDK的不同版本中哈希表的实现方式
    1.JDK8以前:哈希表底层是通过数组+链表实现的。
    2.JDK8版本之后:哈希表底层是通过数组+链表+红黑树实现的。

    1.哈希值:JDK根据对象的 地址值 或 属性值 计算出的,int整形数。
    2.Object类中 hashCode() 方法可获取对象的哈希值,此哈希值是通过对象地址计算得到的,可以重写此方法通过属性值计算哈希值。
    3.原理(JDK8之前):①当创建HashSet集合后底层会默认创建一个长为16,加载因子为0.75的数组并将所有元素赋值null。②每添加一个元素都根据该元素的哈希值和数组长度计算出插入位置。③再判断该位置元素是否为null,若是null则插入该位置。④若不是null 此时调用equals方法比较属性值是否一样,若一样不添加。⑤若不同则添加在该位置,该位置原来的元素以链表的形式接在新元素的后面。
    4.加载因子:数组存至 数组长度*加载因子 的长度时,哈希表会自动扩容为原来的两倍空间(在这里也就是 当数组中元素超过16*0.75=12 时,哈希表自动扩容为16的两倍 也就是32)。
    5.原理(JDK8(包含JDK8)之后):过程都相同,只不过在JDK8版本之后,当哈希表的某个位置的链表长度超过8时,该链表在底层会变成红黑树,哈希表的相应位置存储的是红黑树的根节点。(提高了效率)
    在这里插入图片描述

Map
概述:Map接口是一个接口,不能包含重复的键,一个键只能映射一个值。

1.HashMap: Map接口的一个实现类。
对键不排序,不重复。
注意:使用自定义类时需要重写hashCode()和equals()方法来达到键的唯一性。

遍历方式

  1. 使用keySet()方法先获取Map集合中的键,再遍历这些键通过get()方法遍历所有Map。
  2. 通过entrySet()方法获取Map中的键值对对象,遍历Set集合通过getKey()和getValue()方法遍历所有Map的键和值;

2.TreeMap:
对键排序,重复。

Iterator迭代器
hasNext() // 该方法确定当前位置有没有元素
next() // 去除当前元素,并将迭代器往后移动一个位置
remove() // 删除当前元素

增强for循环
底层为Iterator迭代器,只有实现Iterable接口的实现类才能使用迭代器。

泛型
1.将类型参数化,也就是把类型作为参数进行传递。
2.可也用在类,方法,接口中。
3.自定义泛型不能传基本类型,只能传引用类型。

  1. 泛型类:修饰符 类名{}
  2. 泛型方法:修饰符 返回类型 方法名<>{}
  3. 泛型接口:修饰符 interface 接口名{}

4.通配符:

  1. 通配符<?>:表示元素类型未知的父类,它的元素可以匹配任何类型。这种带通配符的父类仅仅表示它是各种泛型List类的父类,并不能把元素添加到其中。
  2. 通配符上限<? extends Number>:它表示类型是Number或其子类类型。
  3. 通配符下限<? super Number>:它表示类型是Number或其父类类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值