集合知识点

集合

集合类及相关接口的关系总览:

 Collection接口是java所有集合类的总接口

集合和数组的区别及特点比较:

1.集合与数组存储数据概述:

集合、数组都是对多个数据进行存储操作的结构,简称Java容器。

说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中)

2.数组存储的特点

>一旦初始化以后,其长度就确定了。

>数组一旦定义好,其元素的类型也就确定了。我们也就只能操作指定类型的数据了。比如:Stringl] arr;int[ ] arri;object[]arr2;

3.数组存储的弊端:

>一旦初始化以后,其长度不可修改。

>数组中提供的方法非常有限,对于添加、删除、插入数据非常不便同时效率不高。

>获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用

>数组存储数据的特点:序、可重复。对于无序、不可重复的需求,不能满足。

4.集合存储数据的优点:解决了数组存储数据的弊端。

集合框架:

/----ColLection接口:单列集合,用来存储一个一个的对象

/----List接口:存储有序的、可生复的数据。 ->“动态”数组,替换原有的数组

/----ArrayList;作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[ ] elementData存储

/----LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表(通过一个元素可以知道位于他之前的元素和位于它之后元素(单向就不行))存储

/----Vector:作为List接口的古老实现类;线程安全的,效率低:底层使用Object[ ] elementData存储

/----Set接口:存储无序的、不可重复的数据 à高中讲的“集合”

/----Hashset:作为Set接口的主要实现类;线程不安全的;可以存null值

/----LinkedHashSet:作为HashSet的子类:遍历其内部数据时,可以按照添加的顺序遍历,对于频繁的遍历,效率比hashset高,(这个类就是为频繁的遍历而设计的)

/----TreeSet:可以按照添加对象的指定属性,进行排序。(就表明只能添加同一类型的对象)

ArrayList, LinkedList、Vector三者的异同?

类都是实现了List接口,存储数据的特点相同:存储有序的、可重复的数据

Collection接口

Collection接口扩展了Iterable接口,因此对于标准类库中的任意集合都可以使用增强for循环,或者调用iterator()方法;

Collection集合常用方法:

ApI java.util.Collection<E> 1.2

IteratorcE> iterator()

返回一个用于访问集合中各个元素的迭代器。

int size()

返回当前存储在集合中的元素个数。

boolean isEmpty()

如果集合中没有元素,返回true。

boolean contains(Object obj)

如果集合中包含了一个与obj相等的对象,返回true。

boolean containsAll(Collection<?> other)

如果这个集合包含other集合中的所有元素,返回true。

boolean add(E elenent)

将一个元素添加到集合中。如果由于这个调用改变了集合,返回true。

boolean addAll(Collection<? extends E> other)

将other集合中的所有元素添加到这个集合。如果由于这个调用改变了集合,返回true。

• boolean remove(Object obj)

从这个集合中删除等于obj的对象。如果有匹配的对象被删除,返回true。

boolean removeAll(Collection<?> other)

从这个集合中删除other集合中存在的所有元素。如果由于这个调用改变了集合,返回true。

default boolean removeIf(Predicate<? super E> filter)8

从这个集合删除filter返回true的所有元素。如果由于这个调用改变了集合,则返回true。

void clear()

从这个集合中删除所有的元素。

boolean retainAll(Collection<?> other)

从这个集合中删除所有与other集合中元素不同的元素。如果由于这个调用改变了集合,返回true。

Object[] toArray()

返回这个集合中的对象的数组。

<T> T[] toArray(T[] arrayToFill)

返回这个集合中的对象的数组。如果arrayToFill足够大,就将集合中的元素填入这个数组中。剩余空间填补null;否则,分配一个新数组,其成员类型与arrayTofill的成员类型相同,其长度等于集合的大小,并填充集合元素。

 List接口的常用方法

ArrayList的源码分析:

jdk 7情况下

造对象  ArrayList list = new ArrayList() ;底层创建了长度是10的Object[  ]数组elementData

