常用集合分类及详解

常用的几大集合

list集合
set集合
map集合

概念:

list集合和set集合有一个公共的父接口Collection,接口里定义了一些主要的方法

list集合是有序且可以重复的,list集合主要分为Arraylist集合、Linkedlist集合、vector集合。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
Arraylist集合:
底层的数据结构是数组,在线程上是不安全的。使用Arraylist构造函数时,如果不传递参数,则默认调用无参构造方法,创建Arraylist对象时默认长度为10。
Arraylist包含许多的方法,例如:add、addAll、remove、removeAll、clear等。
当调用add方法时线程时不安全的,为什么会这么说呢?当我们多线程操作的时候就会导致数组越界,什么叫数组越界,就是相同的空间内我们存入了超出容量的内容。当我们使用下表存储的时候同样也会导致线程的不安全,比如出现两个数据共用一个下标,另一个下标空余。
当我们使用remove方法是,只是删除了数据,对表的容量并没有做出更改,如果想对表容量也进行更改的话,需要调用trimTosize方法。
Arraylist为我们提供了两组函数:Object[] toArray()、T[] toArray(T[] contents),直接调用toArray()会抛出异常,调用toArray(T[] contents)则不会,使因为java不支持向下转型。
什么是向下转型,这就要对类继承有所了解了,在这里举一个例子:
假定有两张表分别为父类表A、子类表B,
B extends A,
B b = new B();
A a = b;
使用了父类的引用,引用子类对象,是向上转型,属于自动的的,不需要我们去做任何事。
b = (B) a;
不使用父类引用,直接使用子类引用,就是向下转型,需要我们进行强制转换。
(继承是单一的,实现接口可以实现多个,中间需要用“,”间隔,我们可以把接口看作是一种规则,默认是抽象的,如果子类实现了接口就一定要实现接口里的方法,否则我们可以认为子类也是抽象类)
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
Linklist集合:
底层数据结构是双向链表,在线程上是不安全的。
双向链表包含两个重要成员:header、size。size顾名思义就是结点的个数,而header是双向链表的表头,也是双向链表节点所在的类Entry的实例,Entry包含几个成员变量,如previous、next、element,previous是上一个节点的意思,next是下一个节点的意思,element是节点所包含的内容。有双向链表肯定就有单向链表,什么是单项链表,简单来说,单链表只能从一端开始,如果要查找某个节点只能从头开始遍历,而双向链表则不用,他每个节点之中都有两个指针,一个指向头,一个指向尾,想要找到一个节点,可以从任意位置开始,插入元素可以在任意位置插入,不需要移动位置,相对于Arraylist来说要优很多,Arraylist每插入一个元素都要移动好多元素。
Arraylist有add、remove、等方法,Linkedlist同样也有,比如add方法,我们可以自由的选择是从头插入信息还是从尾部或者任意位置,当指定位置是需要我们指定下标:add(int index,E e),删除同样如此,删除具体对象时需要指定对象:remove(E e),虽然查询效率低,但同样也有get方法,可以获取到头部、尾部、或任意位置的元素,get(int index)、getFirst,当然了还有一些特有的方法,添加和删除也可以使用别的方法进行替换。
什么时候使用list集合?
当涉及到栈、队列、链表等操作时可以考虑使用list集合。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
vector集合:
底层数据结构是数组,在线程上是安全的,效率低。现在并不常用这个集合。

set集合是无序且不可重复的,set集合主要分为hashset集合、treeset集合。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
hashset集合:
底层是哈希表实现,可以为null。当我们向hashset当中存入数据时,它会调用对象的hashcode方法,查询到该对象的hashcode值,根据值来确定对象的存储位置。
equals相同时hashcode一定相同,hashcode相同时,并不一定是同一个对象,一个位置可能存了两个值。
双等号==是引用比较;
equals是值比较
hashcode是地址比较
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
treeset集合:
底层是二叉树实现的,可以对set集合进行排序,默认升序,不允许为null。支持两种排序:自然排序和定制排序,默认的是自然排序,treeset当中存放的是同一个类对象,通过equals能判断出对象是否相等,自然排序是根据元素大小,以升序进行排列得。如果要使用定制排序,需要使用comparator接口,使用int compare(T o1,T o2)方法。

*map集合是K/V结构的,key值不允许重复,如果重复,则后出现的替换先出现的,value值允许重复。map集合主要分为hashmap集合、hashtable集合、treemap集合。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
*
hashmap集合:
底层是哈希表实现,以数组方式存储K/V,在线程上是不安全的,允许为null。
不能够保证迭代顺序就是插入时的顺序,key的hash值是先计算hashcode值,在根据hashcode值来进行计算的,每次容量扩容都会重新进行计算hash值,会造成资源浪费。要求key必须重写equals和hashcode方法。初始容量默认为16,每次扩容为 旧容量x2,查找元素快,如果key相同跳转value,如果value不同按照链表存贮,一个key后边可以有多个value。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
hashtable集合:
属性文件-properties,文件内容以=和空格形式创建,如,name=jack;pass 123,在线程上是安全的,效率低。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
treemap集合:
底层是红黑二叉树实现,不允许为null,根据键排序。
存入treemap的元素应当实现Comprable接口或者Comparator接口,会按照排序的顺序迭代元素,Comprable只有一个comparato(T o)方法,主要用于自身比较,有一个sort排序;Comparator有compare和equals两个方法,相当于一个比较器,可以升序排列,也可以降序排列,算法的实现,算法和数据分离。

你可能感兴趣的:(java)