集合概述
- 集合是Java中提供的一种容器,可以用来存储多个数据
- 集合和数组既然都是容器,它们有什么区别呢?
- 数组的长度是固定的,集合的长度可变的。
- 数组中存储的是同一个类型的元素,可以存储基本数据类型值。集合存储的都是对象,而且对象的类型可以不一致,在开发中一般当对象多的时候,使用集合进行存储。
集合框架
接口 | 类 | ||
Collection (顶层-->底层) |
List (有序集合) |
ArrayList | |
LinkedList | |||
Vector | |||
Set (无序集合、 不可存放重复数) |
HashSet | LinkedHashSet | |
TreeSet |
迭代器的使用:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
* java.util.Iterator接口:迭代器(对集合进行遍历)
* 有两个常用的方法
* boolean hasNext() 如果有元素可以迭代,则返回true
* 判断集合没有下一个元素时,就返回false
* E next() 返回迭代的下一个元素
* 取出集合中的下一个元素
* Iterator迭代器是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象,
* 获取实现类的方式比较特殊。
* Collection接口中有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象
* 迭代器的使用步骤:
* 1.使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)
* 2.使用Iterator接口中的方法hasNext判断还有没有下一个元素
* 3.使用Iterator接口中的方法next取出集合中的下一个元素
*
* */
public class demo03Iterator {
public static void main(String[] args) {
//创建一个集合对象
Collection<String> coll = new ArrayList<>();
//往集合中添加元素
coll.add("姚明");
coll.add("科比");
coll.add("麦迪");
coll.add("詹姆斯");
coll.add("艾弗森");
/*
* 注意:Iterator<E> 接口也是有泛型的,迭代器的泛型跟着集合走,
* 集合是什么泛型,迭代器就是是泛型
* */
Iterator<String> it = coll.iterator();
//使用hasNext判断是否还有下一个元素
boolean b = it.hasNext();
System.out.println(b);
//使用next取出集合中的下一个元素
String s = it.next();
System.out.println(s);
//未知循环使用while 已知循环使用for
while (it.hasNext()){
s = it.next();
System.out.println(s);
}
}
}
package cn.itcast.demo04;
import java.util.ArrayList;
import java.util.Iterator;
public class generic {
public static void main(String[] args) {
show02();
}
/*
* 创建集合对象,不使用泛型
* 好处:默认的类型就是object,可以存储任意类型的数据
* 弊端:不安全,会引发异常
* */
private static void show01() {
ArrayList list = new ArrayList<>();
list.add("abc");
list.add(1);
//使用迭代获取 第一步要先获取迭代器
Iterator it = list.iterator();
while (it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
/*
* 想要使用String类型特有的方法,length获取字符串长度,
* 不能使用 多态 Object obj = “abc” 需要向下转型
* 此时会出现类型转换异常,不能把Integer 转成 String
* */
String s = (String) obj;
System.out.println(s.length());
}
}
/*
* 创建结汇对象,使用泛型
* 好处:
* 1.避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
* 2.把运行期异常(代码运行之后会抛出的异常,提升到了编译期),写代码的时候会报错
* 弊端:
* 泛型是什么类型,只能存储什么类型
* */
private static void show02(){
ArrayList<String> list = new ArrayList<>();
list.add("abc");
//使用迭代获取 第一步要先获取迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()){
String s = it.next();
System.out.println(s.length());
}
}
}
通配符的使用:
import java.util.ArrayList;
import java.util.Iterator;
/*
* 泛型的通配符:
* ? 代表任意的数据类型
* 使用方式:
* 不能创建对象使用
* 只能作为方法的参数使用
* */
public class generic02 {
public static void main(String[] args) {
ArrayList<Integer> list01 = new ArrayList<>();
list01.add(1);
list01.add(2);
// System.out.println(list01);
ArrayList<String> list02 = new ArrayList<>();
list02.add("a");
list02.add("b");
printArray(list01);
printArray(list02);
}
/*
* 定义一个方法,能遍历所有类型的ArrayList集合
* 这时候我们不知道ArrayList集合使用什么数据类型,可以使用泛型通配符
* */
public static void printArray(ArrayList<?> list){
Iterator<?> it = list.iterator();
while (it.hasNext()){
//it.next()方法,取出的元素时Object
//因为只有Object才可以接收所有的类型
Object o = it.next();
System.out.println(o);
}
}
}