集合
面向对象语言对事的体现都是以对象的形式,为了方便对对象的操作,JAVA提供了集合类。
数组与集合的区别:
*长度区别
数组的长度是固定的而集合的长度是可以改变的
*存储元素类型的区别
数组既可以存储基本类型数据还可以存储引用类型数据,而集合只能存储引用类型的数据
*内容区别:
数组只能存储相同数据类型的元素,而集合可以存储不同数据类型的元素
集合有三种重要的类型:
List:一个有序的集合,可以存放重复的数据
Set:一个无序的集合,不允许存放重复的数据
Map:一个无序集合,集合中包括一个键对象,一个值对象,键对象不允许重复,值对象可以重复
Collection集合
因为Collection集合是接口,不允许实例化,所以得用多态的形式实例化。
Collection集合下又有两个子接口:
List(存储元素特点):有序可重复
Set:无序不可重复
Collection集合的功能:
添加功能:
boolean add(Object obj):添加一个元素
boolean addAll(Collection c):添加一个集合的元素 (给一个集合添加进另一个集合中的所有元素)
删除功能
void clear():移除所有元素
boolean remove(Object o):移除一个元素
boolean removeAll(Collection c):移除一个集合的元素(移除一个以上返回的就是true) 删除的元素是两个集合的交集元素,如果没有交集元素 则删除失败 返回false
判断功能
boolean contains(Object o):判断集合中是否包含指定的元素
boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(这个集合 包含 另一个集合中所有的元素才算包含 才返回true)
boolean isEmpty():判断集合是否为空
获取功能
Iterator<E> iterator()
长度功能
int size():元素的个数
交集功能
boolean retainAll(Collection c):获取两个集合的交集元素(交集:两个集合都有的元素)
集合转换为数组
Object[] toArray()
public static void main ( String[ ] args) {
Collection c= new ArrayList ( ) ;
c. add ( "abc" ) ;
Collection c1= new ArrayList ( ) ;
c1. addAll ( c) ;
c1. clear ( ) ;
c. remove ( "abc" ) ;
c. add ( "abc" ) ;
System. out. println ( c. contains ( "abc" ) ) ;
System. out. println ( c. isEmpty ( ) ) ;
Collection c2= new ArrayList ( ) ;
c2. add ( "abc" ) ;
c2. add ( "abcd" ) ;
c2. add ( "abcde" ) ;
c2. retainAll ( c) ;
Iterator it= c2. iterator ( ) ;
while ( it. hasNext ( ) ) {
System. out. println ( it. next ( ) ) ;
}
System. out. println ( c2. removeAll ( c) ) ;
Object[ ] o= c. toArray ( ) ;
for ( int i = 0 ; i < c. size ( ) ; i++ ) {
System. out. println ( o[ i] ) ;
}
}
迭代器的原理
为什么迭代器要定义为接口?
如果迭代器是一个类,在我们想要调用该类的方法时,我们需要创建该类的对象,但是JAVA中有许多集合类的数据结构不同,存储方式和遍历方式不同,所以不能定义迭代器类
List集合
List集合接口下有三个实现类
ArrayList:底层采用的是数组存储元素的,所以ArrayList集合适合查询,不适合随机增删元素
LinkedList:底层采用的是双向链表数据结构存储数据,适合随机增删元素,不适合查询
Vector:底层和ArrayList集合相同,但是在多线程的情况下,但是Vector是线程安全的,效率低
List集合功能
void add(int index,E element): 在指定索引处添加元素
E remove(int index):移除指定索引处的元素 返回的是移除的元素
E get(int index):获取指定索引处的元素
E set(int index,E element):更改指定索引处的元素 返回的而是被替换的元素
public static void main ( String[ ] args) {
List list= new ArrayList ( ) ;
list. add ( "abc" ) ;
list. add ( "zhouyuyang" ) ;
list. add ( 1 , "liao" ) ;
list. add ( 0 , "zhaorunfa" ) ;
list. remove ( 2 ) ;
System. out. println ( list. set ( 1 , "liao" ) ) ;
System. out. println ( list. get ( 0 ) ) ;
System. out. println ( list. size ( ) ) ;
Iterator it= list. iterator ( ) ;
while ( it. hasNext ( ) ) {
System. out. println ( it. next ( ) ) ;
}
}
List集合特有的遍历功能
List集合可以用for循环与size()和get()方法进行遍历
public static void main ( String[ ] args) {
List list= new ArrayList ( ) ;
list. add ( "zhaorunfa" ) ;
list. add ( "llll" ) ;
list. add ( 2312 ) ;
for ( int i = 0 ; i < list. size ( ) ; i++ ) {
System. out. println ( list. get ( i) ) ;
}
}
ListIterator迭代器特有的功能
ListIterator继承Iterator,可以使用Iterator的方法
ListIterator的特有功能
boolean hasPrevious(): 是否存在前一个元素
E previous(): 返回列表中的前一个元素
有了这个方法,就可以进行反向遍历
并发修改异常
若我们使用Iterator迭代器进行迭代的过程中,对集合进行增删操作的话,就会出现并发修改异常。
原因是迭代过程依赖集合,我们往集合添加好元素之后,获取迭代器的时候迭代器已经知道集合的元素个数了,那我们在遍历的过程中通过集合的增删方法操作元素,就会改变集合的元素个数,就会出错。
使用ListIterator迭代器的自有的添加方法就可以解决该问题。
public static void main ( String[ ] args) {
List list= new ArrayList ( ) ;
list. add ( "zhaorunfa" ) ;
list. add ( "aa" ) ;
list. add ( "bb" ) ;
list. add ( 1213 ) ;
list. add ( "aa" ) ;
ListIterator it= list. listIterator ( ) ;
while ( it. hasNext ( ) ) {
Object str= it. next ( ) ;
if ( str. equals ( "aa" ) ) {
it. add ( "bbb" ) ;
}
}
System. out. println ( list) ;
while ( it. hasPrevious ( ) ) {
System. out. println ( it. previous ( ) ) ;
}