集合(泛型、主要实现对实例的 增、删、改、查、插、长度、遍历)

类图

在项目中主要使用 List 和 Map 集合

1.1、Collection接口常用方法:

add(Object obj),

addAll(Collection coll),

size(),

isEmpty(),

clear();

contains(Object obj),

containsAll(Collection coll);

remove(Object obj);

removeAll(Collection coll),

retainsAll(Collection coll),

equals(Object obj);

hashCode(),

toArray(),

toArray(T[] arr)

//迭代

iterator(),

forEach() //forEach()是JDK8新特性,比如 list.forEach(System.out::println) 就可以实现元素的遍历打印

1.2、Collection接口常用子接口:List 和 Set 

      1.2.1、List的常用实现类:Vector、ArrayList(二者直接继承AbstractList类) 和 LinkedList(直接继承AbstractSequentialList,AbstractSequentialList 又是 AbstractList 子类)

          1.2.1.1、常用方法:add(Object obj)、remove(Object obj)/remove(int index)、set(int index,Object obj)、get(int index)、add(int index,Object obj)、size() (是元素数量,不是数组数量)、iterator(支持增删插入操作)/foreach/for循环

        1.2.1.2、区别:

        Vector和ArrayList底层均是数组存储,适合对长度固定的元素集合做查询,有参构造器创建时默认容量为参数大小,满了再次扩容的话前者是2倍,后者1.5倍;无参构造器创建时默认容量为10,满了再次扩容的话前者是2倍,后者1.5倍

        LinkedList底层是链表结构,无需扩容,适合对动态长度的元素集合做增删插入

        Vector线程安全,低效,ArrayList线程不安全,查询高效,LinkedList线程不安全,增删插入高效

                   业务上的原因导致80%以上为查询,因此大部分情况下Arraylist应用较多

      1.2.2、Set的常用实现类:HashSet、LinkedHashSet、TreeSet

       1.2.2.1、常用方法:使用的是Collection接口常用方法,没有额外新增方法

       1.2.2.2、区别:

       HashSet: 不按序存储,不存储重复元素,JDK1.7 底层是数组和链表,JDK1.8 底层又加入了红黑树,通过hashCode() 方法来获取存储索引,如果索引值冲突,使用equals()进行 实例比较,如果内容一样则不存储,如果不一样,在该节点下链表加挂,当加挂 节点 > 8 时,转为红黑树,当 节点数 <= 6 时转为链表

         LinkedHashSet: 是对HashSet的封装,使其可以按序存储

         TreeSet: 继承了SortedSet,不存储重复元素,通过让元素实现Compareable接口重写compareTo(),或者定义一个类来实现Comparator,重写compare()方法后实例化 并作为参数引入到TreeSet构造方法中实例出一个TreeSet对象实现排序

1.2.3、List和Set区别

      List:

    1.可以允许重复的对象。

    2.可以插入多个null元素。

    3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。

    4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。

      Set:

    1.不允许重复对象

    2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。

    3. 只允许一个 null 元素

    4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。

1.3、Map接口常用方法

Object put(Object key, Object value) //在Map后面追加新的键值对,如果Map中包含新Map的key,将对应的value用新value覆盖,并且返回被替换的值。

​

Object putIfAbsent(Object key, Object value)

​

V putIfPresent(Object key, Object value)

​

void putAll(Map mapping) //在Map后面追加新的键值对,如果Map中包含新Map的key,将对应的value用新value覆盖

​

Object remove(Object key) //删除该Map中key所对应的键值对

​

void clear()        //清空Map中的键值对,使其为空

​

Object get(Object key)  //根据key获取对应value

​

boolean containsKey(Object key) //判断该Map中是否包含指定key,包含则返回true,否则返回false

​

boolean containsValue(Object value) //判断Map中是否包含指定value,包含则返回true,否则返回false

​

int size()  //返回该Map的大小

​

boolean isEmpty()   //判断该Map是否为空,如果为空则返回true,否则返回false。

​

public Set keySet()

​

public Collection values()

​

public Set entrySet()

​

void forEach(BiConsumer action):该方法遍历 key - value 对,forEach()。

​

Object getOrDefault(Object key, V defaultValue): 获取指定 key 对应的 value 。如果该key不存在,则返回

defaultValue.

​

