泛型
泛型是javaSE 1.5 的新特性,泛型的本质是参数化类型,
这种参数类型可以用在类\接口\方法的创建中,
分别成为泛型类\泛型接口\泛型方法.
为什么用泛型
编译的时候检查类型安全,并且所有的强制转换自动和隐式的,
提高代码的重用率.
泛型的表示:
<任意的大写字母>
省去了强制转换的麻烦(向下转型)
类的泛型
public class Worker(T){
//成员变量的泛型
private T t;
public T getT(){
return t;
}
public T setT(){
this.t=t;
}
//成员方法的泛型:调用方法的时候需要创建这个<W>这个泛型类;
public <W> void sayHi(W w){
System.out.println(w);
}
//静态方法的泛型:静态方法随着类的加载而加载<T>
//这个<T>是静态方法自己的泛型
public static<T> void print(T t){
}
}
接口的泛型:直接在接口名后面声明泛型
interface InterA<T>{
public abstract void show(T t);
}
class InterAImpl implments InterA<String>{
//重写接口中的方法
public void show(String t){
System.out.println(t)
}
}
需求:声明一个集合保存abcd,并用迭代器遍历
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
//获取list遍历器
ListIterator<String> listiterator = list.listiterator();
//创建while循环
//正向遍历
while(listiterator.hasNext()){
String next = listiterator.next();
System.out.println(next);
}
//逆向遍历
while(listiterator.hasPrevious){
String previous = listiterator.previous();
System.out.println(previous);
}
需求:集合中保存3个学生对象,用迭代器遍历(使用泛型)
ArrayList<Student> list = new ArrayList<Student>();
list.add(new Student("张三",12));
list.add(new Student("李四",13));
list.add(new Student("王二",14));
//获取list迭代器
Iterator<Student> iterator = list.Iterator();
//循环
while(iterator.hasNext){
//获取迭代器的值
Student stu = iterator.next();
System.out.println(stu.getName);
}
需求:创建两个集合Student和Person,每个集合里面个添加2人,并两个集合互相添加里面的元素
ArrayList<Person> list1 = new ArrayList();
list1.add(new Person("张三",56));
list1.add(new Person("李四",66));
ArrayList<Student> list2 = new ArrayList();
list2.add(new Student("王五",13));
list2.add(new Student("赵四",16));
list1.addAll(list2);
System.out.println(list1);
删除的三种方式(遍历的三种方法)
ArrayList<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("b");
strings.add("d");
//不适用迭代器遍历,用for循环(strings.get(i))
//如果集合中有"b"就删除它
for (int i = 0; i < strings.size(); i++) {
if (strings.get(i).equals("b")) {
//i--表示每次删除后都把坐标回调一次,为了保证删除后也能遍历到数组每一个元素;
strings.remove(i--);
}
System.out.println(strings.get(i));
}
迭代器删除
//如果要添加元素,要使用list中特有的迭代器
//Listiterator
ArrayList<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("d");
Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()) {
String next = (String) iterator.next();
if (iterator.next().equals("b")) {
//让迭代器去删除
iterator.remove();
}
}
System.out.println(strings);
ArrayList<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("d");
//冒号后,是要遍历的容器
//冒号前,是你要遍历的容器中每一种元素
//增强for循环的底层是用迭代器实现的
//一般只用来打印,不要做删除的操作
for (String string : strings) {
System.out.println(string);
}
collection 中的 sort (list) 方法
系统自动提供了排序方法,但是里面没有具体的排序规则,所以这是系统有提供了一个接口,让你去实现这儿接口,接口中需要写排序规则(回调思想)
集合中有什么对象,就让该对象去实现这个接口
使用collections中的sort方法排序步骤
1.让集合中被排序的对象的类,去实现comparable接口
2.实现接口中的抽象方法(排序是按什么规则的方法)
3.编写排序规则
4.调用collections.sort测试
需求:创建一个人物集合并添加五个人物姓名和年龄,先把人物按年龄进行排序,再把人物按着姓名再排序
使用collections中的sort方法并创建排序方法:
@Override
public int compareTo(Student o) {
System.out.println("测试");
// 返回0 两个值相等
// 返回整数 前面的大
// 返回负数 后面的大
// 明确:谁和谁比较 this 和 o
按年龄
return (this.getAge() - o.getAge());
//这里调用的compareTo是谁的方法?是字符串的方法
按姓名首字母
return this.getName().compareTo(o.getName());
}
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("奥巴马",56));
students.add(new Student("奥朗德",53));
students.add(new Student("小布什",52));
students.add(new Student("林肯",51));
students.add(new Student("特朗普",55));
//调用系统的排序方法(底层调用了你实现接口中的排序规则方法)
Collections.sort(students);
System.out.println(students);
需求:一个小型图书馆里面存放了三类书:言情\武侠\穿越.每个分类里面都有两本书,每本书都有不同的页数.
//用泛型 library\kind\book
ArrayList<ArrayList<Book>> library = new ArrayList();
//创建小集合把书装进小集合
ArrayList<Book> kind1 = new ArrayList();
kind1.add(new Book("金瓶梅",900));
kind1.add(new Book("红楼梦",800));
ArrayList<Book> kind2 = new ArrayList();
kind2.add(new Book("三国演义",950));
kind2.add(new Book("水浒传",860));
ArrayList<Book> kind3 = new ArrayList();
kind3.add(new Book("霸道总裁和美女秘书",990));
kind3.add(new Book("李世民后宫传奇",930));
//然后把按种类把书放进图书馆里面
library.add(kind1);
library.add(kind2);
library.add(kind3);
for(ArrayList<Book> kinds : library){
for(Book book : kinds)
System.out.println(book);
}
System.out.println();