JAVA基础初探(十一)List接口及其实现类(ArrayList)、泛型详解、Set接口及其两个常用实现类(HashSet、TreeSet)

本文深入讲解了Java集合框架中的List接口及其ArrayList实现类的特点与应用,包括泛型的使用、构造方法中的泛型、多个泛型设置等概念,并介绍了Set接口的两个实现类HashSet和TreeSet的使用方法。

该篇博客目录

1、List接口及其实现类(ArrayList)
2、泛型(概述、构造方法中使用泛型、设置多个泛型、通配符、泛型接口、泛型方法、泛型数组)
3、Set接口及其两个常用实现类(HashSet、TreeSet)

一、List接口及其实现类(ArrayList)

1、List接口概述
  • List是元素有序且可以重复元素的集合,被称为序列
  • List可以精确的控制每个元素的插入位置,或删除某个位置的元素
2、List的常用实现类————ArrayList
  • ArrayList称为数组序列,是List的一个重要实现类,使用频率最高(List还有其他实现类,可参考api)
  • ArrayList底层是由数组实现的(查询快,增删慢)
  • 线程不安全,效率高
3、ArrayList常用方法(具体可参考api)
package Collection_eg;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Coll {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
            //创建对象
            ArrayList obj=new ArrayList();
            obj.add("xlj");
            obj.add("hahaha");

            Iterator it=obj.iterator();
            while(it.hasNext())
            {
                System.out.println(it.next());
            }

            for(int i=0;i<obj.size();i++)
            {
                System.out.println(obj.get(i));
            }

    }

}

这里写图片描述

4、List——ArrayList进行选课功能(添加、删除、修改、遍历)Demo

Course类

package project3;

public class Course {
    private String id;
    private String name;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

test测试类

package project3;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class test {
    public List ToChoiceCourse;

    //添加课程
    public void AddCourse()
    {
        Course a=new Course();
        a.setId("1");
        a.setName("java课程");
        ToChoiceCourse.add(a);
        Course temp=(Course)ToChoiceCourse.get(0);
        System.out.println("成功插入课程:"+temp.getId()+":"+temp.getName());

        Course b=new Course();
        b.setId("2");
        b.setName("C课程");
        ToChoiceCourse.add(b);
        Course temp2=(Course)ToChoiceCourse.get(1);
        System.out.println("成功插入课程:"+temp2.getId()+":"+temp2.getName());

        System.out.println("此时的课程:");
        IteratorCourse();
    }

    //删除课程
    public void RemoveCourse()
    {
        ToChoiceCourse.remove(0);
        System.out.println("成功删除课程1");

        System.out.println("此时的课程:");
        IteratorCourse();
    }

    //修改课程
    public void ChangeCourse()
    {
        Course Mod=new Course();
        Mod.setId("1222");
        Mod.setName("高数");
        ToChoiceCourse.set(0, Mod);
        System.out.println("成功修该课程2");

        System.out.println("此时的课程:");
        IteratorCourse();
    }


    //遍历课程
    public void IteratorCourse()
    {
        Iterator it=ToChoiceCourse.iterator();
        while(it.hasNext())
        {
            Course cos=(Course)it.next();
            System.out.println(cos.getId()+":"+cos.getName());
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        test op=new test();
        op.ToChoiceCourse=new ArrayList();
        op.AddCourse();
        op.RemoveCourse();
        op.ChangeCourse();

    }

}

这里写图片描述


二、泛型(概述、构造方法中使用泛型、设置多个泛型、通配符、泛型接口、泛型方法、泛型数组)

1、泛型概述
  • 泛型是JDK1.5之后增加的新功能
  • 泛型可以解决数据类型的安全性问题(泛型可以避免类型转换问题)
  • 泛型主要原理:是在类声明的时候通过一个标识(常用T,K标识)表示类中某个属性的类型或者某个方法的返回值及参数类型
2、格式(泛型类)
访问权限 class 类名<泛型标识,泛型标识....>
{
    属性
    方法
}
3、对象的创建
//这里具体类型指包装类名
类名<具体类型> 对象名=new 类名<具体类型>();
4、泛型用法Demo

test_ppop为泛型的类

package p4;

public class test_ppop<T> {
    private T x;
    private T y;
    public T getX() {
        return x;
    }
    public void setX(T x) {
        this.x = x;
    }
    public T getY() {
        return y;
    }
    public void setY(T y) {
        this.y = y;
    }
}

test测试类

package p4;

public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //指定泛型为int类型
        test_ppop<Integer> obj=new test_ppop<Integer>();
        obj.setX(1);
        obj.setY(2);
        System.out.println(obj.getX()+"-"+obj.getY());

        //指定泛型为String类型
        test_ppop<String> obj2=new test_ppop<String>();
        obj2.setX("12");
        obj2.setY("99");
        System.out.println(obj2.getX()+"-"+obj2.getY());
    }

}

这里写图片描述

5、构造方法中使用泛型

