Java中的集合类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的集合类相关的知识,希望对你有一定的参考价值。

作用:操作中大量对象的临时存放问题,由于数组存在不能灵活变换存放空间大小,所有就有了集合.

注:数组和集合的区别:数组长度不可变,且存储基本数据类型,集合长度可变,只能存储对象

因为容器中数据结构不同,容器有很多种,不断的共性功能抽取,形成了集合体系.

集合框架:

Collection 
List:有序(存入的顺序和取出的顺序一致).有索引.允许重复元素
│├LinkedList 链表结构 增删快(相对于ArrayList)
│├ArrayList 数组结构 查询快(相对于LinkedList)
│└Vector 
│ └Stack 
Set:,存取无序.不允许重复元素
Map 
Hashtable 哈希表.是同步的.不允许null键,null值
HashMap 哈希表,是不同步的,允许null键,null值
└TreeMap 二叉树,不同步的.可以对键排序

-----------------------------------------------------------------------

一,Collection集合

A.共性功能
1,添加
  boolean add(object obj);//添加单个对象
  boolean addAll(Collection c);//添加集合
2,删除
  void clear();//清除全部
  boolean remove(Object obj);
  boolean removeAll(Collection c);//删除交集
  boolean retainAll(Collection c);//保留交集
3,获取长度
  int size();
4,判断
  boolean isEmpty();
  boolean contains(Object o);
  boolean containsAll(Collection c);
5,将集合转成数组
  toArray();
  toArray([]);
6,取出集合中元素
  Interator iterator()//获取集合中元素上迭代功能的迭代器对象
  //迭代:取出元素中一种方式.
  //迭代器:具备迭代功能的对象,迭代器不需要new,直接通过iterator()方法获取
使用:Interator it = coll.iterator();//coll--集合
        System.out.println(it.next);   
    for(Iterator it=coll.iterator();it.hasNext();){
      System.out.println(it.next());
    }
注:对不同容器关于取出元素的内部类抽取,实现一个接口Iterator
  包括:next(),hasNext(),remove(),
  迭代器是取出Collection集合元素中的公共方法
 
B.List接口中的特有方法:它的特有方法都是围绕索引定义的
支持增删改查.
增:add(index,element);
删:remove(index);
改:set(index,newelement);
查:int indexOf(element);
   element get(index);
//迭代过程中使用了使用集合对象同时对元素进行操作,导致了迭代的不确定性
//解决:在迭代过程中,使用迭代器的方法-->list特有的迭代器.ListIterator
    通过List集合的方法listIterator()获取该迭代器对象
注:ListIterator可以实现在迭代过程中的增删改查.
 
C:List集合的具体子类及特点:子类之所以区分,是因为内部的数据结构(存储数据方式)不同
  |--Vector:数据结构是数组.数组是可变长度的(不断new新数组并将原数组复制)
  |--ArrayList:也是数组结构,也是长度可变.线程不同步,替代了Vector
        增删速度相对于LinkedList不快,查询速度快
  |--LinkedList:链表结构,线程不同步.增删速度很快,查询速度较慢
 
D.Set集合:不允许重复元素.和Collection方法相同.set集合取出方法只有迭代器
  |--HashSet:哈希(散列)表结构,-->比数组查询效率高
    用于存储元素和哈希值对应关系的容器称为哈希表
    1,不允许存储重复元素,因为会发生不确定性.
    2,不保证存入和取出的顺序一致.
    当哈希算法算出的两个元素的值相同时,称为哈希冲突-->
    冲突后,需要对元素进行进一步判断(判断内容,equals),-->拉链法
 
    注:哈希表在判断元素是否相同:依据hashCode方法,如果哈希重复(哈希值相同),再判断元素的equals方法,如果equals返回true,不存,返回false..
    如何保证唯一性:元素必须覆盖hashCode和equals方法;覆盖hashCode方法是为了根据元素自身的特点确定哈希值.覆盖equals方法是为了解决哈希值的冲突.
  |-->LinkedHashCode(HashCode的子类)
  |--TreeSet
    二叉树数据结构,可以对元素进行排序,不同步的
    需要元素具有比较功能,必须使用Compareable接口实现CompareaTo方法.
    需求中也有这样的情况,元素具备的比较功能不是所需要的,也就是不想按照自然排序方式而是自定义的排序方式对元素进行排序,而且存储TreeSet中的元素万一没有比较功能-->这时可以使用第二种比较方式--让集合具备比较功能.---TreeSet构造函数有直接在创建对象时通过比较器比较的方法
    实现Comparetor接口,覆盖compare方法,将Comparetor接口的对象,作为参数传递给TressSet集合的构造函数
    比较器比较灵活,并且降低了对象和比较方法的耦合性
 
二,Map集合
Map:双列集合,一次存一对,键-值队.要保证键的唯一性,值不需要
A.共性的功能
1.添加
v put(key,value);//若传入相同key,则返回前一个value,并使用现传入value进行覆盖
2.删除
void clear();
v remove(key);//返回value,同时删除
3.判断
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty();
4.获取
v get()
技巧:
JDK1.2以后出现的集合框架中的常用子类对象,存在规律
---前缀名是数据结构名,后缀名是所属体系名
ArrayList:数组结构,看到数组就知道查询快,看到List就可以增删改查
LinkedList:链表结构,增删快. xxxFirst xxxLast
HashSet:哈希表,元素必须覆盖hashCode和equals方法,查询速度快,不保证有序,看到Set就知道不可以重复
LinkedHashSet:链表+哈希表,可以实现有序
TreeSet:二叉树,可以排序-->两种比较方式,一种是自然排序compareable,一种是比较器,comparetor
5,遍历取出map所有值
Set<k> set = map.getKeySet();//获取所有包含key的set集合
for(K key:set){
  V value = map.get(key);//在通过key获取value
}

或者:

通过map获取entrySet(存放这key和map映射关系的对象的Set集合)利用这个映射关系构造一个迭代器,再通过me.getKey(),me.getValue()分别获取键和值

注:
集合框架的工具类
-------------------------------------------------------------------------
Collections:定义的都是操作Collection的静态方法
1.对list排序
sort(list)
 
class Student implements Comparable
{}
public static <T extends Comparable<? super T>>
void sort(List<T> list){}
 
2.逆序
reverseOrder
3.max min
4.二分查找
5.将非同步集合转成同步集合
-------------------------------------------------------------------------
Arrays:用来操作数组的工具类方法,方法都是静态的
 

以上是关于Java中的集合类的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中的集合类:List,Set及Map的层级关系

Java中的集合类Lambda鲁棒性简述

java中集合类中Collection接口中的List接口的常用方法熟悉

java List集合如何使用两个实体类中的参数方法?

Java中List集合的浅析

java集合类