旧时笔记-集合

前言

该文章是站主前期学习笔记,搬运于此方便查询。

暂没有作格式处理。

正文

正文

正文

  • 集合相当于一个容器,用于储存JAVA对象的内存地址(引用),在开发中使用较多
  • JAVA有三种主要的集合类型:List、Set、Map,都是接口,前两个继承至Collection接口(一个一个存),Map为独立的顶级接口(一对一对存)
  • List:有序的集合,可以放重复的数据
  • Set:无序的集合,不能放重复的数据
  • Map:无序的集合,集合中包括一个不可重复的键对象,一个可重复的值对象。(身份证号-姓名)

(List和Set的继承关系)

(Map的继承关系)

Collection

部分方法:

add,添加元素

clear,清空集合

isEmpty,判断集合中是否有元素

size,获取集合中元素个数

toArray,将集合转换为数组

iterator,获取集合中依赖的迭代器对象

contains,判断集合中是否包含某个元素

remove,删除集合中某个元素

iterator,获取该集合的迭代器对象

 

注意:有另一个工具类-Collectiongs,里面有一个方法(synchronized)可以将非线程安全的集合转换为线程安全的集合。

 

(迭代器原理)

部分常用方法:

hasNext

next,取出元素,通过迭代器取出的元素一定是Object类,不使用泛型是,有时候需要强制向下转型以使用迭代出来的元素的方法。

注意:集合结构一旦发生改变,迭代器必须重新获取

 

 

ArrayList

  • 构造方法默认构造容量为10的ArrayList集合,可自己输入参数以确定集合的容量。甚至可以直接写入集合。
  • 集合的扩容:扩容至当前的5倍
  • 有点:检索效率高,每个元素都有独有的下标,向集合末尾添加元素效率也比较高
  • 缺点:随机增删元素的效率还是较低,此外数组的储存方式无法储存大数据量。

 

 

Map

  • Map与Collection之间没有继承关系
  • Map集合以key和value的方式储存数据(键值对),二者都是引用数据类型。其中key起主导作用,value是附属品。
  • 常用方法:

put,添加元素

get,通过key获取value

clear,清空Map集合

containsKey,判断集合中是否包含某个key

containsValue,判断集合中是否包含某个value

size,获取该集合的长度

remove,通过key删除元素

keySet,获取Map集合中所有的key(以set集合的形式获取)

entrySet,将Map集合转换为Set集合,该Set集合中的类型为:Map.Entry

  • 重点:HashMap集合初始化容量必须是2次幂,否则性能大打折扣。
  • 放在HashMap中的key元素以及放在HashSet集合中的元素,都需要重写hashCode()方法以及equals()方法。
  • 在jdk8之后,HashMap中的单向链表数据结构若超过八个,则会将单向链表变为红黑树,若红黑树上的节点数量小于6时,会重新吧红黑树变成单项链表数据结构
  • HashMap集合的key与value可以为null,但是Hashtable不可以。

 

 

Tree

  • TreeSet集合与TreeMap集合底层都是二叉树。
  • TreeSet集合中的元素相当于TreeMap集合中的key部分。
  • Tree集合中的元素可以根据元素的大小自动排序。前提是元素已经实现了lang.Comparable接口或使用Java.util.Comparator接口。
  • 由于Tree集合中有比较的方法,所以一般来说元素不用重写equals方法。
  • 若存放的是自定义方法,则程序员必须要让该自定义类实现Compareable接口并重写compareTo方法。
  • 若比较规则有多个,并且需要频繁切换比较规则,建议使用Comparator接口。(使用比较器)
  • 若比较规则不会发生改变的或只有一个比较规则的时候,建议使用Comparable接口。(让该类可以比较)

 

 

Java.lang.Comparable

  • 这个接口中要重写compareTo(Object o)这个方法。
  • 这个方法要返回int类型的数据。
  • 根据返回的数字的正负还是0值,进行排序。

负值:大于被比较的数据

正值:小于被比较的数据

0 :等于被比较的数据,表示相同,Value

 

 

Tree子平衡二叉树

  • TreeSet与TreeMap底层的数据结构是子平衡二叉树。
  • 遍历二叉树时有三种方式:

根左右(前序遍历)、左根右(中序遍历)、左右根(后序遍历)

  • 在TreeSet与TreeMap集合中采用的是“左根右”的遍历方式。

 

 

Hash表数据结构

  • 哈希表是数组与单项链表的结合体,试用恰当时能发挥两者的优点。
  • 哈希表底层实际上是一个一维数组,这个数组中的每一个元素是一个单项链表。(猪猪连)
  • 哈希表中的元素都有一个哈希值,这个值由哈希函数得到。hashCode();
  • 主要掌握,在哈希表中如何添加与删除元素
  • 哈希表中所有的元素都需要重写hashCoed() + equals()方法。
  • 而让哈希表发挥性能,起决定作用的是hashCoed()方法的重写。
  • HashMap集合初始化容量默认是16,当储存的元素达到75%的时候,数组开始扩容。

 

 

Collectiongs工具类

  • 区别于Collectiong,Collection是集合接口,Collections是集合工具类,在util包下。
  • 是一些针对集合的方法,方便对集合的直接操作。
  • 主要方法:

synchronized,使一个集合转换为线程安全的集合。

sort,对一个集合进行排序,前提是该集合已经实现了Comparable接口。

 

 

泛型(JDK5.0)

  • 泛型只在编译阶段起作用,也就是给程序员看的,运行阶段没用。
  • 泛型的好处:

集合中存储的元素统一了。

从集合中迭代出的元素是泛型指定的类型,不需要大量的向下转型。

  • 泛型的缺点:

    存入集合的元素变得单一,无多样性。

  • 泛型需要在创建集合对象时声明以及获取迭代器时声明,迭代器声明后,代出来的数据便是声明的类型,不再是默认的object类型。
  • 0之后加入了泛型的,自动类型推断机制。即在new泛型对象时,等号左边的类名不需要重复写泛型指定的类型,只写<>即可。(称为钻石表达式)

可自定义泛型,一般使用<E>或<T>来表达泛型的标识符(element与type首字母),在自定义类名前声明即可。

 

 

 

guest
0 评论
内联反馈
查看所有评论