知识点
单列集合Collection
-
Collection是单列集合的顶层接口,他表示一组对象,这些变量被称为Collection的元素
-
如何创建Collection对象
- 方法:以多态的形式
-
常用方法
-
添加add()
-
删除remove()
-
按条件删除removeif()
- removeif()底层会把集合遍历,得到每一个元素,依次把集合中的每一个元素放到lameda表达式中进行判断,如果返回结果为真,则删除,反之则不删除
-
清空集合Collection.clear()
-
判断集合中是否含有指定元素contains()
-
判断是否为空isEmpty()
-
获取长度size()
-
-
Collection集合的遍历
-
迭代器Iterator
-
Iterator常用方法
-
hasNext()
- 判断当前位置是否有元素被取出
-
next()
- 获取当前位置的元素
- 将迭代器对象移向下一个索引位置
-
-
使用步骤
- 获取迭代器对象
- 用while循环调用迭代器里面的方法进行遍历
-
-
增强for
-
优势
- 增强for可以简化数组和Collection集合的遍历
-
-
所有单列结合均可使用Iterator和增强for
-
-
普通for,迭代器,增强for的使用场景
- 如果需要操作索引,使用普通for
- 如果在编里的过程中需要删除元素,用迭代器
- 如果仅仅只是遍历,用增强for
-
分类
-
List
-
概述
- List是有序集合,用户可以精确控制列表中的每个元素的插入位置,用户可以通过索引访问元素,并搜索列表中的元素。
-
特点
-
有序
- 存储和取出的顺序一致
-
可重复
- 存储的元素和重复
-
-
特有方法
- void add(int index,E element)
- E remove(int index)
- set(int index,E element)
-
分类
-
ArraryList
- 底层结构是数组,查询快,增删慢
-
LinkedList
- 底层结构是链表,查询慢,增删快
-
-
-
Set
-
特点
- 可以去除重复
- 存取顺序不一定一致
- 没有带索引的方法,不能使用普通for循环遍历,也不能通过索引来获取,删除set集合里面的元素
-
-
分类
-
TreeSet
-
特点
- 不包含重复元素
- 没有带索引的方法
- 可以将元素按照规律进行排序
-
注意
- 要想使用TreeSet,需要制定排序规则
-
自然排序Comparable的使用
- 使用空参构造方法创建TreeSet集合
- 自定义类实现Compara接口
- 重写里面的CompareTo方法
-
比较器排序Comparable的使用
- TreeSet的带参构造方法使用的是比较器排序对元素进行排序
- 比较器排序就是让集合构造方法接受Comparator实现类对象,重写compare(T o1,T o2)方法
- 重写方法是一定要注意排序规则必须按照要求的主要条件和次要条件写
- 当自然排序不足以满足现在需求,使用比较器排序
-
泛型
-
本质
-
参数化类型
- 将类型由原来的具体类型参数化,然后再使用、调用时传入具体的类型
- 这种残烛类型可以用于类,方法,接口中,分别被称作泛型类,泛型方法,泛型接口。
-
-
泛型的格式
- <类型>制定一种类型的格式
- <类型1,类型2…>指定多种类型的格式
- 类型可以看成是形参
- 将来调用的时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型
-
泛型的好处
- 吧运行时期的问题提前到了编译期
- 避免了强制类型转换
-
类型通配符
- 为了表示各种泛型List的父类可以使用类型通配符
- 类型通配符<?>
- List<?>表示元素类型未知的list,它的元素可以匹配任何类型
-
泛型接口的使用方式
-
方式一
- 实现类也不给泛型
-
方式二
- 实现类确定具体的数据类型
-
-
-
-
HashSet
-
-
list集合基础,练习练习
1.请说明java集合的继承结构图
形式如下:
A
|\
B C
| \
E F.......
2.ArrayList,LinkedList,Vector三者的相同点与不同点?(“Vector”可百度)【面试题】
三个类都实现了List接口,存储数据的形式特点相同,都是存储可重复的有序的数据。
1.ArrayList类主要是实现类,虽然效率高,但是线程不安全。底层用的是Object[]数组存储,查找快,增删慢
2.LinkedList类主要是用于频繁插入,删除操作,当然它的效率比ArrayList高,所以它的线程安全程度比ArrayList更低,底层使用的是双向链表存储。增删快,查找慢。
3.Vector属于比较古老的一种类,效率比较低,反之线程比较安全,底层使用的是Object[]数组存储。
3.List 接口的常用方法有哪些?(增、删、改、查、插、长度、遍历等)
add(),remove(),set() isEmpty() size()
4.如何使用Iterator和增强for循环遍历List。举例说明
使用Iterator迭代器时,Iterator<>方括号中的类型需要与list的类型保持一致。
用while循环,循环条件则是用iterator的hasNext()判断是否有下一个元素,当存在时,进入循环体,打印输出迭代器变量.next()
增强for主要格式是for(类型 变量名:数组/集合名称){}
已知有十六支男子足球队参加2008 北京奥运会。
写一个程序,把这16支球队随机分为4个组。采用List集合和随机数
2008 北京奥运会男足参赛国家:
科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚、日本,美国,中国,新西 兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利
//代码实现
public static void main(String[] args) {
List<String> country=new ArrayList<>();
country.add(new String("科特迪瓦"));
country.add(new String("阿根廷"));
country.add(new String("澳大利亚"));
country.add(new String("塞尔维亚"));
country.add(new String("荷兰"));
country.add(new String("尼日利亚"));
country.add(new String("日本"));
country.add(new String("美国"));
country.add(new String("中国"));
country.add(new String("新西兰"));
country.add(new String("巴西"));
country.add(new String("比利时"));
country.add(new String("韩国"));
country.add(new String("喀麦隆"));
country.add(new String("洪都拉斯"));
country.add(new String("意大利"));
for (String s : country) {
System.out.print(s +" ");
}
Random random=new Random();
String member;
for (int i = 0; i < 4; i++) {
System.out.println();
System.out.println("第"+(i+1)+"组:");
for (int j = 0; j < 4; j++) {
member=country.get(random.nextInt(country.size()));
country.remove(member);
System.out.print(member+" ");
}
}
}
写一个方法reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如:
List list = new ArrayList();
list.add(“Hello”);
list.add(“World”);
list.add(“Learn”); //此时list 为Hello World Learn
reverseList(list); //调用reverseList 方法之后,list 为Learn World Hello
//代码实现
public static void main(String[] args) {
List<String> list = new ArrayList();
list.add("Hello");
list.add("World");
list.add("Learn");
reverseList(list);
}
public static void reverseList(List<String> list){
for (int i = list.size()-1; i >=0; i--) {
System.out.print(list.get(i)+" ");
}
}
有如下Student 对象,
private String name;
private int age;
private int score;
private String classNum;
其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList();
list.add(new Student(“Tom”, 18, 100, “class05”));
list.add(new Student(“Jerry”, 22, 70, “class04”));
list.add(new Student(“Owen”, 25, 90, “class05”));
list.add(new Student(“Jim”, 30,80 , “class05”));
list.add(new Student(“Steve”, 28, 66, “class06”));
list.add(new Student(“Kevin”, 24, 100, “class04”));
在这个list 的基础上,完成下列要求:
//1) 计算所有学生的平均年龄
//2) 计算各个班级的平均分
// 代码实现
List<Student> list = new ArrayList();
list.add(new Student("Tom", 18, 100, "class05"));
list.add(new Student("Jerry", 22, 70, "class04"));
list.add(new Student("Owen", 25, 90, "class05"));
list.add(new Student("Jim", 30,80 , "class05"));
list.add(new Student("Steve", 28, 66, "class06"));
list.add(new Student("Kevin", 24, 100, "class04"));
Iterator<Student> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
double avgAge=0;
int sum=0;
double score=0;
double avgScore=0;
//1) 计算所有学生的平均年龄
for (int i = 0; i < list.size(); i++) {
sum+=list.get(i).getAge();
score+=list.get(i).getScore();
}
avgAge=sum/(list.size());
//计算平均分
avgScore=score/(list.size());
System.out.println("平均年龄是"+avgAge);
System.out.println("平均分是:"+avgScore);
}
//Student类
public class Student {
private String name;
private int age;
private int score;
private String classNum;
public Student() {
}
public Student(String name, int age, int score, String classNum) {
this.name = name;
this.age = age;
this.score = score;
this.classNum = classNum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public String getClassNum() {
return classNum;
}
public void setClassNum(String classNum) {
this.classNum = classNum;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
", classNum='" + classNum + '\'' +
'}';
}
}