树集
TreeSet泛型类
由TreeSet类创建的对象称为树集
树集采用树结构存储数据,树节点中的数据会按存放数据的"大小"顺序进行排序,在同一层中的结点从左到右,从大到小的顺序递增排列,下一层都比上一层的小
TreeSet<String> mytree = new TreeSet<String>(); //创建一个树集
然后可以调用add()方法往树集添加结点
mytree.add("boy")
mytree.add("girl")
结点的大小关系
String类实现了Comparable接口
中的compareTo(Object str)
方法,字符串对象调用compareTo(String s)方法按字典序与参数s指定的字符串比较大小,也就是说两个字符串对象知道怎样比较大小
实现Comparable接口类创建的对象可以调用compareTo(Object str)
方法和参数指定的对象比较大小关系,假如a和是实现Comparable接口类创建的两个对象,当a.compareTo(b)<0时,也就是说a<b
;如此类推
TreeSet常用方法
- public boolean add(E o) //添加结点
- public void clear() //删除树集所有结点
- public void contains(Object o) //是否拥有结点o
- public E first() //返回树集的第一个结点(最小的结点)
- public E last() //返回树集的最后一个结点(最大的结点)
- public isEmpty() //判断树集是否为空
- public boolean remove(Object o) //删除树集的结点,成功为ture
- public int size() //返回树集中结点的数量
使用树集对学生的英语成绩进行排名的例子
import java.util.Iterator;
import java.util.TreeSet;
class Student implements Comparable {
String name; //名称
int English; //英语成绩
Student() {
}
Student(String name, int English) {
this.name = name;
this.English = English;
}
@Override
public int compareTo(Object o) { //重写Comparable接口的方法
Student student = (Student) o; //将对象转为Student
return (this.English - student.English); //比较英语成绩()
}
}
public class Example13_8 {
public static void main(String[] args) {
TreeSet<Student> myTree = new TreeSet<Student>();
Student st1, st2, st3; //三个学生对象
st1 = new Student("小明", 58);
st2 = new Student("大明", 98);
st3 = new Student("小刚", 88);
myTree.add(st1);
myTree.add(st2);
myTree.add(st3);
Iterator<Student> iterator = myTree.iterator(); //树集的迭代器
while (iterator.hasNext()) { //如果树集有结点的话就输出
Student stu = iterator.next(); //将结点放到一个对象中
System.out.println("姓名:" + stu.name + " " + "英语成绩:" + stu.English);
}
}
}
运行结果
D:\HelloWorld\out\production\HelloJava Chapter_13.Part_4.Example13_8
姓名:小明 英语成绩:58
姓名:小刚 英语成绩:88
姓名:大明 英语成绩:98
进程已结束,退出代码 0
需要注意的是
树集中不允许出现大小相等的两个结点
,如有需要的话可以重写Comparable接口中的方法//
树映射
TreeMap<K,V>类实现了Map<K,V>接口,称TreeMap<K,V>对象称为树映射
树映射使用public V put(K key,V value),方法添加结点
和树集不同树映射是按照结点中的关键字进行升序排列的
同样是学生成绩的例子
import java.util.Collection;
import java.util.Iterator;
import java.util.TreeMap;
class StudentKey implements Comparable { //用于排序成绩
double d;
StudentKey() {
}
StudentKey(double d) { //传入成绩
this.d = d;
}
@Override
public int compareTo(Object o) {
StudentKey studentKey = (StudentKey) o;
if (this.d - studentKey.d == 0) { //如果成绩相同的话也添加
return -1;
} else {
return (int) ((this.d - studentKey.d) * 1000); //因为成绩相减为负的浮点
}
}
}
class Students { //学生类
String name;
double English;
double Math;
Students(String name, double English, double Math) {
this.name = name;
this.English = English;
this.Math = Math;
}
}
public class Example13_9 {
public static void main(String[] args) {
TreeMap<StudentKey, Students> myTree = new TreeMap<StudentKey, Students>();
String name[] = {"小红", "小绿", "小黑"}; //名称数组
double English[] = {98, 66, 79};
double Math[] = {88, 56, 98};
Students students[] = new Students[3];
for (int i = 0; i < students.length; i++) {
students[i] = new Students(name[i], English[i], Math[i]);
}
StudentKey studentKey[] = new StudentKey[3];
for (int i = 0; i < studentKey.length; i++) {
studentKey[i] = new StudentKey(students[i].English); //将英语成绩录入
}
for (int i = 0; i < students.length; i++) {
myTree.put(studentKey[i], students[i]);
}
Collection<Students> collection = myTree.values(); //将树映射的值放到一个集合对象中
Iterator<Students> iterator = collection.iterator(); //使用迭代器
while (iterator.hasNext()) {
Students students1 = (Students) iterator.next();
System.out.println("姓名:" + students1.name + " " + "英语成绩" + students1.English);
}
System.out.println();
myTree.clear(); //清空树集
for (int i = 0; i < studentKey.length; i++) {
studentKey[i] = new StudentKey(students[i].Math); //将数学成绩录入以作比较
}
for (int i = 0; i < students.length; i++) {
myTree.put(studentKey[i], students[i]);
}
collection = myTree.values(); //将树映射的值放到一个集合对象中
iterator = collection.iterator();
while (iterator.hasNext()) {
Students students1 = (Students) iterator.next();
System.out.println("姓名:" + students1.name + " " + "数学成绩" + students1.Math);
}
}
}
运行结果
D:\HelloWorld\out\production\HelloJava Chapter_13.Part_4.Example13_9
姓名:小绿 英语成绩66.0
姓名:小黑 英语成绩79.0
姓名:小红 英语成绩98.0
姓名:小绿 数学成绩56.0
姓名:小红 数学成绩88.0
姓名:小黑 数学成绩98.0
进程已结束,退出代码 0
线程
-
线程的基本概念
线程是比进程更小的能独立运行的基本单位
线程是进程中的一个实体,是CPU调度和分派的基本单位
线程同样也有就绪等待和运行三种基本状态 -
线程的属性
每个线程都有一个唯一的标识符和一张线程描述表
不同的线程可以执行相同的程序
同一进程中各个线程共享进程的内存地址空间
线程是处理机的独立调度单位,多个线程是可以并发执行的
线程在生命周期内会经历等待,就绪,运行三种状态 -
引入线程的好处
通过创建线程来完成任务,以减少程序并发执行时付出的时空开销
创建一个新线程花费的时间少
切换线程的时间也少
线程能独立运行
CET4P184
- solar
- correspondence
- consequently
- insist
- liberty
- virus
- flourish
- pronoun
- ambulance