集合重点整理:
collection<E>接口---list<E>接口和set<E>接口(线性集合)
List接口--------的实现类中主要学习了ArrayList. LinkedList. Vector. Stack(是Vector类的一个子类)类。
实现List接口的集合:总体上有序(针对元素插入的顺序),不排除重复
ArrayList---底层通过数组实现,适用于元素的修改和查找操作,
常用方法:add(). addAll(). clear(). contians(Objiec o). contiansAll(). get(int index)
indexOf(Object o). Iterator(). ListIterator(). isEmpty(). size(). suList()
remove(). removeAll(). retainAll(). set(int index,Object o). trimToSize()
LinkedList--底层通过链表实现,适用于元素的增加和删除操作,
除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名
方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
所以也有 peek() pop() push()方法 addFirst(), addLast(), getFirst(), getLast(), peek()
peekLast(), addFirst(), addLast(), removeFirst(), removeLast()
Stack-------创建一个空堆栈,常用方法: peek() pop() push()
实现List接口集合的遍历方式:
1:for循环(增强for循环)
2:Iterator()迭代器
3:listIterator() list的专属迭代器 允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器
在列表中的当前位置
Set接口-------------的实现类 HashSet . LinkedHashSet(是HashSet的子类). TreeSet
实现Set接口的集合:总体无序存储,排重.set 不包含满足e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个
null 元素
TreeSet-----实现Set接口的同时,也实现了SortedSet接口 进一步提供关于元素的总体排序 的 Set。这些元素使用其自然顺序
进行排序,或者根据通常在创建有序 set 时提供的 Comparator 进行排序。该 set 的迭代器将按元素升序遍历
set。提供了一些附加的操作来利用这种排序。(headSet(), subSet(), tailSet())
TreeSet集合的元素排序:
自然排序:自动调用Compareto方法,对元素升序排序.当然我们也可以实现Comparable接口重写
Compareto方法来按照我们想要的顺序来排序.(重写必须实现Comparable接口)
定制排序:实现Compartor接口,重写Compare方法.
创建 set 时提供的 Comparator 进行排序(使用匿名内部类,实现我们想要的排序)
构造方法中必须要传入一个比较器,不能使用无参构造
TreeSet<E> t = new TreeSet<>(comparator)
HashSet, LinkedHashSet(extends HashSet)区别不大. 如果要按照我们自己的条件排重,就必须重写equals()和hashCold()方法
Map接口-------------映射性集合,元素以键值对的形式存在(key=value;key:value)相对无序,整体排重(只对key进行排重)
put(k key,v value)具体方法查API;
HashMap, LinkedHashMap(extends HashMap) 排重,可以重写equals()和HashCold()方法来实现我们定义的排重效果
Hashtable, Properties(extends Hashtable) 不允许key,value为null
TreeMap 实现了Map接口,也实现了SortedMap接(口进一步提供关于键的总体排序 的 Map。该映射是根据其键的自然
顺序进行排序的,或者根据通常在创建有序映射时提供的 Comparator 进行排序)
排序只对key进行排序,和TreeSet集合相似, 1:实现Compartor接口,重写Compare方法
2:实现Comparable接口,重写Comparato方法
Map集合的遍历方式:
1: 通过keySet()方法,获取包含key的set视图,
然后遍历该set集合,得到所有的key,
通过get()方法获取value;
2: 通过entrySet()方法,得到包含映射关系的 Set 视图(Set<Map.Entry<k,v>>)
可以直接遍历该set集合,直接得到键值映射关系
也可以通过Map.Entry<k,v>接口中的getKey()和getValue()方法来分别获得键和值对;
下面有两个 案例 大家可以参考一下
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
import java.util.Comparator;
public class Student implements Comparator<Student>{ //这是一个简单的学生类
String name;
int age;
int score;
public Student(String name, int age, int score) {
super();
this.name = name;
this.age = age;
this.score = score;
}
public Student() {
super();
}
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;
}
@Override
public String toString() {
return "学生 [名字=" + name + ", 年龄=" + age + ", 分数=" + score + "]";
}
@Override
public int compare(Student o1, Student o2) { //重写compare方法 因为实现的是 Comparator接口 (定制排序)
if(o1.score-o2.score!=0){
return o1.score-o2.score;
}else {
if(o2.age-o1.age!=0){
return o2.age-o1.age;
}else{
if(o1.name.compareTo(o2.name)!=0){
return o1.name.compareTo(o2.name);
}else{
return 0;
}
}
}
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class TestStudent { //测试类
public static void main(String[] args) {
TreeSet<Student> t= new TreeSet<>(new Student()); //这里用TreeSet集合的有参数的构造方法 传入一个比较器进去 new Student()
t.add(new Student("a", 18, 56));
t.add(new Student("e", 12, 23));
t.add(new Student("d", 15, 23));
t.add(new Student("f", 11, 89));
t.add(new Student("q", 18, 12));
t.add(new Student("q", 1, 12));
//System.out.println(t.size());
Iterator<Student> s = t.iterator();
while(s.hasNext()){
System.out.println(s.next());
}
TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() { //如果我们在Student类中 重写compare方法中 没有实现具体的代码 我们可以再这里传入一个匿名内部类的方式
@Override
public int compare(Student o1, Student o2) {
if(o1.score-o2.score!=0){
return o1.score-o2.score;
}else if(o2.age-o1.age!=0){
return o2.age-o1.age;
}else{
return o1.name.compareTo(o2.name);
}
}
}); //到这里 这条语句才结束 创建了一个TreeSet集合 里面传入了一个Comparetor 比较器
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public class Student implements Comparable<Student>{
String name;
private int scores;
private int age;
private String sex;
private int id;
private int mathscore;
private int chinesescore;
private int engishscore;
private int allscore;
public Student(String name, int scores, int age, String sex, int id, int mathscore, int chinesescore,
int engishscore, int allscore) {
super();
this.name = name;
this.scores = scores;
this.age = age;
this.sex = sex;
this.id = id;
this.mathscore = mathscore;
this.chinesescore = chinesescore;
this.engishscore = engishscore;
this.allscore = allscore;
}
@Override
public int compareTo(Student o) { //自然排序 重写 compareTo方法,把每个属性都需要添加进去比较 才能给达到排重的功能 如果你另外去写equals和hashcode 是没法达到目的的
//就算重写了 这两个方法 在加入集合的时候 不会调用这两个方法排重 只会用到 compareTo方法
if((o.getAllscore()+o.getChinesescore()+o.getEngishscore()+o.getMathscore())!=
(this.allscore+this.chinesescore+this.engishscore+this.mathscore)){
return (o.getAllscore()+o.getChinesescore()+o.getEngishscore()+o.getMathscore())-
(this.allscore+this.chinesescore+this.engishscore+this.mathscore);
}else if(this.allscore!=o.getAllscore()){
return o.getAllscore()-this.allscore;
}else if(this.mathscore!=o.getMathscore()){
return o.getMathscore()-this.mathscore;
}else if(this.engishscore!=o.getEngishscore()){
return o.getEngishscore()-this.engishscore;
}else if(o.getChinesescore()!=this.chinesescore){
return o.getChinesescore()-this.chinesescore;
}else if(!o.getName().equals(this.name)){
return o.getName().compareTo(this.name);
}else if(o.getAge()!=(this.age)){
return o.getAge()-(this.age);
}else{
return o.getSex().compareTo(this.sex);
}
}
// 这样写来为了实现排重 是没有任何意义的
/*@Override
public boolean equals(Object obj) {
if(obj instanceof Student){
Student s = (Student) obj;
if(s.getName().equals(this.name)&&s.getAge()==this.age&&
s.getSex().equals(this.sex)&&s.getId()==this.id){
return true;
}
}
return false;
}
@Override
public int hashCode() {
return this.age+this.id+this.chinesescore+this.engishscore+this.mathscore
+this.allscore;
}*/
}