与普通构造方法一样使用

class Demo<T>{
    private T Value;
    public Demo(T Value)
    {
        this.Value=Value;
    }
}
6、设置多个泛型
  • 直接在<>中添加多个泛型标识,每个泛型用逗号隔开
  • 如以下的Demo

test_ppop为泛型的类

package p4;

public class test_ppop<K,T> {
    private T a;
    private K b;
    public T getA() {
        return a;
    }
    public void setA(T a) {
        this.a = a;
    }
    public K getB() {
        return b;
    }
    public void setB(K b) {
        this.b = b;
    }
}

test测试类

package p4;

public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        test_ppop<String,Integer> obj=new test_ppop<String,Integer>();
        obj.setA(9999);
        obj.setB("hello");
        System.out.println(obj.getA()+"-"+obj.getB());
    }

}

这里写图片描述

7、泛型中的通配符
a、概述:通配符为了解决类型被限制死了,不能动态根据实例来确定的缺点
b、通配符三大类
  • 无边界的通配符(Unbounded Wildcards), 就是
c、先看下面一个例子

test_ppop为泛型的类

package p4;

public class test_ppop<T> {
    private T a;

    public T getA() {
        return a;
    }

    public void setA(T a) {
        this.a = a;
    }
}

test测试类

package p4;

public class test {

    public static void ff(test_ppop<Object> i)
    {
        System.out.println(i);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        test_ppop<String> i=new test_ppop<String>();
        i.setA("hello");
        ff(i);
    }

}

如上定义了一个ff方法,因为无法知道泛型是什么类型,所以就用了Object类型。

这里写图片描述

但是可以发现,编译报错,ff的参数类的泛型是Object类型,而实例中是String类型,两者不匹配

解决方法1(不推荐):方法中的参数不使用泛型(会有警告,不符合规范)

这里写图片描述

解决方法2(推荐):使用通配符< ?>

这里写图片描述

8、泛型接口
a、概述:在JDK1.5之后,不仅仅可以声明泛型类,还可以声明泛型接口,声明泛型接口与泛型类差不多,即在接口名后加上
b、格式
interface 接口名<泛型标识>{}
c、Demo

泛型接口pppppp

package p4;

public interface pppppp<T> {
    public void play();
}

接口实现类ioio

package p4;

public class ioio<T> implements pppppp<T> {
    private T str;
    public ioio(T str)
    {
        this.str=str;
    }

    public T getStr() {
        return str;
    }

    public void setStr(T str) {
        this.str = str;
    }

    public void play() {

    }
}

测试类

package p4;

public class test {
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ioio<String> obj=new ioio<String>("hello");
        System.out.println(obj.getStr());
    }

}

这里写图片描述

9、泛型方法
a、概述:泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据类型
b、格式(第二个泛型标识地方,如果返回是void可直接写void)
权限访问 <泛型标识>泛型标识 方法名(泛型标识 参数名){}
c、Demo

含泛型方法的类Gener

package p4;

public class Gener {
    public <T>T play(T t)
    {
        return t;
    }
}

test测试类

package p4;

public class test {


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Gener obj=new Gener();
        //可以传递任意类型
        //String类型
        String str=obj.play("hehehe");
        System.out.println(str);

        //int类型
        int a=obj.play(2);
        System.out.println(a);
    }

}

这里写图片描述

10、泛型数组
a、概述:在使用泛型方法的时候,也可以传递或返回一个泛型数组
b、Demo
package p4;

public class test {

    public static <T>void play(T arr[])
    {
        for(int i=0;i<arr.length;i++)
        {
            System.out.println(arr[i]);
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //指定数组是String类型
        String arr[]= {"ss","vv","mm"};
        play(arr);

        //指定数组是int类型(需要设定Integer)
        Integer arr2[]= {1,2,3,4,5};
        play(arr2);
    }

}

这里写图片描述


三、Set接口及其两个常用实现类(HashSet、TreeSet)

1、概述

Set接口中不能加入重复元素,但可以排序。而List能重复且可排序

这里写图片描述

api里可以看出Set是定义为泛型的(当然其他集合也是),所以之后多用泛型

2、Set接口常用实现类(HashSet、TreeSet)
  • 散列存放:HashSet
  • 有序存放:TreeSet
3、HashSet(无序)(原理是内部用了一张哈希表,所以偶然有序也有可能)
package p4;

import java.util.HashSet;
import java.util.Set;

public class SetDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Set<String> s=null;//指定泛型
        s=new HashSet<String>();//实例话HashSet
        s.add("B");
        s.add("A");
        s.add("P");
        s.add("O");
        System.out.println(s);
    }

}

这里写图片描述

4、TreeSet(有序)(自动排列大小)
package p4;

import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class SetDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Set<String> s=null;//指定泛型
        s=new TreeSet<String>();//实例话TreeSet
        s.add("B");
        s.add("A");
        s.add("P");
        s.add("O");
        System.out.println(s);
    }

}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值