java基础第十四天 集合Collection

来源:互联网 发布:用c语言写求整数绝对值 编辑:程序博客网 时间:2024/05/18 13:44

1、集合Collection

1.什么是集合

集合就是一个容器,我们之前的学的容器有:数组,StringBuffer。

2.集合和数组的区别:

a、长度区别    集合长度可变    数组长度固定b、内容区别    集合可以存储不同引用类型的数据    数组只能存储相同类型的数据,但是他可以存储基本类型的数据

3、集合的体系结构

集合有两大体系:Collection                      存储单列数据    List                        有序,可重复        ArrayList               底层实现是数组,插入慢,访问快,默认使用        LinkedList              底层实现是链表,插入快,访问慢        Vector                  底层实现是数组,插入慢,访问快,但是是线程安全的,已不建议使用    Set                         无序,不能重复        HashSet                 底层是有哈希表实现,可存储null            LinkedHashSet       底层是由哈希表和链表实现,插入快,访问慢        TreeSet                 自动排序Map                             存储两列数据(Key value),键值对    HashMap    linkedHashMap    TreeMap    HashTable

4、常用方法

4.1增加方法:boolean add(E e)          确保此 collection 包含指定的元素(可选操作)。 boolean addAll(Collection<? extends E> c)          将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 4.2转数组方法:Object[] toArray()         返回包含此 collection 中所有元素的数组。 4.3删除方法:boolean remove(Object o)         从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 boolean removeAll(Collection<?> c)         移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。4.4判断方法:boolean contains(Object o)        如果此 collection 包含指定的元素,则返回 true。 boolean containsAll(Collection<?> c)        如果此 collection 包含指定 collection 中的所有元素,则返回 true。 boolean isEmpty()        如果此 collection 不包含元素,则返回 true。 4.5获取集合长度的方法: int size()         返回此 collection 中的元素数。 4.6集合遍历: 1、使用Collection标准的迭代器方法:        Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器。         //使用迭代器遍历Collection接口        Iterator itr = c1.iterator();        //判断迭代器是否有下一个元素,有就处理没有就退出循环        while(itr.hasNext()){            Student s = (Student)itr.next();            System.out.println(s);        } 2、foreach              //通过foreach循环遍历集合        //什么是foreach?也叫增强for循环,是java1.5之后的特性        for (Object obj : c1) {            //向下转型,可以使用子类的特有的方法            Student student = (Student)obj;            System.out.println(student);        } 4.7交集功能: boolean retainAll(Collection<?> c)         仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 

2、List接口

List是Collection接口的子接口

特点:

1、元素有序、且可重复2、每个元素都有自己的索引,我们可以根据这个索引来访问其对应的元素

常用实现类:

1、ArrayList2、LinkedList3、Vector

常用方法(自己扩展的方法):

 void add(int index, Object ele)  //在指定位置添加元素 boolean addAll(int index, Collection eles) //可以将另外一个集合添加到指定位置 Object get(int index) //根据索引获取集合中的元素 int indexOf(Object obj)  //判断一个对象首次一次出现的位置 int lastIndexOf(Object obj) //判断一个对象最后一次出现的位置 Object remove(int index) //根据索引移除对象 Object set(int index, Object ele) List subList(int fromIndex, int toIndex)

List接口遍历

1、迭代器    Iterate itr = list.iterator);    while(itr.hasNext()){...}2、foreach    for(Object object:list){...}3、for和Iterator    for (Iterator iterator = list.iterator(); iterator.hasNext();) {...}4、普通for循环    for (int i = 0; i < list.size(); i++) {...}

1.ArrayList

List的三大子类:

    1、ArrayList:        底层数据结构是数组,访问快,插入慢    2、LinkedList        底层数据结构是链表,插入快,访问慢    3、Vector        底层是数组,访问快,插入慢,但是他是线程安全的,性能不如ArrayList

该怎么使用呢?

    1、如果你的数据修改很少,访问很多        选ArrayList    2、如果你的数据经常变更,很少访问        选LinkedList    3、Vector不建议使用    4、如果我根本不清楚据访问多还是存储多        那么就选ArrayList

泛型编写数字:

    1、泛型卸载<>之间    2、跟在类的后面

2.LinkedList

List实现类之:LinkedList:

对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高

新增方法:

void addFirst(Object obj) //将指定元素插入此列表的开头。void addLast(Object obj)     //将指定元素插入此列表的开头。Object getFirst() //返回此列表的第一个元素。Object getLast() //返回此列表的第一个元素。Object removeFirst() //移除并返回此列表的第一个元素。Object removeLast() //移除并返回此列表的第一个元素。

案例:

  • 要求你是用LinkedList模拟实现栈(Stack)的数据结构
  • 栈的数据结构忒点:
  • 数据先进后出

    • 思路:
  • 1、编写自定义Stack类
  • 2、提供一个add方法,能够添加数据
  • 3、提供一个get数据,能过获取数据

3.Vector

List实现类之:Vector

线程安全,并发访问就慢

void addElement(Object obj)void insertElementAt(Object obj,int index)void setElementAt(Object obj,int index)void removeElement(Object obj)void removeAllElements()

3、Set接口

Collection子接口之:Set

特点:

无序,且不能有重复的元素

子类:

HashSet: 底层数据结构是哈希表LinkedHashSet:底层数据结构是链表+哈希表 TreeSet:底层数据结构是红黑树,自动排序

3.1 HashSet

HashSet特点:

1、无序(存进去和取出来的顺序不一样)2、HashSet 不是线程安全的3、集合元素可以是 null

怎么保证数据的唯一性:
1、先判断hashcode
2、在判断equals

如果需要存储自定义的对象,那么我们最好重写hashcode()和equals()方法
怎么重写呢?很简单:
eclipse:shift+alt+s来生成

3.2 LInkedHashSet

set实现类之二:LinkedHashSet

LinkedHashSet是HashSet的子类

数据结构:

    链表+哈希表

特点:

    有序(由链表保证)    数据不能重复