JAVA基础: 泛型

泛型

泛型是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();

println

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值