Day 17 集合_数组

 

 

 

Java的集合类主要是 Collection 接口 和 Map 接口

Collection:单列集合(存放单个对象)

Day 17 集合_删除元素_02

 

 

Map:双列集合(存放Key-value 键值对)

Day 17 集合_子类_03

 

 

 

Collection接口:

1. Collection的实现子类可以存放多个元素,每个元素可以是Object

2. 有些Collection的实现子类可以存放重复的元素,有些不可以

3. 有些Collection的实现子类是有序的(List),有些是无序的(Set)

 

Collection接口的常用方法:

1. add();    //只要是Object 的子类就可以添加

2. remove();   //可以根据下标删除元素,也可以根据value删除元素

3. contains();    //查找元素是否存在,返回true,false

4. size();

5. isEmpty();

6. clear();  

7. addAll(Collection c);  

8. containsAll(Collection c);

9. removeAll( Collection c);

 

Collection接口的遍历方式  -> 使用Iterator 迭代器

Collection接口 实现了 Iterable接口;    只要是实现了Collection接口的类 都可以使用iterator 方法来遍历

通过iterator() 方法 返回一个Iterator 对象

iterator.hasNext();    //判断是否还有下一个元素

iterator.next();   // 下移,并返回元素

 

步骤:

1. 获取迭代器

Iterator iterator = collection.iterator();

while( iterator.hasNext()){

  Object obj = iterator.next(); 

}

退出while循环,指针指向最后一个元素,如果再次使用next方法就会抛出异常

Object obj = iterator.next();   //此时会抛出NoSuchElementException 异常

如果想要再次遍历,需要重置迭代器

iterator = collection.iterator();

 增强for循环 (只能用于遍历 集合 和 数组)

for ( 元素类型  元素名 :  集合名或数组名 ){

  对元素操作;

}

增强for循环的底层还是Iterator迭代器

 

 

 

List 常用方法: 实现List接口的类包括:XxxxList,Stack,Vector

实现List接口的集合中元素有序(添加和取出的顺序是一致的),可以重复

实现List接口的集合 支持 索引,底层是数组

list.add(index, value);   //在index位置插入value,没有返回值

list.add(index, Collection col);   //在index位置插入col的所有元素,返回boolean

list.get(index);  //返回index位置的值

list.indexOf(Object obj);  // 返回obj在list中第一次出现的下标

list.lastIndexOf( Object obj);

list.remove(index); //移除index位置的元素,并返回该元素值

list.set( index, value);  //设置index位置的元素为value,相当于替换

list.sublist( fromIndex, endIndex);   //返回 [fromIndex, endIndex) 之间的子list;  左闭右开

 

 

 

ArrayList 可以放入null, 并且可以多个

ArrayList是由数组来实现存储的

ArrayList基本等同于Vector, 但ArrayList是线程不安全的!

 

 ArrayList源码分析:

1. ArrayList底层维护了一个Object类型的数组elementData[] 

2. 当创建ArrayList 对象时,如果使用的是无参构造器,则初始的elementDate 容量为0, 第一次添加数据时,则将容量扩大到10,如果需要再次扩容,则扩容为当前容量的1.5倍。

3. 如果使用的是指定大小的构造器( ArrayList(int) ),则初始化elementData的容量为指定大小,如果需要扩容,则直接扩容为elementData容量的1.5倍

 

 

Vector:

1. vector 底层也是一个对象数组, Object[] elementData;

2. vector 是线程安全的

3. 扩容机制: 使用无参构造器,默认初始化容量为10,满后,按2倍扩容;  使用有参构造器,满后,直接按2倍扩容

 

 

LinkedList:

1. 底层实现了 双向链表 和 双端队列的特点

2. 可以添加任意元素(可以重复),包括null

3. 线程不安全

4. LinkedList 底层维护了一个双向链表

 LinkedList 底层维护了两个属性,first 指向 首节点, last 指向 尾节点

   每个节点(Node对象),里面维护了prev,next,item属性, prev指向前一个节点,next指向下一个节点

   所以 LinkedList 添加和删除元素不是通过数组完成的,相对来说效率高。

 

 

ArrayList 和 LinkedList的区别:

Day 17 集合_删除元素_04

 

1)如果改和差的操作多,选ArrayList(注意是线程不安全的)

2)如果增删的操作多,选LinkList