文章目录
Collection集合
Collection概述
- 位于软件包java.util包下,所以使用的时候需要导包
- interface Collection < E >,其< E >是泛型,表示集合中元素的类型
- public interface Collection< E > extends Iterable< E > 表示Collection是一个接口,并且继承自Iterable接口
- Collection是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
- Collection用于存储一些列符合某种规则的元素;
- Collection是集合层次结构中的根接口;集合表示一组被称为其元素的对象;
- 一些集合允许重复元素(List),而其他集合不允许(Set);
- JDK不提供Collection接口的任何直接实现类,它提供了更具体的子接口的实现,如Set和List子接口的实现类,创建对象必须使用子接口Set和List的实现类创建
- 创建Collection集合的对象:①多态的形式②具体的实现类ArrayList
案例:
package itheima28;
public class CollectionDemo {
public static void main(String[] args) {
//创建Collection对象
Collection<String> c = new ArrayList<String>();
//添加元素:boolean add(E e)
c.add("hello");
c.add("java");
//输出collection对象
System.out.println(c);
//这里正常来讲输出的是一串带有包名的字符串,如果要是输出不是此内容,则说明toString方法被重写了。
//输出结果是 [hello, java]
// 说明toString被重写了
}
}
Collection集合常用方法
方法名 | 说明 |
---|---|
boolean add(E e) | 添加元素 |
boolean remove(Object o) | 从集合中移除指定的元素 |
boolean contains (Object o) | 判断集合中是否存在指定的元素 |
boolean isEmpty() | 判断集合是否为空 |
void clear() | 清空集合中的元素 |
int size() | 集合的长度,也就是集合中元素的个数 |
Iterator< E > iterator() | 返回此集合中元素的迭代器 |
理解总结xhj:
- Alt + 7 打开一个窗口,能够看到类的所有信息,其中7是数字不是f7按键。
- Collection接口中的方法,除了size和clear其余的返回值都是boolean,且参数都是具体的集合元素。
add
//创建Collection集合对象
Collection<String> c = new ArrayList<String>();
//boolean add(E e)方法
System.out.println(c.add("hello"));//返回值是true
System.out.println(c.add("java"));//返回值是true
System.out.println(c.add("java"));
System.out.println(c);//输出[hello] [hello, java, java]
* ArrayList对象可以添加重复元素
* ArrayList对象.add的结果都是true吗?
选中 ArrayList方法,alt + enter按键跟随到ArrayList文件中,找到add方法。
快捷方式是:在Idea工具栏上选择View==》Tool Windows==》Structure 即可。
/* 根据ArrayList中关于方法add的描述来看,只要调用add返回值就是true
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}*/
ArrayList对象.add 的结果都是true
remove
//boolean remove(E e)
System.out.println(c.remove("java"));
* 删除的元素存在于集合中,则会被删除,且对象.remove返回值是true
System.out.println(c.remove("javaee"));
* 删除的元素不存在与集合中,则不会删除,且对象.remove返回值是false
System.out.println(c);
clear
c.clear();//清空集合中的所有元素
System.out.println(c);//输出结果是[]
contains
//boolean contains(E e)
System.out.println(c.contains("java"));//true
* 要判断的元素在集合中,返回true;不在集合中,返回false
System.out.println(c.contains("javaee"));//false
size
System.out.println(c.size());//2
//输出结果是2,原本是[hello, java, java];删除了一个java,再输出长度就是2了
代码:
package itheima28;
public class CollectionDemo {
public static void main(String[] args){
//创建Collection集合对象
Collection<String> c = new ArrayList<String>();
//boolean add(E e)方法
System.out.println(c.add("hello"));//返回值是true
System.out.println(c.add("java"));//返回值是true
System.out.println(c.add("java"));
System.out.println(c);//输出[hello] [hello, java]
//可以添加重复元素,
// ArrayList对象.add的结果都是true吗?
// 选中 ArrayList方法,alt + enter按键跟随到ArrayList文件中,找到add方法。快捷方式是:在Idea工具栏上选择View==》Tool Windows==》Structure 即可。
/* 根据ArrayList中关于方法add的描述来看,只要调用add返回值就是true
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}*/
//boolean remove(E e)
System.out.println(c.remove("java"));
//删除的元素存在于集合中,则会被删除,且对象.remove返回值是true
System.out.println(c.remove("javaee"));
// 删除的元素不存在与集合中,则不会删除,且对象.remove返回值是false
System.out.println(c);
// void clear()
// c.clear();//清空集合中的所有元素 返回值是[]
// System.out.println(c);
//boolean contains(E e)
System.out.println(c.contains("java"));//true
//要判断的元素在集合中,返回true;不在集合中,返回false
System.out.println(c.contains("javaee"));//false
//int size()
System.out.println(c.size());//2
//输出结果是2,原本是[hello, java, java];删除了一个java,再输出长度就是2了
}
}
Collection集合的遍历之iterator
概述
- iterator:迭代器,集合的专用遍历方式。
- Collection的方法iterator()——作用就是返回此集合中元素的迭代器,返回值就是Iterator< E >。也就是说集合中元素的迭代器是用Collection对象.iterator()返回的
- 迭代器是通过集合的iterator()方法得到的,所以说它是依赖于集合而存在的
- Interface Iterator< E > 是一个接口;软件包是java.util,表示使用该接口需要导包;这里的泛型< E >和集中的泛型是一致的;
Iterator中的常用方法
方法名 | 说明 |
---|---|
E next() | 返回迭代中的下一个元素 |
boolean hasNext() | 如果迭代具有更多元素,则返回true |
创建Collection实现类ArrayList的对象
//创建Collection集合
采用多态的形式 : 父类名 变量名 = new 子类名();或者 接口名 变量名 = new 实现类名(); 此次采用后者形式
Collection<String> c = new ArrayList<String>();
// 集合添加元素
c.add("hello");
c.add("java");
c.add("javaee");
System.out.println(c);//[hello, java, javaee]
迭代器的获取,通过iterator方法
集合对象.Iterator() 迭代器 返回值是Iterator<E>
Iterator<String> it = c.iterator();
已知Iterator是一个接口,也就是说c.iterator返回的是Iterator实现类Itr()的对象
c.iterator返回值内容介绍如下:
①选中iterator跟进,进入Collection接口里面,
我们要找的是具体的实现类中的方法iterator,所以需要找到ArrayList实现类。
②选中ArrayList跟进,找到iterator方法,
public Iterator<E> iterator() {
return new Itr();
}
方法名称是iterator,返回的是new Itr()对象,返回值是Iterator< E >一个接口,
说明返回的是Iterator的一个实现类对象。说明Itr()应该实现了Iterator这个接口
private class Itr implements Iterator<E> {
....
}
内部类,一个类中定义了一个类。一般采用private修饰。
E next()方法,返回迭代器中的元素
System.out.println(it.next());//hello
System.out.println(it.next());//java
System.out.println(it.next());//javaee
System.out.println(it.next());//NoSuchElementException 抛出一个异常,意思是:表示该请求的元素不存在
boolean hasNext()方法
为了解决迭代器.next存在问题,使用hasNext进行判断
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
案例:
package itheima29;
public class IteratorDemo {
public static void main(String[] args) {
//创建Collection集合
// 采用多态的形式 : 父类名 变量名 = new 子类名();或者 接口名 变量名 = new 实现类名(); 此次采用后者形式
Collection<String> c = new ArrayList<String>();
// 集合添加元素
c.add("hello");
c.add("java");
c.add("javaee");
System.out.println(c);//[hello, java, javaee]
// 集合对象.Iterator() 迭代器 返回值是Iterator<E>
Iterator<String> it = c.iterator();
//已知Iterator是一个接口,也就是说c.iterator返回的是Iterator实现类Itr()的对象
// c.iterator返回值内容介绍如下:
/*
①选中iterator跟进,进入Collection接口里面,我们要找的是具体的实现类中的方法iterator,所以需要找到ArrayList实现类。
②选中ArrayList跟进,找到iterator方法,
public Iterator<E> iterator() {
return new Itr();
}
方法名称是iterator,返回的是new Itr();对象,返回值是Iterator< E >一个接口,说明返回的是Iterator的一个实现类对象。说明Itr()应该实现了Iterator这个接口
private class Itr implements Iterator<E> {
....
}
内部类,一个类中定义了一个类。一般采用private修饰。
*/
// E next()方法
/*System.out.println(it.next());//hello
System.out.println(it.next());//java
System.out.println(it.next());//javaee
System.out.println(it.next());//NoSuchElementException 抛出一个异常,意思是:表示该请求的元素不存在*/
//boolean hasNext()方法
//为了解决迭代器.next存在问题,使用hasNext进行判断
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
}
集合使用步骤图解
集合使用步骤:
①创建集合对象
Collection<String> c = new ArrayList<String>()
采用多态的形式 接口名 变量名 = new 接口实现类名()
②添加对象
1 创建元素
String s = “xxxxx”;
2 添加元素到集合
集合变量.add(元素);
③遍历元素
1 通过集合对象获取迭代器对象
Collection< E > 迭代器对象 = 集合对象.iterator();
2 通过迭代器对象的hasNext()方法判断是否有元素
迭代器对象.hasNext() 返回值是boolean true表示有元素;false表示没有元素
3 通过迭代器对象的next()方法获取下一个元素
迭代器对象.next()
案例:Collection集合存储学生对象并遍历
需求:创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
思路:定义学生类、创建Collection集合对象、创建学生对象、把学生添加到集合、通过迭代器遍历集合元素
package itheima29.test1;
public class CollectionDemo2 {
public static void main(String[] args) {
//2 创建集合对象
Collection<Student> c = new ArrayList<Student>();
// 3 创建学生对象
Student s = new Student("张三",25);
Student s2 = new Student("李四",24);
Student s3 = new Student("王五",23);
//4 将元素添加到集合中
c.add(s);
c.add(s2);
c.add(s3);
//5 通过迭代器遍历集合元素
Iterator<Student> it = c.iterator();
while(it.hasNext()){
Student st = it.next();
System.out.println(st.getName() + ", " + st.getAge());
}
}
}
集合嵌套
常见的嵌套形式:
list嵌套list、list嵌套map、map嵌套map、map嵌套list。
任何集合内部都可以存储其他任何集合。
错误1
incompatible types: ArrayList<ArrayList< Integer>> cannot be converted to List<List< Integer>>
代码错误分析
操作:
List<List<Integer>> = new ArrayList<ArrayList<Integer>>();
报错:
incompatible types: ArrayList<ArrayList<Integer>> cannot be converted to List<List<Integer>>
解决:
List<List<Integer>> = new ArrayList<List<Integer>>();
将第二个ArrayList改为List就可以了。
原因:
这是一个泛型应用的常踩坑。