List.add(123);//eLementData[0]= new Integer(123);

List.add(11);//如果此次的添加导致底层elementDota数组容量不够,则扩容。

默认情况下,扩容为原来的容量的1.5倍,同时需要调用copy函数将原有数组中的数据复制到新的数组中。

结论:建议开发中使用带参的构造器:ArrayList list = new ArrayList(int capacity);避免中间环节去不断地扩容;

jdk 8中ArrayList的变化

ArrayList List= new ArrayList();//底层object[ ] elementData初始化为{ };(具体代码:private static final Object [ ] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = { };).并没有创建长度为10的数组;

list.add(123);//第一次调用add()时,底层才创建了长度10的数组,并将数据123添加到eLementData[0];

后续的添加和扩容操作与jdk7无异;

小结:第二种对象的创建有点像单例模式的懒汉式,延迟数组的创建,体现内存节省;

LinkedList的源码分析:

LinkedList List = new LinkedList();内部声明了Node(数据存储的具体单位)类型的first(标记头)和Last(标记尾)属性,默认信为noll。

list.add(123);//将123封装到Node中,创建了Node对象。(其中,Node定义为:体现了LinkedList的双向链表的说法)

private static class Node<E>{
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E elerent, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
        }
    }

Vector的源码分析:

和jdk7之前的ArrayList的源码差不多,都是创建了大小为10的数组,扩容时 扩大2倍。

Set接口的框架

/----Collection接口:单列集合,用来存储一个一个的对象

/----Set接口:存储无序的、不可重复的数据 à高中讲的“集合”

/----Hashset:作为Set接口的主要实现类;线程不安全的;可以存null值

/----LinkedHashSet:作为HashSet的子类:遍历其内部数据时,可以按照添加的顺序遍历,对于频繁的遍历,效率比hashset高,(这个类就是为频繁的遍历而设计的)

/----TreeSet:可以按照添加对象的指定属性,进行排序。(就表明只能添加同一类型的对象)

Set:存储无序的不可重复的数据(注释:什么是无序?什么是不可重复?)

Set集合特点:

以HashSet为例说明:

1.无序性:不等于随机性。它是指存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值添加。

2. 不可重复性:保证添加的元素按照equals()判断时,不能返回true.即:相同的元素只能添加一个。详细过程在下面;

添加元素的过程,以HashSet为例:

我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为:索引位置),判斯数组此位置上是否已经有元素:

如果此位置上没有其他元素,则元素a添加成功,-->情况1

如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素b的hash值:

如果hash值不相同,则元素a添加成功。--->情况2

如果hash值相同,进而需要调用元素a所在类的equals()方法:

equals()返回true,元素a添加失败

equals()返回false,则元素添加成功,--->情况2

对于添加成功的情况2和情况3而言:元素a与已经存在指定索引位置上数据以链表的方式存储。jdk7:元素a放到数组中,指向原来的元素。

jdk 8:原来的元素在数组中,指向元素和a

总结:七上八下,(在jdk7.0之前是将索引位置相同的新添加的元素添加在现有元素的上面,而jdk8之后就添加在下面,这直接影响了遍历元素时同一索引处链表中元素遍历的顺序)

Hashset底层是由数组和链表组成。

TreeSet集合知识点:

/----TreeSet:可以按照添加对象的指定属性,进行排序。(就表明只能添加同一类型的对象)

知识点涉及两种排序方式:自然排序(实现comparable接口),定制排序;

自然排序中我们比较两个对象是否相同的标准为compareTo()方法的返回值是不是0,不再是看equals()方法;

当我们在treeset集合中存储的元素是我们自定义的类(并非常见的八种基本数据类型)时,我们要对元素排序时需要使我们定义的类实现comparable接口并且重写compareTo()方法,并且在compareTo()方法中设计排序的方式;如下图(排序涉及name和age)

TreeSet集合存储数据特点:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值