黑马程序员——集合-Cllection

来源:互联网 发布:mac os x cdr镜像下载 编辑:程序博客网 时间:2024/06/10 04:59

1.集合是什么?

跟数组差不多。集合就是用来存储对象的容器。 

2.数组和集合两者有什么区别吗?

数组的长度是固定的, 集合的长度是可变的
数组可以存储对象,也可以存储基本数据类型。 集合只存对象,不存储基本数据类型,集合存储的都是引用类型

3. 学习集合框架,到底需要学的是什么?
如何把对象存储到集合这个容器中。
如何把对象中集合容器中获取出来。
集合中每一个类的自身特点。

4 集合是一个继承体系,学习的是这个体系中的最顶层,建立最底层类的对象

集合有一个顶层的接口 java.util.Collection,定义了这个体系的最共性的内容

   集合派系的顶层接口Collection:   public interface Collection<E>   <E>泛型

5 Collection接口中的方法:
 Collection集合存储对象,存储对象的方法
add(E e) 将元素存储到集合的方法  add(Object e)参数,任何对象都可以传递的
addAll(Collection c)将一个集合添加到另一个集合中
 
 Collection集合中,移除对象的方法
boolean remove(Object o)传递一个对象,移除这个对象,移除成功返回true
boolean removeAll(Collection c)移除,两个集合的共性元素

 Collection集合中的其他方法
void clear()移除集合中的所有元素
int size()返回集合中存储的元素的个数
boolean contains(Object o)判断参数,在不在集合中,如果在返回true
boolean containsAll(Collection c)判断一个集合是否包含另一个集合,包含返回true
boolean retainAll(Collection c)获取两个集合的交集

6. 迭代器
什么是迭代器:取出集合中存储的对象的方式,接口Collection中,定义了一个方法,是集合中所有的子类都具备的, Iterator iterator(),返回一个Iterator类型的对象
由于每个集合存储对象的方式不同,取出方法也不同
iterator方法返回的是一个接口的类型,接口本身不能创建对象的,返回的肯定是接口的实现类对象,迭代器的原理,其实就是每个集合中的内部类的事情,集合中的内部类,实现了Iterator接口,使用iterator方法,获取的就是内部类的对象
Iterator接口中的三个方法
boolean hasNext() 判断集合中还没有没有下一个被取出的元素,有返回true
Object next() 获取集合中的元素 ,看成是arr[i]
void remove() 移除遍历到的集合中的元素
实现迭代器取出集合对象的三个步骤
通过集合对象的iterator方法,获取迭代器对象,返回的是一个接口的实现类
使用迭代器对象的hasNext()方法,判断集合中还有没有对象可以被取出
使用迭代器对象的next()方法直接获取存储到集合中的对象
    迭代器是获取存储到集合的对象的通用方式
    注意,如果迭代器已经获取完了,再次获取,出现没有元素被取出异常
    注意,迭代过程中,出现了并发修改异常ConcurrentModificationException。出现异常的原因:使用集合的方法修改了集合的长度,而迭代器不知道,因此出现并发修改异常。在迭代的过程中,不要使用集合的方法,改变集合长度
    一次迭代中,不能出现多次next方法,否则可能出现异常,出现数据错乱

7. List 接口派系
List接口派系的特点:
有序的:存储的时候,和取出的时候顺序一致
List派系是一个有索引的,具有下标
允许存储重复元素
   List接口中的特有方法
add(int index, Object obj)在指定的索引上,插入元素
Object get(int index)指定下标,获取这个下标上的元素
Object remove(int index)指定下标,移除这个下标上的元素,返回删除之前的
Object set(int index ,Object obj)执行下标,修改这个下标上的元素,返回修改之前的
lLst subList(int start,int end)获取集合中的一部分,包含头,不包含尾

