集合类体系结构
- Collection单列集合,每个元素(数据)只包含一个值
- Map双列集合,每个元素包含两个值(键值对)
Collection集合体系
List系列集合:添加的元素式有序,可重复,有索引。
- ArrayList、LinekdList:有序、可重复、有索引。
Set系列集合:添加的元素式无序,不重复,无索引。
- HashSet:无序、不重复、无索引;LinkedHashSet:有序、不重复、无索引。
- TreeSet:按照大小默认升序排序、不重复、无索引。
代码演示如下:
public class CollectionDemo1 { public static void main(String[] args) { //有序 可重复 有索引 Collection list = new ArrayList(); list.add("Java"); list.add("Java"); list.add("MySQL"); list.add(23); list.add(23); list.add(false); list.add(false); System.out.println(list); //无序 不重复 无索引 Collection list1 = new HashSet(); list1.add("Java"); list1.add("Java"); list1.add("MySQL"); list1.add(23); list1.add(23); list1.add(false); list1.add(false); System.out.println(list1); } }
运行结果如图:
集合对于泛型的支持
- 集合都是支持泛型的,可以在编译阶段约束集合只能操作某种数据类型
Collection<String> lists = new ArrayList<String>(); Collection<String> lists = new ArrayList<>();// JDK 1.7 开始后面的泛型类型申明可以省略不写
注意:集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象。
如果集合中存储基本类型的数据怎么办?
Collection集合
- Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
代码演示如下:
public class CollectionDemo { public static void main(String[] args) { // HashSet:添加的元素都是无序,不重复,无索引 Collection<String> list = new ArrayList<>(); //1.添加元素,添加成功返回true list.add("Java"); list.add("HTML"); System.out.println(list.add("HTML")); list.add("MySQL"); list.add("Java"); System.out.println(list.add("黑马")); System.out.println(list); //2.清空集合的元素 //list.clear(); //System.out.println(list); //3.判断集合是否为空,是空返回true,反之 System.out.println(list.isEmpty()); //4.获取集合的大小 System.out.println(list.size()); //5.判断集合中是否包含某个元素 System.out.println(list.contains("Java")); // true System.out.println(list.contains("java")); // false System.out.println(list.contains("黑马")); // true //6.删除某个元素:如果有多个重复默认元素删除前面一个 System.out.println(list.remove("java")); //false System.out.println(list); System.out.println(list.remove("Java")); //true System.out.println(list); //7.把集合转换成数组 Object[] arrs = list.toArray(); System.out.println("数组:"+ Arrays.toString(arrs)); } }
迭代器遍历概述
- 遍历就是一个一个的把容器中的元素访问一遍。
- 迭代器在Java中的代表是Iterator,迭代器是集合的专用遍历方式。
迭代代码演示如下:
public class CollectionDemo1 {
public static void main(String[] args) {
Collection<String> lists = new ArrayList<>();
lists.add("赵敏");
lists.add("小昭");
lists.add("素素");
lists.add("灭绝");
System.out.println(lists);
Iterator<String> it = lists.iterator();
while (it.hasNext()){
String ele = it.next();
System.out.println(ele);
}
}
}
问:迭代器如果取元素越界会出现什么问题。
- 会出现NoSuchElementException异常。
增强for循环
- 增强for循环:既可以遍历集合也可以遍历数组。
- 它是JDK5之后出现的,其内部原理是一个Iterator迭代器,遍历集合相当于是迭代器的简化写法。
- 实现Iterable接口的类才可以实现迭代器和增强for,Collection接口已经实现了Iterable接口。
代码演示如下:
public class CollectionDemo2 { public static void main(String[] args) { Collection<String> lists = new ArrayList<>(); lists.add("赵敏"); lists.add("小昭"); lists.add("素素"); lists.add("灭绝"); System.out.println(lists); for (String ele:lists){ System.out.println(ele); } System.out.println("-----------------"); double[] scores = {100,99.5,59.5}; for (double score:scores){ System.out.println(score); if (score == 59.5){ score = 100.0;// 注意:修改第三方变量的值不会影响到集合中的元素! } } } }
Lambda表达式遍历集合
- 得益于JDK8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。
代码演示如下:
public class CollectionDemo3 { public static void main(String[] args) { Collection<String> lists = new ArrayList<>(); lists.add("赵敏"); lists.add("小昭"); lists.add("素素"); lists.add("灭绝"); System.out.println(lists); //1. // lists.forEach(new Consumer<String>() { // @Override // public void accept(String s) { // System.out.println(s); // } // }); //2. // lists.forEach(s -> { // System.out.println(s); // }); //3. // lists.forEach(s -> System.out.println(s)); //4. lists.forEach(System.out::println); } }
电影类:
public class Movie { private String name; private double score; private String actor; public Movie() { } public Movie(String name, double score, String actor) { this.name = name; this.score = score; this.actor = actor; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } public String getActor() { return actor; } public void setActor(String actor) { this.actor = actor; } }
测试类:
public class TestDemo { public static void main(String[] args) { //1.定义一个电影类 //2.定义一个集合对象存储3部电影 Collection<Movie> movies = new ArrayList<>(); movies.add(new Movie("《你好,李焕英》",9.5,"哒哒,哒哒")); movies.add(new Movie("《唐人街探案》",9,"哒哒哒,哒哒哒")); movies.add(new Movie("《刺杀小说家》",8.6,"哒哒哒,哒哒哒")); for (Movie movie:movies){ System.out.println("片名:" + movie.getName()); System.out.println("评分:" + movie.getScore()); System.out.println("主演:" + movie.getActor()); } } }