一:引言
集合:(set)是一个储存和处理无重复元素的高效数据结构,映射表(map)类似于目录,提供了使用键值对快速查询和获取值得功能
本章将讨论Set Map 以及List的用法
二:set接口
set接口中包括三个具体类分别为:散列类HashSet,树形集TreeSet和链式散列集LinkedHashSet用来创建集合。Set接口拓展了Collection接口,其中Set实例中不包含重复元素 e1.equals(e2)!=true
2.1HashSet
Hashset默认情况下,初始容量为16而负载系数为0.75,若知道将创建的集合大小,则可以再构造方法中创建指定容量和负载系数。负载系数大小为0.0~1
若创建完成,在增加容量前,负载系数会测量集合是否允许多满。如果元素个数超过集合的容量与负载系数的大小,那么集合的容量将会自动翻倍;(若容量为16,负载系数为0.5,那么当集合尺寸达到8(16*0.5=8)时,容量将会自动翻倍到32)
负载系数过高会降低空间开销,默认0.75是时间开销和空间开销的最佳权衡值(将在散列章节中更深入讨论负载系数问题)
例:将字符串添加到集合中
Set <String> set = new HashSet<String>();
String s1 = "Hello";
String s2 = s1;
String s3 = "world";
set.add(s1);
set.add(s2);
Set.add(s3);
//取值方法用迭代器进行取值
Itreator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next()+" ");
}
//也可使用for each方法进行取值,如下:
for(String string:set){
System.out.prientln(set.toUpperCase()+" ");
}
/*
迭代器Itreator,创建一个迭代器,迭代器(iterator)是一种对象
它能够用来遍历标准模板库容器中的部分或全部元素。
迭代器使开发人员能够在类或结构中支持foreach迭代。
*/
//HashSet集合中,可使用add进行添加元素,或者addAll()方法,使用remove()进行删除
~~~~~~~~~~~~~~~~~~~~~手动分隔线 ~~~~~~~~~~~~~~~~~~~~~~~~~ ~
2.2 LinkedHashSet
LinkedHashSet用一个链表实现拓展HashSet,支持对链表中的元素进行排序,HashSet 中的元素是无序的,LinkedHashSet可以根据元素插入的顺序提取,同时LinkedHashSet同样是集合,其中的元素是不能重复的,只是简单的对插入的元素进行简单的插入的顺序的排序,若要强行加一个不同的顺序,使用TreeSet更加高效
~~~~~~~~~~~~~~~~~~~~~~~~~~手动分隔线 ~~~~~~~~~~~~~~~~~~~ ~
2.3TreeSet
TreeSet继承自SortSet抽象类,显然,TreeSet 中的元素是有序的
3.1 创建一个TreeSet:
import java.util.TreeSet;
public class TreeSetmothod {
public static void main(String[] args) {
TreeSet<String> ts = new TreeSet<String>();
ts.add("关羽");
ts.add("刘备");
ts.add("张飞");
ts.add("刘备");
ts.add("李逵");
ts.add("赵云");
for(String i:ts) {
System.out.print(i+" ");
}
System.out.println("first:" + ts.first());
//SortSet集合提供first和last方法返回集合中最大值和最小值
System.out.println("last:" + ts.last());
System.out.println("headSet:" + ts.headSet("张飞"));
//SortSet方法提供headSet(x)和tailSet(x)方法分别返回小于x的元素
//和大于等于x的元素
System.out.println("tailSet:" + ts.tailSet("张飞"));
}
}
输出结果为:
TreeSet实现自定义排序
方法一:(创建关于自定义对象的HashSet集合并实现Comparable接口)
本例使用学生的成绩作为排序
//创建自定义的Student类
package ScoreMangement;
public class Student implements Comparable<Student>{
private int score;
private String name;
private String sno;
public Student() {
}
public Student(String sno,String name,int score ) {
this.score = score;
this.name = name;
this.sno = sno;
}
public Student(String sno ,int score ) {
this.score = score;
this.sno = sno;
}
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
public void setScore(int score) {
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
@Override
public String toString() {
return "学号:"+ this.getSno()+" 姓名"+this.getName()+" 成绩:"+this.getScore();
}
@Override
public int compareTo(Student o) {
int num = this.score - o.score;
int num2 = num == 0?this.sno.length() - o.sno.length(): num;
int num3 = num2 == 0?this.name.length() - o.name.length():num2;
return num3;
}
}
创建实例对象1
package ScoreMangement;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
Set<Student> students = new TreeSet<>();
students.add(new Student("201819244325", "吴用", 196));
students.add(new Student("201819244326", "公孙胜", 128));
students.add(new Student("201819244329", "花荣", 129));
students.add(new Student("201819244330", "李逵", 100));
students.add(new Student("201819244331", "鲁智深", 163));
students.add(new Student("201819244332", "林冲", 168));
students.add(new Student("201819244333", "柴进", 166));
students.add(new Student("201819244334", "朱仝", 145));
students.add(new Student("201819244335", "杨志", 103));
students.add(new Student("201819244336", "史进", 126));
students.add(new Student("201819244337", "阮小五", 130));
for (Student str : students) {
System.out.println(str.getSno() + " " + str.getName() + " " + str.getScore());
}
}
方法二:自定义排序类,实例方法继承此类
//非完全代码
//创建自定义的排序类
class MyComparator implements Comparator(String){
public int compare(String str1,String str2){
return str1.length() - str2.length();
}
//实例类实现自定义的排序类
}
public static void main(String [] args){
TreeSet <String> set = new TreeSet<String> (new MyComparator());
//set.add()添加元素
//指定方式,自定义数据类型以及方法必须是可比较的对象
traverse(set);
}
~~~~~~~~~~~~~~~~~~~~~~~~手动分隔线 ~~~~~~~~~~~~~~~~~~~~~ ~
由于List和Set同时继承了Collection接口,因此接下来讨论LIst集合中的实现子类及其方法
三: List
序:List接口继承自Collection接口,定义顺序储存元素的合集其中包括两个具体的类ArrayList 和 LinkedList
3.1数组线性表ArrayList
ArrayList: 数组线性表,动态创建。若需要通过下标随机访问元素,而不会在线性表起始位置插入或删除元素,那么使用ArrayList更高效,同时ArrayList使用可变大小的数组实现List接口,容量可以自动增大但是不可以自动减小并且可以储存相同的元素