集合的知识点
**集合的知识点**
一、集合的概念
集合是为了存储不同类型的数据、容量可扩充的容器。关键字为collection;
1.1 集合与数组的区别
A. 数组是固定类型、长度的;集合是可以存储不同的数据类型、长度是变化的
B. 集合的类型是引用类型;数组可以是基本类型,也可以是引用类型。
1.2 collection是所有集合的顶层接口,也就是说collection是所有集合的父类。当集合调用时必须
有其实现方法。collection中子体有有序、重复、唯一、无序的
1.3 Collection的功能概述:
1.添加功能:
boolean add(E e)
确保此集合包含指定的元素(可选操作)。
boolean addAll(Collection<? extends E> c)
将指定集合中的所有元素添加到此集合(可选操作)。
2.删除功能:
void clear()
此集合中删除所有元素(可选操作)。
boolean remove(Object o)
从该集合中删除指定元素的单个实例(如果存在)(可选操作)。
boolean removeAll(Collection<?> c)
删除指定集合中包含的所有此集合的元素(可选操作)。
3.判断功能:
boolean contains(Object o)
如果此集合包含指定的元素,则返回 true 。
boolean containsAll(Collection<?> c)
如果此集合包含指定 集合中的所有元素,则返回true。
boolean isEmpty()
判断集合是否为空;
4.获取功能(重点):
Iterator iterator()
返回此集合中的元素的迭代器。
boolean hasNext()
如果迭代具有更多元素,则返回 true 。
E next()
返回一个元素。
5.长度功能:
int size():元素的个数
7.把集合转换为数组
Object[] toArray()
返回一个包含此集合中所有元素的数组。
例子
Iterator iterator=list.iterator(); //定义一个迭代器
while(iterator.hasNext()){ //有更多的元素就执行
Student next = iterator.next();
System.out.println(next);
}
1.4 迭代器是重点,可以实现对集合元素的遍历
例2:
package com.collection;
public class Student {
private String name;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return “Student [name=” + name + “, age=” + age + “]”;
}
}
package com.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class StudentDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Collection<Student> list=new ArrayList<>();
list.add(new Student("学习",18)); //添加元素
list.add(new Student("很",18));
list.add(new Student("快",18));
list.add(new Student("乐",18));
Iterator<Student> iterator=list.iterator(); //定义一个迭代器
while(iterator.hasNext()){ //有更多的元素就执行
Student next = iterator.next();
System.out.println(next);
}
}
}
二、集合的类别
1.List
2.Set
2.1. List的实现类是ArrayList、LinkedList、vetor
List的子类:****
(1)子类的特点:
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
要线程安全吗?
要:Vector(即使要线程安全,也不用这个了,后面有替代的)
不要:ArrayList或者LinkedList
查询多:ArrayList
增删多:LinkedList
2.2 List的特点
List的特点是有序(进出顺序一样)、可重复
2.3 LinkedList的知识点
LinkedList的特有功能:
-
1.添加功能:
-
void addFirst(E e)
在该列表开头插入指定的元素。
void addLast(E e)
将指定的元素追加到此列表的末尾。
2.获取功能:
E getFirst()
返回此列表中的第一个元素。
E getLast()
返回此列表中的最后一个元素。
3.删除功能:
E removeFirst()
从此列表中删除并返回第一个元素
-
E removeLast()
从此列表中删除并返回最后一个元素。
2.4 Vector的特有功能:
1.添加功能:
void addElement(E obj) —>add()
2.获取功能:
E elementAt(int index) —>get()
Enumeration elements() ---->Iterator iterator()
boolean hasMoreElements() ---->hasNext()
E nextElement() ---->next()
2.5 集合的遍历
1.通过迭代器的遍历
例如:Iterator iter=list.iterator();
while(iter.hasNext()){
String next = iter.next();
System.out.println(next);
}
2.通过遍历整个集合
例如:for(int i=0;i<list.size();i++){
String string = list.get(i);
System.out.println(string);
}
3.增强for
例如: ArrayList list2=new ArrayList<>();
for(Person person:list){
if(!list2.contains(person)){
list2.add(person);
}
}
三、Set集合
Set是唯一、无序的,但是存储有一定顺序
Set分为HashSet、TreeSet
3.1 HashSet
HashSet:存储字符串并遍历
- HashSet为什么不能重复呢?
-
因为add()底层依赖了两个方法 一个 hashCode()和equals()
- 步骤:
-
首先比较哈希值
-
如果哈希值相同,继续走,走equals();
-
如果哈希值不同,添加到集合中
- 利用HashSet去存储对象
- 目前存储对象不符合我们的要求:我们知道HashSet底层是依赖了hashCode()和equals()
HashSet要实现唯一不重复的功能,需要实现Comparable,并重写Compareto方法
package com.HashSetDemo;
public class Student implements Comparable{
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return “Student [name=” + name + “, age=” + age + “]”;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int compareTo(Student s) {
// TODO Auto-generated method stub
int num=this.name.length()-s.name.length();
int num1=num0?this.age-s.age:num;
int num2=num10?this.name.compareTo(s.name):num1;
return num2;
}
}
package com.HashSetDemo;
import java.util.HashSet;
public class HashSetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet a=new HashSet<>();
a.add(new Student(“代码神”,11));
a.add(new Student(“代码之仙”,18));
a.add(new Student(“代码之仙”,18));
a.add(new Student(“代码之”,20));
System.out.println(a);
}
}
3.2 TreeSet
TreeSet:能够对元素按照某种规则来进行排序
- 排序方式两种:
-
1.自然排序
-
2.比较器排序
- TreeSet集合的特点:排序和唯一
- 自然排序:
-
让元素所属的类实现自然排序接口Comparable
- 比较排序:
-
让集合的构造方法接受一个比较器接口的实现类或者匿名内部类的形式 Comparator
- 例子:
package com.hwua.SetDemo;
public class Student implements Comparable{
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return “Student [name=” + name + “, age=” + age + “]”;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
/* return 1; 大于
return 0; 相等
return -1; 小于 */
int num =o.name.length()-this.name.length();
int num2 = num==0?this.age-o.age:num;
int num3 = num2 ==0?this.name.compareTo(o.name):num2;
return num3;
}
}
- public class TreeSetDemo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet ts = new TreeSet<>(new Comparator() {
@Override
public int compare(Student s1, Student s2) {
// TODO Auto-generated method stub
int num = s1.getName().length()-s2.getName().length();
int num2 = num0?s1.getName().compareTo(s2.getName()):num;
int num3 = num20?s1.getAge()-s2.getAge():num2;
return num3;
}
});
ts.add(new Student(“张三啊”, 26));
ts.add(new Student(“李四啊啊”, 36));
ts.add(new Student(“王五”, 26));
ts.add(new Student(“张三”, 16));
ts.add(new Student(“马奇qewqweq”, 15));
System.out.println(ts);
}
}
例子:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台
分析:1.定义学生类
-
2.创建一个TreeSet集合
-
3.总分从高到低怎么做,如果总分相同又该怎么比较
-
4.键盘录入5个学生信息 (循环录入)
-
5.遍历TreeSet集合
package com.hwua.SetDemo;
(姓名,语文成绩,数学成绩,英语成绩)
public class Student1 {
private String name;
private int chinese;
private int math;
private int english;
public Student1() {
super();
}
public Student1(String name, int chinese, int math, int english) {
super();
this.name = name;
this.chinese = chinese;
this.math = math;
this.english = english;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getChinese() {
return chinese;
}
public void setChinese(int chinese) {
this.chinese = chinese;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getEnglish() {
return english;
}
public void setEnglish(int english) {
this.english = english;
}
@Override
public String toString() {
return “Student1 [name=” + name + “, chinese=” + chinese + “, math=” + math + “, english=” + english + “]”;
}
//计算总成绩的方法
public int getSum(){
return chinese+math+english;
}
}
public class TreeSetTest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet ts = new TreeSet<>(new Comparator() {
@Override
public int compare(Student1 o1, Student1 o2) {
// TODO Auto-generated method stub
//总分从高到低
int num = o2.getSum()-o1.getSum();
int num2 = num0?o1.getChinese()-o2.getChinese():num;
int num3 = num20?o1.getMath()-o2.getMath():num2;
int num4 = num30?o1.getEnglish()-o2.getEnglish():num3;
int num5 = num40?o1.getName().compareTo(o2.getName()):num4;
return num5;
}
});
for (int i = 0; i <5; i++) {
Scanner sc = new Scanner(System.in);
System.out.println(“请输入学生名字:”);
String name = sc.nextLine();
System.out.println(“请输入语文成绩:”);
int chinese = Integer.parseInt(sc.nextLine());
System.out.println(“请输入数学成绩:”);
int math = Integer.parseInt(sc.nextLine());
System.out.println(“请输入英语成绩:”);
int english = Integer.parseInt(sc.nextLine());
Student1 stu1 = new Student1(name, chinese, math, english);
ts.add(stu1);
}
System.out.println(“学生信息录入完毕”);
for (Student1 student1 : ts) {
System.out.println(student1);
}
}
三、总结
-
collection是所有集合的顶层接口
-
集合分为set、list, list的实现类是ArrayList()、LinkedList()、vector();
set的实现类是HashSet()、TreeSet()set的实现类是HashSet()、TreeSet() -
集合遍历的三种形式
(1) 遍历整个集合,获得集合的各个元素
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
(2)迭代器
Iterator iterator = list.iterator();
while(iterator.hasNext()){ //当集合还有更多内容的时候,可以去执行
String next = iterator.next();
System.out.println(next);
}
(3)增强for
for (Student student : ll) { 第一个Student是参数类型, 第二个student是变量名,第三个是集合的变量名
System.out.print(student);
}
4.当集合中有相等的元素时,HashSet()要调用其equals方法,要比较哪一个对象,就留哪一个对象
5.LinkedHashSet是通过linked的有序和hashset的唯一性,获得不重复的值
6.TreeSet集合的 特点是唯一和排序
7.TreeSet存在两张排序 : (1)自然排序
(2)比较排序
(1)自然排序
让元素所属的类实现自然排序接口Comparable
例如:
public class Student implements Comparable
重写compareTo()方法
例如:
public int compareTo(Student o) {
// TODO Auto-generated method stub
int num = o.name.length()-this.name.length();
int num2 = num==0?this.age-o.age:num;
int num3 = num2 ==0?this.name.compareTo(o.name):num2;return num3; }
(2)比较器排序
让集合的构造方法接受一个比较器接口的实现类或者匿名内部类的形式 Comparator
例如:
TreeSet ts = new TreeSet<>(new Comparator() {
@Override
public int compare(Student s1, Student s2) {
// TODO Auto-generated method stub
int num = s1.getName().length()-s2.getName().length();
int num2 = num0?s1.getName().compareTo(s2.getName()):num;
int num3 = num20?s1.getAge()-s2.getAge():num2;
return num3;
}
});
上一篇: 第十章:集合
下一篇: Arrays工具类详解(shang)