一.回顾一下以前讲的数组
自定义类型数组,数组中存储引用类型的内存图
二.集合框架
(一)第一部分
集合的由来
数组长度是回定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少
数组和集合的区别
区别1:
数组既可以存储基本数据类型,又可以存储引用数据类型
集合只能存储引用数据类型(对象),存储基本数据类型会自动装箱变成对象
区别2
数组长度是固定的,不能自动增长
集合的长度的是可变的,可以根据元素的增加而增长
数组和集合什么时候用
1,如果元素个数是确定的推荐用数组
2,如果元素个数不是固定的推荐用集合
集合继承体系图(暂时只说一下单列集合)
(二)第二部分
(1)Collection集合的基本功能
它是一个接口,不能直接实例化对象;属于util包下的,使用需要导包,这里暂时不讲泛型,后面介绍,这里暂时都把泛型理解成Object类就好了
主要学习的方法有:
boolean add(E e)---向集合中添加元素---add方法如果是List集合一直都返回true,因为List集合中是可以存储重复元素的;如果是Set集合,当存储重复元素是,返回false
boolean remove(Object o)---从集合中删除指定元素
void clear ()---清空集合
boolean contains(object o)---判断集合中是否包含指定元素
boolean isEmpty()---判断集合是否为空
int size()---获取集合中元素的个数
Object [] toArray()---将集合转换成Object类型的数组
带All的方法:
boolean addAll(Collection c)---将集合中的每一个元素添加到调用该方法的集合对象中
boolean removeAll(Collection c)---删除的是交集
boolean containsAll(Collection c)---判断调用的集合是否包含传入的集合
boolean retainAll(Collection c)---取交集,如果调用的集合改变就返回true;如果不变就返回false
迭代器
概述:集合是用来存储元素的,存储的元素需要查看,那么就需要迭代(遍历)
迭代其实我们可以简单地理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类,它是一个很典型的设计模式。
在 Java 中 Iterator 为一个接口,它只提供了迭代了基本规则,在 JDK 中他是这样定义的:对 collection 进行迭代的迭代器。
其接口定义如下:
public interface Iterator {
boolean hasNext();
Object next();
void remove();
}
Object next():返回迭代器刚越过的元素的引用,返回值是 Object,需要强制转换成自己需要的类型
boolean hasNext():判断容器内是否还有可供访问的元素
void remove():删除迭代器刚越过的元素
对于我们而言,我们只一般只需使用 next()、hasNext() 两个方法即可完成迭代。
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
for(Iterator it = liat.iterator(); it.hasNext(); ) {
Object o = it.next();
//do something
}
(2)List集合---Collection的子接口
特有的功能:
void add (int index,E element)---在指定索引处添加元素,index<=size并且index>=0都不会报异常
E remove(int index)---通过索引删除,将被删除的元素返回,并且次方法删除不会自动装箱
E get(int index)---通过索引取获取元素
E set(int index,E element)---将指定位置的元素修改
(3)vector的特有功能(被边缘化的东东,很少用)
Vector类特有功能
public void addElement(E obj)---添加元素
public E elementAt(int index)
public Enumeration elements()--获取枚举
案例演示
Vector的送代
Vector v= new Vector(); //创建集合对象,L⊥st的子类
v.addElement ("a");
v.addElement("b");
v.addElement ("c");
v.addElement("d");
/ /Vector迭代
Enumeration en=V.elements(); //获取枚举
while(en. hasMoreElements()){ //判断集合中是否有元素
system.out. println(en. nextElement()); //获取集合中的元素
}
(4)List的三个子类的特点
Arraylist:
底层数据结构是数组,查询快,增删慢线程不安全,效率高
Vector
底层数据结构是数组,查询快,增删慢线程安全,效率低
Vector相对ArrayList 查询慢(线程安全的)Vector相对Linkedlist 增删慢(数组结构)
LinkedList:
底层数据结构是链表,查询慢,增删快线程不安全,效率高
Vector和 ArrayList的区别
Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高
共同点:都是数组实现的
ArrayList和LinkedList的区别
ArrayList底层是数组结果,查询和修改快LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
List有三个儿子,我们到底使用谁呢?
查询多用 ArrayList
增删多用 Linkedlist
如果都多 ArrayList