在项目中主要使用 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倍
    LinkedList底层是链表结构,适合对动态长度的元素集合做增删插入
    Vector线程安全,低效,ArrayList线程不安全,查询高效,LinkedList线程不安全,增删插入高效

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类型的属性将被省略。