大学"/>
大学
第十四章 泛型与集合框架
- 15.1 泛型
- 15.2 链表
- 15.2.1 LinkedList<>泛型类
- 15.2.2 常用方法
- 15.2.3 遍历列表
- 15.2.4 排序与查找
- 15.2.5 排序与查找
- 15.2.5 洗牌与旋转
- 15.3 堆栈
- 15.4 散类映射
- 15.5 树集
- 15.6 树映射
- 15.7 集合
- 15.8 举例应用
15.1 泛型
- 介绍:泛型就是泛泛的类型,即不确定其是什么类型。
- 泛型类的声明
- 泛型的声明:
class People<E>
用此类构造对象的时候不知道它是什么类型,需要自己设定。 - 非泛型的声明:
class People
用此类构造对象对象的类型就是People类型。
- 泛型的声明:
- 使用泛型类声明对象
People<LocalTime>zhang = new People<LocalTime>();
- 注意泛型对象声明的同时在尖括号中需要制定明确的类,不能不指定或者是不确定的类。
- 实现泛型接口
public interface Comparable<T>{public int compareTo(T m)}
(这个地方不太懂格式就是这样,以后再说)
- 例子
- 这个例子就是
People.java
Example15_1.javapublic class People<E> {E friend;public void setFriend(E object) {friend = object;} public E getFriend(){return friend;} }
Dog.javaimport java.time.*; public class Example15_1 {public static void main(String args[]) {//将泛型E指定为LocalTimePeople<LocalTime> zhang=new People<LocalTime>();zhang.setFriend(LocalTime.now());LocalTime zhangFriend = zhang.getFriend();System.out.println(zhangFriend);People<Double> geng = new People<Double>() ;geng.setFriend(1.618);double gengFriend = geng.getFriend();System.out.println(gengFriend); } }
public class Dog implements Comparable<Dog> {int weight;public int compareTo(Dog m){if(weight>m.weight)return 1;else if(weight == m.weight)return 0;elsereturn -1;}public static void main(String args[]){Dog dog1 = new Dog();Dog dog2 = new Dog();dog1.weight = 20;dog2.weight = 25; System.out.println(dog1pareTo(dog2));} }
- 这个例子就是
15.2 链表
15.2.1 LinkedList<>泛型类
- 介绍:存储数据的一种方法,每一个数据节点中包含:本节点数据、上一节点的数据、下一个节点的数据或者:本节点数据、下一节点数据
- 用到的类和使用方法
- 用到的类:java.util 包中LinkedList<>
- 使用方法(创建双向链表):
LinkedList<String> mylist = new LinkedList<String>()
- 例子(链表都是String类型的)
LinkedList<String> mylist = new LinkedList<String>();
mylist.add("How");
mylist.add("Are");
mylist.add("You");
mylist.add("Java");
15.2.2 常用方法
- 重要的概念:在链表中比较链表中有没有某个内容,注意比较的是具体的内容不是引用。
- 原理(自己理解):把要比价的来个内容转化为同一类型,然后若内容一样,应用值一样然后equals()比较引用。(==比较的就是引用)
15.2.3 遍历列表
- JVM中为各种数据结构集合都提供了迭代器。
- 链表对象的迭代器:可以通过iterator()获得一个Iterator对象这个对象就是迭代器。
- 迭代器的优势:能更好的使用缓存和预取机制,有时可能比get()方法更快。
- 例子(比较读取列表中的数据速度所用的时间)
import java.util.*; public class Example15_3 {public static void main(String args[]){List<String> list=new LinkedList<String>();for(int i=0;i<=60096;i++){list.add("speed"+i);}Iterator<String> iter=list.iterator();long startTime = System.nanoTime();while(iter.hasNext()){String te=iter.next();}long estimatedTime = System.nanoTime() - startTime;System.out.println("迭代器所用时间:"+estimatedTime+"纳秒");startTime = System.nanoTime();for(int i=0;i<list.size();i++){String te=list.get(i);}estimatedTime = System.nanoTime() - startTime;System.out.println("get方法所用时间:"+estimatedTime+"纳秒");} }
15.2.4 排序与查找
- 介绍:遍历列表可以使用get+while循环得到列表中的内容,但是由于数据不是按照列表节点中的顺序存储的,从而get方法特意的去按照节点的顺序去遍历列表反而会减慢遍历速度,从而产生了迭代器。
- 用法:用iterator()方法获取一个Iterator对象,针对当前列表的迭代器。
Iterator<String> iter = list.iterator()
- 例子
import java.util.*; public class Example15_3 {public static void main(String args[]){List<String> list=new LinkedList<String>();for(int i=0;i<=60096;i++){list.add("speed"+i);}Iterator<String> iter=list.iterator();long startTime = System.nanoTime();while(iter.hasNext()){String te=iter.next();}long estimatedTime = System.nanoTime() - startTime;System.out.println("迭代器所用时间:"+estimatedTime+"纳秒");startTime = System.nanoTime();for(int i=0;i<list.size();i++){String te=list.get(i);}estimatedTime = System.nanoTime() - startTime;System.out.println("get方法所用时间:"+estimatedTime+"纳秒");} }
15.2.5 排序与查找
-
介绍:对列表中的数据要进行排序就使用Collections类中的方法。其中比较特殊的方法是sort方法如果对于非String对象需要重写CompareTo<>接口中的compareTo()方法因为使用sort()方法时,此方法就用到compareTo()方法。
-
查找的方法:
int binarySearch(List<T>list,T key,CompartTo<T>c)
返回的索引的位置。 -
重新定义不想改动接口中重写的compareTo()方法但还想比较其他的变量:
Collections.sort(list,(a,b)->{ return a.weight-b.weight;});
-
例子
import java.util.*; class Student implements Comparable<Student> { int height=0;int weight;String name;Student(String n,int h,int w) {name=n;height = h;weight = w;}public int compareTo(Student st) { //两个Student对象大小关系return (this.height-st.height);} } public class Example15_4 {public static void main(String args[ ]) { List<Student> list = new LinkedList<Student>();list.add(new Student("张三",188,86));list.add(new Student("李四",178,83));list.add(new Student("赵大龙",198,89)); list.add(new Student("李云龙",175,80));Iterator<Student> iter=list.iterator();System.out.println("排序前,链表中的数据:");while(iter.hasNext()){Student stu=iter.next();System.out.println(stu.name+ "身高:"+stu.height);}Collections.sort(list);System.out.println("排序(按身高)后,链表中的数据:");iter=list.iterator();while(iter.hasNext()){Student stu=iter.next();System.out.println(stu.name+ "身高:"+stu.height);}Student zhaoLin = new Student("zhao xiao lin",178,80);int index = Collections.binarySearch(list,zhaoLin,null);if(index>=0) {System.out.println(zhaoLin.name+"和链表中"+list.get(index).name+"身高相同.");}Collections.sort(list,(a,b)->{ return a.weight-b.weight;});System.out.println("排序(按体重)后,链表中的数据:");iter=list.iterator();while(iter.hasNext()){Student stu=iter.next();System.out.println(stu.name+ "体重:"+stu.weight);}index = Collections.binarySearch(list,zhaoLin,(a,b)->{ return a.weight-b.weight;});if(index>=0) {System.out.println(zhaoLin.name+"和链表中"+list.get(index).name+"体重相同.");}} }
15.2.5 洗牌与旋转
- 介绍:就是打乱顺序、轴对称数据和评议数据。
- 方法
- 随机顺序排序:
public static void shuffle(List<E>list)
- 转动:
static void rotate(List<E> list,int distance)
旋转链表中的数据,distance正数是向右旋转 - 翻转
public static void reverse(List<E>list)
123变为321
- 随机顺序排序:
- 例子
import java.util.*; public class Example15_5 {public static void main(String args[ ]) { List<Integer> list = new LinkedList<Integer>();for(int i=10;i<=50;i=i+10)list.add(i);System.out.println("洗牌前,链表中的数据");Iterator<Integer> iter=list.iterator();while(iter.hasNext()){int n=iter.next();System.out.printf("%d\t",n);}System.out.printf("\n");Collections.shuffle(list);System.out.printf("\n洗牌后,链表中的数据\n");iter=list.iterator();while(iter.hasNext()){int n=iter.next();System.out.printf("%d\t",n);}System.out.printf("\n");System.out.printf("\n向右旋转1次后,链表中的数据\n");Collections.rotate(list,1);iter=list.iterator();while(iter.hasNext()){int n=iter.next();System.out.printf("%d\t",n);}System.out.printf("\n");} }
15.3 堆栈
15.4 散类映射
15.5 树集
15.6 树映射
15.7 集合
15.8 举例应用
更多推荐
大学
发布评论