集合Collection总结

         集合Collection总结

java基础中最重要的东西 —–集合
无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我花了一些时间,查阅了一些资料,总结了一下


一. 集合介绍

1.1为什么需要Collection

  集合类的出现:java是一门面向对象的语言,就免不了处理对象,为了方便操作多个对象,那么我们就得把这多个对象存储起来,想要存储多个对象(变量),很容易就能想到一个容器——-
  常用的容器我们知道有—>StringBuffered,数组,但是由于数组的长度固定;访问方式单一,只能用下标;删除数据,数据不连续,需要往前移动数据;插入数据,数据要向后移动,这些缺点,
  所以,java就为我们提供了集合(Collection).

1.2 数据和集合的区别

区别:
 1.长度的区别
  数组的长度固定;集合的长度可变。
  2.内容的区别
  数组存储的是同一种类型的元素
  集合可以存储不同类型的元素(一般我们不这样做)
  3.元素的数据类型
  数组可以存储基本数据类型,和引用类型
  集合只能存储引用类型(若是简单的int,它会自动装箱成Integer)

1.3Collection的由来与功能

Collection的由来:
  集合可以存储多个元素,但是我们对多个元素也有不同的需求  
- 多个元素,不能有相同的
- 多个元素,能够按照某个规则排序
针对不同的需求:java就提供了很多集合类,多个集合类的数据机构不同,但是,数据结构不重要,重要的是能够存储东西,能够判断,获取,把集合共性的内容不断往上提取,最终形成集合的继承体系—-
———Collection

集合(4接口,9类),Iterator,增强for,可变参数,集合工具类

Colletcion的大致结构体系是:

这里写图片描述

-1.3.1 Collection接口

  Collection是最基本的集合接口,一个Collection代表一Object,即Collection的元素(Elements),java sdk不提供直接继承自Collection的类,java SDK提供的类都是继承自Collection的“子接口”如List和Set
 1.) Collection的基础功能:
  这里写图片描述
  


  • Collection:单列集合的顶层接口,定义了单列集合的共性内容

package java.util;

public interface Collection<E> extends Iterable<E> {
    // Query Operations
    //查询的一些方法

    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Iterator<E> iterator();
    Object[] toArray();
    <T> T[] toArray(T[] a);

    // Modification Operations
    //修改的一些方法
    boolean add(E e);
    boolean remove(Object o);

    // Bulk Operations
    //一些批量操作的方法
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c);
    boolean removeAll(Collection<?> c);
    boolean retainAll(Collection<?> c);
    void clear();

    // Comparison and hashing
    //和hash对比  
    boolean equals(Object o);
    int hashCode();

成员方法: A:添加功能
     boolean add(Object obj):往集合中添加一个元素
     boolean addAll(Collection c):往集合中添加多个元素(即添加一个集合)
      B:删除功能
     void clear():清空所有元素
    boolean remove(Object o):从集合中删除一个元素
     boolean removeAll(Collection c):从集合中删除另一个集合的元素
      C:判断功能
     boolean contains(Object o):判断集合中是否包含指定的元素
     boolean containsAll(Collection c):判断集合中是否包含另一个集合的元素
     boolean isEmpty():判断集合是否为空。
     D:交集功能
    boolean retainAll(Collection c) :移除此 collection 中未包含在指定         collection 中的所有元素,如果此 collection 由于调用而发生更改,则返回true。
     E:迭代器(集合特有的遍历方式)
Iterator iterator()
    重点:Iterator的使用
    A:使用步骤
    B:迭代器原理
     F:长度功能
      int size():返回集合中元素的个数
练习题:数组有length()吗?字符串有length()吗?集合有length()吗?
答:数组里面是length属性;字符串里面是length()方法;集合里面是size()方法
    G:集合转数组 
  我们可以发现Collection的源码中继承了Iterable,有iterator()这个方法…
  如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代器对象:如下
  迭代器使用步骤:  

Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}

遍历集合的方法:
(1)将集合转成数组,遍历数组(不常用)
(2)迭代器遍历(创建迭代器对象,用while循环调用hasnext()方法判断下一个元素是否存在,然后调用迭代器的next()方法)
(3)用foreach直接进行遍历
格式:for(数据类型 变量名:要遍历的集合名){
直接输出变量;
}


1.5 数据存储结构总结

一)Collection接口:存储单列数据:
(1)List:单列有序集合(可以重复):
A、ArrayList:底层结构是数组,底层查询快,增删慢(非线程安全,效率高);
B、LinkedList:底层结构是链表型的,增删快,查询慢(线程不安全,效率高);
C、vector:底层结构是数组,线程安全的,增删慢,查询快(不常用);
(2)Set:单列无序集合(唯一):
A、HashSet:底层结构是哈希表
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可
按照哈希算法来存取集合中的元素,存取速度比较快;
B LinkedHashSet
底层数据结构由链表和哈希表组成。
由链表保证元素有序。
由哈希表保证元素唯一。
C、TreeSet:基于红黑树数据结构,实现元素的“自然排序”;
如何保证元素唯一性呢?
根据比较的返回值是否是0来决定
如何保证元素的排序呢?
两种方式
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象
二)Map接口:存储键、值的双列数据集合:
a Map集合的数据结构仅仅针对键有效,与值无关。
b 存储的是键值对形式的元素,键唯一,值可重复。

A HashMap
底层数据结构是数组和链表。线程不安全,效率高
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可
B、LinkedHashMap:
底层数据结构由链表和哈希表组成。
由链表保证元素有序。
由哈希表保证元素唯一。

C、TreeMap:
底层数据结构是红黑树。(是一种自平衡的二叉树)
如何保证元素唯一性呢?
根据比较的返回值是否是0来决定
如何保证元素的排序呢?
两种方式
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象

D、HashTable:
底层数据结构是哈希表。线程安全,效率低
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可 

这里写图片描述
  

1.6 我们怎么选择集合类型?

是否是键值对象形式:
是:Map
键是否需要排序:
是:TreeMap
否:HashMap
不知道,就使用HashMap。
   否:Collection
元素是否唯一:
是:Set
元素是否需要排序:
是:TreeSet
否:HashSet
不知道,就使用HashSet 
否:List
要安全吗:
是:Vector(其实我们也不用它,后面我们讲解了多线程以后,我在给你回顾用谁)
否:ArrayList或者LinkedList
增删多:LinkedList
查询多:ArrayList
不知道,就使用ArrayList
不知道,就使用ArrayList

1.7 集合的常见方法及遍历方式

Collection常见的方法:add() , remove(), contains() , iterator() size()
遍历方式:增强for ,迭代器,
list集合的遍历:3种-1)for循环 2)迭代器 3)增强for循环
set集合的遍历(元素默认是无序的):2种-1)迭代器 3)增强for循环
map集合的遍历:4种
Map接口没有继承Iterator ,所以不能直接使用迭代器
(1)keySet() //取出所有的键,放入一个Set类型集合
(2)keyvules() //取出所有的值,放入一个Collection集合
(3)entrySet() //取出所有的Entry对象,放入一个Set类型集合
//可以对一组键迭代遍历
//对一组值迭代遍历
//对一组Entry对象迭代遍历
注意:用迭代器遍历时不能删除元素
(4)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值