集合概述:
用于存储多个对象的长度可变且能够动态管理元素的容器。
import java.util.ArrayList;
import java.util.List;
public class Text1 {
public static void main(String[] args) {
//需求1:设置一个长度为3的Object类数组
Object[] arr = new Object[3];
arr[0] = new Object();
arr[1] = new Object();
arr[2] = new Object();
//需求2:添加多个对象
arr[3] = new Object();//数组越界异常,ArrayIndexOutOfBoundsException
//问题1:用于存储多个对象的数组,一旦定义后长度无法修改。
//需求3:将下标为1的对象删除
arr[1] = null; //把下标为1的对象置空,删除
//需求4:添加回一个对象
arr[3] = new Object();//数组越界,ArrayIndexOutOfBoundsException
//解决需要遍历数组,找到null的下标,在此下标的位置添加对象。
//问题2:数组元素不能动态管理
//解决问题1,2----->集合
List list = new ArrayList();
list.add(new Object());
list.add(new Object());
list.add(new Object());
list.remove(1);//删除下标为1的对象
list.add(new Object());//元素动态管理,直接在集合后面添加元素
}
}
总结:
- 集合能解决了数组长度不可变,数组元素不能动态管理的问题。
集合框架:
解析:
- 集合框架以接口作为根,原因是每个集合都有增删改查元素的功能要求,接口的功能就是拓展功能,所以集合框架的根是一个接口。
Collection接口
API介绍
解析:
- Collection接口是集合框架的根接口,该接口实现类中每个元素存储的都是对象(地址),其中的元素是否重复或是否有序无法确定,如果需要确定可以使用其子接口List和Set的实现类。该接口一般作为方法的参数使用,目的是扩大类型选择范围。
常用功能方法:
- 添加方法:
import java.util.ArrayList;
import java.util.Collection;
public class Text2 {
public static void main(String[] args) {
Collection col = new ArrayList();
//boolean add(Object)添加对象到集合,返回boolean值
col.add(1);//1-->装箱-->Integer-->向上类型转换-->Object
col.add(1.5);
col.add(true);
col.add("abc");
col.add('s');
col.add(new Object());
System.out.println(col);//[1, 1.5, true, abc, s, java.lang.Object@21a06946]
}
}
2. 删除方法:
import java.util.ArrayList;
import java.util.Collection;
public class Text2 {
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(1);//1-->装箱-->Integer-->向上类型转换-->Object
col.add(1.5);
col.add(true);
col.add("abc");
col.add('s');
col.add(new Object());
//boolean remove(Object)删除对象,返回boolean值
col.remove('s');
System.out.println(col);//[1, 1.5, true, abc, java.lang.Object@21a06946]
// void clear()清空集合,无返回值
col.clear();
System.out.println(col);//[]
}
}
面试题:col=null,col.clear()的区别
- 答:col=null,将集合空间转换成垃圾空间等待JVM回收。
col.clear(),保留集合空间,清空空间中的元素。
3. 获取方法:
import java.util.ArrayList;
import java.util.Collection;
public class Text2 {
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(1);//1-->装箱-->Integer-->向上类型转换-->Object
col.add(1.5);
col.add(true);
col.add("abc");
col.add('s');
col.add(new Object());
//int .set() 获取集合中元素的个数
int size = col.size();
System.out.println(size);// 6
}
}
4. 判断方法:
import java.util.ArrayList;
import java.util.Collection;
public class Text2 {
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(1);//1-->装箱-->Integer-->向上类型转换-->Object
col.add(1.5);
col.add(true);
col.add("abc");
col.add('s');
col.add(new Object());
//boolean contains(Object) 判断集合元素中是否有该对象,返回Boolean值
boolean b = col.contains("abc");
System.out.println(b);//true
b = col.contains("ab");
System.out.println(b);//false
//boolean isEmpty() 判断集合是否为空(空元素),返回Boolean值
b = col.isEmpty();
System.out.println(b);//false
col.clear();//清空集合
b = col.isEmpty();
System.out.println(b);//true
}
}
5. 带All方法:
import java.util.ArrayList;
import java.util.Collection;
public class Text3 {
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(1);//1-->装箱-->Integer-->向上类型转换-->Object
col.add(1.5);
col.add(true);
col.add("abc");
col.add('s');
//boolean addAll(Collection) 将参数集合添加到原集合中,返回Boolean值
Collection col2 = new ArrayList();
col2.add(100);
col2.add("zxc");
col.addAll(col2);
System.out.println(col);//[1, 1.5, true, abc, s, 100, zxc]
//boolean removeAll(Collection) 删除原集合中与参数集合一致的元素,返回boolean值
col2.add("abc");
System.out.println(col2);//[100, zxc, abc]
System.out.println(col);//[1, 1.5, true, abc, s, 100, zxc]
col.removeAll(col2);
System.out.println(col);//[1, 1.5, true, s]
//boolean containsAll(Collection) 判断原集合是否全包含参数集合所有元素,返回boolean值
Collection col3 = new ArrayList();
col3.add(1);
col3.add(false);
boolean b = col.containsAll(col3);
System.out.println(b);//false,只包含了一半,col集合没有 false
//boolean retainerAll(Collection) 将原集合与参数集合相同元素保留,不同元素删除。
System.out.println(col3);//[1, false]
System.out.println(col);//[1, 1.5, true, s]
col.retainAll(col3);
System.out.println(col);//[1]
}
}
遍历集合:
- 增强的for循环:又称之为 foreach循环。
语法:
for( 元素类型 元素名 : 集合 ){
循环体。
}
元素类型:与集合中每个元素的类型的都要一致。
元素名:标识符。
集合:集合对象名。
import java.util.ArrayList;
import java.util.Collection;
public class Text4 {
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(1);//1-->装箱-->Integer-->向上类型转换-->Object
col.add(1.5);
col.add(true);
col.add("abc");
col.add('s');
for (Object object:col) {
System.out.print(object+" ");//1 1.5 true abc s
object += "123";
}
System.out.println();
System.out.print(col+" ");//[1, 1.5, true, abc, s]
注意:在foreach循环中对元素修改无法实现,原因是foreach中元素是一个复制品,对复制品修改,集合中正品不会受到影响。
}
}
迭代器遍历:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Text4 {
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(1);//1-->装箱-->Integer-->向上类型转换-->Object
col.add(1.5);
col.add(true);
col.add("abc");
col.add('s');
//返回集合中的元素的迭代器遍
Iterator it = col.iterator();
System.out.println(it);//java.util.ArrayList$Itr@75412c2f
}
}
Iterator接口:
API介绍:
解析:
- Iterator接口用于遍历集合元素同时也可以使用Enumeration接口遍历集合对象。迭代器与枚举器的区别有两点:(1)迭代器可以在遍历集合过程中删除集合元素,而枚举器不可以。(2)迭代器的方法名比枚举器的方法名更加简洁。
常用功能方法;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Text5 {
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(1);//1-->装箱-->Integer-->向上类型转换-->Object
col.add(2.3);
col.add(true);
col.add("abc");
col.add('s');
//方法1:迭代器遍历集合---While()方法
Iterator it = col.iterator();
//hasNext():判断下方是否存在元素,如果存在返回true,否则返回false
while(it.hasNext()){
//.next() 往下移动指针后,获取集合中一个元素
System.out.print(it.next()+" ");//1 2.3 true abc s
}
System.out.println();//换行
//方法2:迭代器遍历集合---for()方法【最常用】
for (Iterator it2 = col.iterator();it2.hasNext();){
System.out.print(it2.next()+" ");//1 2.3 true abc s
}
}
}
常见问题:
- Iterator迭代器只能迭代一次集合元素问题
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Text6 {
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(1);//1-->装箱-->Integer-->向上类型转换-->Object
col.add(1.5);
col.add(true);
col.add("abc");
col.add('s');
for (Iterator it = col.iterator();it.hasNext();){
Object obj = it.next();
System.out.print(obj+" ");//1 1.5 true abc s
//.remove() 通过迭代器删除集合元素
if(obj instanceof Double){//遍历哪个对象是Double类型
if (((Double) obj).doubleValue()==1.5){//向下转换后,判断哪个对象是1.5
it2.remove();
}
}
//col.remove(1.5);通过集合删除1.5
}
System.out.println();
System.out.print(col+"");//[1, true, abc, s]
}
}
问题1:直接使用.remove()方法回出现 java.lang.IllegalStateException 参数状态异常,为什么?
- 答:指针在第一个元素上方,所以无法删除元素。所以要与.next()一起使用,才能下移到元素并进行删除。
问题2:在迭代集合的过程中使用集合的删除方法删除元素,出现java.util.ConcurrentModificationException 并发修改异常,为什么?
- 答:如果在迭代过程中使用集合中删除方法,导致迭代器中原有数据与集合数据不吻合,导致异常。 所以只能使用迭代器的删除方法删除集合元素。
List接口:
API介绍;
解析:
- List接口代表有序集合,该接口的实现类能够通过下标插入元素,获取元素,搜索元素。
常用功能方法:
1. 添加方法:
import java.util.ArrayList;
import java.util.List;
public class Text7 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2.3);
list.add(true);
list.add("abc");
list.add('z');
//add(int ,Object)通过下标插入元素
list.add(1,-101);
System.out.println(list);//[1, -101, 2.3, true, abc, z]
//addAll(int , Collection)通过下标插入参数集合
List list2 = new ArrayList();
list2.add("wahaha");
list2.add("ADG");
list.addAll(3,list2);
System.out.println(list);//[1, -101, 2.3, wahaha, ADG, true, abc, z]
}
}
- 删除方法;
import java.util.ArrayList;
import java.util.List;
public class Text7 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2.3);
list.add(true);
list.add("abc");
list.add('z');
System.out.println(list);//[1, 2.3, true, abc, z]
//.remove(int) 根据下标删除集合中对应的对象
//obj = list.remove(4);
//注意点1:如果下标不存在删除时会出现 IndexOutOfBoundsException 下标越界异常
//注意点2:如果下标值与集合中元素对象相同这是使用的remove还是删除下标方法。
list.remove(2);
System.out.println(list);//[1, 2.3, abc, z]
list.add("abc");
System.out.println(list);//[1, 2.3, abc, z, abc]
//注意点3:如果集合中存在多个相同的对象,这时remove该对象,则只会删除其中一个。
list.remove("abc");
System.out.println(list);//[1, 2.3, z, abc]
}
}
3. 获取方法:
import java.util.ArrayList;
import java.util.List;
public class Text7 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2.3);
list.add(true);
list.add("abc");
list.add('z');
//.get(int) 根据下标获取相应的对象
Object obj = list.get(2);
System.out.println(obj);//true
}
}
4 修改方法:
import java.util.ArrayList;
import java.util.List;
public class Text7 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2.3);
list.add(true);
list.add("abc");
list.add('z');
//.set(int , object)根据下标修改相应的对象,返回未修改前的对象
Object obj = list.set(1,3.14);
System.out.println(obj);//2.3
System.out.println(list);//[1, 3.14, true, abc, z]
}
}
遍历集合方法;
- 增强for循环(foreach)遍历
import java.util.ArrayList;
import java.util.List;
public class Text8 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2.3);
list.add(true);
list.add("abc");
list.add('z');
for (Object object:list) {
System.out.println(object);
}
}
}
2. for循环:
import java.util.ArrayList;
import java.util.List;
public class Text8 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2.3);
list.add(true);
list.add("abc");
list.add('z');
//.size()获取集合元素个数
for (int i=0;i<list.size();i++){
Object obj = list.get(i);
System.out.println(obj);
}
}
}
3. 使用Iterator 迭代集合
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Text8 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2.3);
list.add(true);
list.add("abc");
list.add('z');
//使用迭代器
for (Iterator it = list.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}
ListIterator接口:
API介绍:
解析:
- ListIterator接口是一个可以任意方向遍历集合的遍历器,该接口提供修改元素方法,以及向上或向下获取元素方法。
常用功能方法:
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Text9 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2.3);
list.add(true);
list.add("abc");
list.add('z');
//第一次迭代器遍历集合
ListIterator it = list.listIterator();//只创建一个迭代器
for (;it.hasNext();){
//.next() 向下移动指针
System.out.println(it.next());
}
//指针到集合最后一个元素
System.out.println("-------------------");
//第二次从下到上遍历
//.hasPrevious() 判断是否存在上一个元素,返回Boolean值
for (;it.hasPrevious();){
//.previous() 向上移动指针
System.out.println(it.previous());
}
//指针到集合第一个元素上方
//第三次从上到下遍历
System.out.println("-------------------");
for (;it.hasNext();){
//.next() 向下移动指针
System.out.println(it.next());
}
}
}
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Text9 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2.3);
list.add(true);
list.add("abc");
list.add('z');
ListIterator it = list.listIterator();//创建一个迭代器
for (;it.hasNext();){
//.next() 向下移动指针
it.next();
//.set(Object) 在迭代过程中,将集合中元素对象修改成目标对象。
//it.set("wahaha");[wahaha, wahaha, wahaha, wahaha, wahaha]
//.add(Object) 在迭代过程中,添加目标元素
it.add("123");
}
System.out.println(list);//[1, 123, 2.3, 123, true, 123, abc, 123, z, 123]
}
}