Java类集 之Collection接口及其子类List、Set接口的使用

Java 类集

类集本质上属于动态对象数组,数组有一个最大的缺陷就是长度固定,所有Java类集框架就是为了解决数组长度问题。数据结构中最基础的就是链表

先来回顾一下链表的特点:
1、节点关系的处理操作,核心需要一个Node类用来保存数据、设置索引
2、进行链表数据的查找、删除时需要equals()方法支持

Collection集合接口

Collection接口是单个集合保存的最大父接口,每一次进行数据操作时只能对单个对象进行处理
从JDK1.5开始发现Collection接口上追加有泛型应用,这样的直接好处就是可以避免ClassCastException,里面的所有数据的保存类型应该是相同的。

Collection接口使用:

	Collection<String> collection = new ArrayList<>();
	collection.add("Java");//增加
	collection.add("C++");
	collection.add("PHP");
	
	Object[] values = collection.toArray();
	for (Object value : values){
	   System.out.println(value);
	}
	//toString
	System.out.println(Arrays.toString(values));

在开发过程中很少直接使用Collection接口,往往考虑Collection接口的子接口:List(允许数据重复)、Set(不允许数据重复)

1、List接口

List本身还是接口,要想取得接口的实例化对象,就必须有子类,在List接口下有三个常用子类:ArrayList、Vector、LinkedList

ArrayList子接口的使用

	List<String> list = new ArrayList<>();
	list.add("java");//增加
	list.add("C++");
	list.add("Java");
	list.add(0,"PHP");//指定位置增加
	list.add(2,"Python");
	//判断
	System.out.println("原List"+list);
	System.out.println(list.isEmpty());//判断链表是否为空
	System.out.println(list.size());//获取长度
	System.out.println(list.contains("PHP"));//判断是否含有特定元素
	System.out.println(list.remove("Java"));//删除
	System.out.println(list.remove(1));//删除指定位置

	//获取 0<= index <= size()-1
	System.out.println(list.get(2));//获取指定位置元素
	System.out.println(list);//打印输出

向集合保存简单Java类对象:集合操作简单Java类时,对于remove()、contains()方法需要equals()方法支持

class Person {
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) &&
                Objects.equals(age, person.age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("张三", 10));
        personList.add(new Person("李四", 11));
        personList.add(new Person("王五", 12));
        // 集合类中contains()、remove()方法需要equals()支持
        personList.remove(new Person("李四", 11));
        System.out.println(personList.contains(new Person("王五", 12)));
        for (Person p : personList) {
            System.out.println(p);
        }
    }
}

Vector子接口的使用

   public static void main(String[] args) {
        List<String> list = new Vector<>();
        list.add("hello");
        list.add("world");
        list.add("!!!");
        System.out.println(list);
        list.remove("hello");
        System.out.println(list);
    }

常见面试题:请解释ArrayList和Vector的区别
1、历史时间:ArrayList是JDK1.2提供的,Vector是JDK1.0提供的
2、处理形式:ArrayList是异步处理,性能高;Vector是同步处理,性能较低
3、数据安全:ArrayList是非线程安全;Vector线程安全
4、**输出形式:**ArrayList 支 持 Iterator 、 ListIterator 、 foreach;Vector 支 持 Iterator 、 ListIterator 、 foreach 、Enumeration。

LinkedList子接口的使用

    public static void main(String[] args) {
        //LinkedList双向链表
        List<String> list = new LinkedList<>();
        list.add("Java");
        list.add("C++");

        list.add(1,"PHP");
        System.out.println(list.size());
        System.out.println(list.contains("Java"));
        System.out.println(list.remove("C++"));

    }

2、Set集合接口

Set接口与List接口最大的区别在于Set接口中内容不允许重复
Set接口中有两个常用子类:HashSet(无序存储)、TreeSet(有序存储)

HashSet使用:

    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Java");//增加
        set.add("C++");
        set.add("PHP");
        set.add("C++");
        //set元素不能重复 无序
        System.out.println(set.size());//获取长度
        System.out.println(set.contains("Java"));//判断是否含有指定元素
        System.out.println(set.remove("C++"));//删除元素
        System.out.println(set);
    }

TreeSet使用

 public static void main(String[] args) {
     Set<Integer> set = new TreeSet<>();
     set.add(27);
     set.add(13);
     set.add(33);
     set.add(21);
     set.add(43);
     //打印输出升序

     //两种方式
     //1.元素必须能够排序,实例化元素的类型需要实现Comparable接口
     //2.构造TreeSet时指定Comparator的实例化对象

     System.out.println(set);
     Set<String> set1 = new TreeSet<>();
     set1.add("Java");
     set1.add("APP");
     set1.add("C++");
     System.out.println(set1);
 }

猜你喜欢

转载自blog.csdn.net/ly52014/article/details/89489667
今日推荐