Object replace(Object key, Object value):将Map中指定key 对应的 value 替换成新的 value。不同与 put ,如果尝试替换的 元素 在原 Map 中不存在,该方法不会添加 key-value 对,而是返回null。

1.4、Map接口常用子类的区别(Hashtable、HashMap、TreeMap、ConcurrentHashMap)

      首先都不可以有重复的key值元素

  Hashtable: 线程安全,key和value不为null,否则NullPointException

  HashMap: 线程不安全,存储结构JDK1.8后是数组,链表,红黑树,key 和 value 可以为null

  TreeMap: 线程不安全,存储结构是红黑树,key 和 value 可以为null,继承了SortedMap,可以自定义排序

  ConcurrentHashMap: 线程安全,key 和 value 不可为null,否则NullPointException

1.5、工具类Collections(static 方法)

//排序

reverse(List) 反转List中元素的顺序

shuffle(List) 对list 集合元素进行随机排序

sort(List) 根据元素的自然顺序对指定List集合元素按升序排序

sort(List,Comparator) 根据指定的Comparator产生的顺序对List集合元素进行排序

swap(List,int,int) 将指定list集合的i处元素和j处元素进行交换

​

//查找、替换

Object max(Collection) 根据元素的自然顺序,返回给定的集合中的最大元素

Object max(Collection,Comparator) 根据Comparator指定的顺序,返回给定集合中的最大元素

Object min(Collection)

Object min(Collection,Comparator)

int frequency(Collection,Object) 返回指定集合中指定元素的出现次数

void copy(List dest,List src) 将src中的内容复制到dest中

boolean replaceAll(List list,Object oldVal,Object newVAl) 使用新值替换List对象的所有旧值

1.6、工具类Arrays(static 方法)

public static String toString(int[] a)   // 用于输出

​public static void sort(int[] a)  // 用于排序

​static <T> void sort(T[] a, Comparator<? super T> c) //  根据比较器排序​

static int binarySearch()   // 它必须在已经排序的数组中查找元素,系统对基本数据类型、Object、泛型都有相应的这种重载方法。同样两种查找方法:对所有数组元素进行遍历查找,另外一种是对数组中指定范围的元素进行查找。

1.7、Properties常用方法(继承Hashtable ,存储的是文件配置,所以不再是泛型,键值对直接都是String)

getProperty(String key)   在此属性列表中搜索具有指定键的属性。如果在此属性列表中找不到该键,则会检查默认属性列表及其默认值(递归)。如果未找到该属性,则该方法返回默认值参数。

list(PrintStream out)  将此属性列表打印到指定的输出流。此方法对于调试很有用。

load(InputStream inStream)  从输入字节流中读取属性列表(键和元素对)。输入流采用加载(Reader)中指定的简单的面向行的格式,并假定使用ISO 8859-1字符编码;即每个字节是一个Latin1字符。不在Latin1中的字符和某些特殊字符在使用Unicode转义符的键和元素中表示。 此方法返回后,指定的流仍保持打开状态。

setProperty(String key, String value) 调用 Hashtable 的方法 put 。他通过调用基类的put方法来设置 键值对。

store(OutputStream out, String comments) 将此Properties表中的此属性列表(键和元素对)以适合使用load(InputStream)方法加载到Properties表的格式写入输出流。 此Properties方法不会写出此Properties表的defaults表中的属性(如果有)。

storeToXML(OutputStream os, String comment, String encoding) 使用指定的编码发出表示此表中包含的所有属性的XML文档。

clear()  清除此哈希表,使其不包含任何键。

stringPropertyNames()  返回此属性列表中的一组键,其中键及其对应的值是字符串,如果尚未从主属性列表中找到相同名称的键,则包括默认属性列表中的不同键。键或键不是String类型的属性将被省略。

底层

  1. ArrayList中维护了一个Object类型的数组elementData,并且数组用transietn修饰;
  2. 无参构造器创建的话elementData默认容量为0,第一次添加会进行扩容,默认是扩容为10,当添加第11个元素的时候会以1.5倍扩容,即扩容为15
  3. 如果以容量作为参数通过有参构造的话,则elementData默认容量等于这个参数大小,扩容原理同上
  4. 虽然可以自动扩容,但不支持自动减少容量,但可以手动减少容量:list.trimToSize()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值