8. List接口派系的特有迭代器ListIterator
List接口中定义了一个方法  listIterator,所有的子类都具备的,返回一个接口的实现类的对象,接口是就ListIterator,List的特有迭代器
使用List特有迭代器,可以实现在迭代的过程中,对集合中的元素,进行添加,修改,和删除。
ListIterator接口方法
add(Object obj)使用迭代器,遍历集合的过程中,添加
set( Object obj)使用迭代器,遍历集合的过程中,修改
boolean hasPrevious()  看成是hasNext()
Object previous() 看成是next()

9. ArrayList类
属于List派系中的一个子类,具备List派系的所有特点:
有序,下标,重复
ArrayList自己的特点:
ArrayList底层实现的数据结构是数组结构
ArrayList实现是不同步,线程不安全,但是运行效率高
ArrayList底层是一个可变数组,导致了,这个集合查询快,增删慢
ArrayList 数组大小默认10个位置,每次增长50%

10. 去掉ArrayList中的重复元素
List本身,允许重复的,必须完成去掉重复的工作,但是List没有这个功能,我们自己写出来这样的功能.集合中存储自定义的对象,并去掉重复.
Person对象,如果姓名和年龄,同样,看做是同一对象。contains方法原理,凭什么判断对象是否包含在集合中。contains方法的实现原理,在于对象中的equals方法,自动调用对象中的equals方法,来进行判断
11. Vector类
  集合框架在JDK1.2版本后出现的,Vector类出现在JDK1.0版本。没有集合框架以前,存储对象只能依赖Vector。
  Vector底层数据结构也是可变数组实现,线程是安全的,运行效率慢,每次数组扩容100%。从JDK1.2版本开始,此类被ArrayList取代。Vector死了,郁郁而终了.


12. LinkedList类
LinkedList底层数据结构链表实现,记录对象地址的方式存储
查询慢,增删快,线程也是不安全的,执行效率高
LinkedList类的特有方法
addFirst(Object obj)将元素添加到链表开头
addLast(Object obj)将元素添加到链表结尾
Object getFirst()获取链表的开头
Object getLast()获取链表的结尾
Object removeFirst()移除链表的开头,返回被移除前的对象
Object removeLast()移除链表的结尾, 返回被移除前的对象


13.JDK1.6开始,有n个新的方法,把以前的方法取代
offerFirst()-->addFist() 返回值不同add开头的没有返回值,offer开头返回boolean
offerLast()-->addLast()
peekFirst()-->getFirst()get开头没有元素,出异常,peek开头没有元素返回null,没异常
peekLast()-->getLast()
pollFirst()-->removeFirst()
pollLast()-->removeLast()




14. HashSet类
HashSet类的特点
底层数据结构哈希表
HashSet本身没有功能,功能来自于HashMap
HashSet调用的是HashMap的功能
无序的
允许存储null
线程不安全,不同步,执行效率高
  将姓名和年龄的人,视作同一个对象,不要存储了


15. 哈希值
每一个对象,在建立的时候存储在内存堆中,JVM对每一个对象,根据底层的一个算法,哈希算法,计算出来一个十进制数,十进制就是哈希值。程序人员开发时候的一个参考,仅此而已
Object类,定义了一个方法  public int hashCode()计算对象的哈希值的,所有的子类都有这个哈希值.出现是为了哈希表而来的,本身,没有地址意义
HashSet,存储的其实是对象的哈希值
HashSet集合的存储过程,存储对象的时候,先调用对象的hashCode方法,获取该对象的哈希值(十进制数),HashSet看看这个数以前存储过没有,如果没有存储过,就将这个哈希值存储到自己的哈希表中
实现去掉重复的元素,让姓名和年龄相同的对象,具有相同的哈希值。
覆盖hashCode方法
存储到HashSet中的对象,保证对象的唯一性,必须重写hashCode和equals方法
16. hashCode和equals的问题
  如果两个对象具有相同的哈希值,两个对象进行equals比较,一定返回true吗 No
  如果两个对象进行equals比较,返回真,两个对象具有相同的哈希值吗,必须相同
17. LinkedHashSet类
特点:有序的,基于哈希表的链表,线程不安全的,执行效率高

0 0
原创粉丝点击