Java中Collection接口及其子接口List、Set

一、Collection集合接口
Collection是单个集合保存的最大父接口。Collection接口的定义:
public interface Collection<E> extends Iterable<E>

此接口的常用方法如下:


Collection接口定义:


二、List接口

1.List接口中两个重要的扩充方法:


2.List接口下有三个常用子类:ArrayList、Vector、LinkedList


3.ArrayList子类
ArrayList是一个针对于List接口的数组实现。List允许保存重复数据。

如:List的基本操作

public class Test {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		System.out.println(list.size() + "," + list.isEmpty()); //查看list的大小,list是否为空
		list.add("hello");
		list.add("hello");
		list.add("world");
		System.out.println(list.size() + "," + list.isEmpty());
		System.out.println(list);  //打印list
		System.out.println(list.remove("hello"));  //删除hello
		System.out.println(list.contains("ABC"));  //查看list是否包含ABC;若包含,返回true;否则,返回false
		System.out.println(list.contains("world"));  //查看list是否包含world;若包含,返回true;否则,返回false
		System.out.println(list);  //打印list
		
		//利用get()结合索引取得数据
		for(int i = 0;i < list.size();i++) {
			System.out.println(list.get(i));
		}
		
	}
}

如:集合与简单Java类

class Person{
	private String name;
	private int age;
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}
public class Test{
	public static void main(String[] args) {
		List<Person> pList = new ArrayList<>();
		pList.add(new Person("小明", 10));
		pList.add(new Person("小李", 20));
		pList.add(new Person("小王", 30));
		
		//集合类中的contains()、remove()方法需要equals()支持
		System.out.println(pList.remove(new Person("小王", 30)));
		System.out.println(pList.contains(new Person("小吴", 10)));
		for (Person person : pList) {
			System.out.println(person);
		}
	}
}
4.子类Vector

如:使用Vector

public class Test{
	public static void main(String[] args) {
		List<String> list = new Vector<>();
		list.add("A");
		list.add("A");
		list.add("B");
		list.add("C");
		System.out.println(list);
		list.remove("C");
		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。
5.子类LinkedList

如:使用LinkedList

public class Test{
	public static void main(String[] args) {
		List<String> list = new LinkedList<>();
		list.add("A");
		list.add("B");
		list.add("C");
		System.out.println(list);
		list.remove("A");
		System.out.println(list);
	}
}
注意:ArrayList与LinkedList的区别
(1)ArrayList由数组实现;
(2)LinkedList由链表实现。
四、Set集合接口
1.Set接口与List接口最大的不同在于Set接口中的内容是不允许重复的。同时,Set接口中没有get()方法。

在Set子接口中有两个常用子类:HashSet(无序存储)、TreeSet(有序存储)。


如:HashSet使用

public class Test{
	public static void main(String[] args) {
		Set<String> set = new HashSet<>();
		set.add("A");
		set.add("A");
		set.add("B");
		set.add("C");
		System.out.println(set);  //输出:[A, B, C]
	}
}

如:TreeSet使用

public class Test{
	public static void main(String[] args) {
		Set<String> set = new TreeSet<>();
		set.add("D");
		set.add("A");
		set.add("B");
		set.add("A");
		set.add("C");
		System.out.println(set);  //输出:[A, B, C, D]
	}
}
TreeSet使用的是升序进行排列。
2.TreeSet排序
利用TreeSet进行对象数组的排序,对象所在的类要实现Comparable接口,并且覆写compareTo()方法。如果使用Comparable接口进行大小关系匹配,所有属性必须全部进行比较操作。

如:使用TreeSet排序

class Person implements Comparable<Person>{
	private String name;
	private int age;
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public int compareTo(Person o) {
		if(this.age > o.age) {
			return 1;
		}else if(this.age < o.age) {
			return -1;
		}else {
			return this.name.compareTo(o.name);
		}
	}
}
public class Test{
	public static void main(String[] args) {
		Set<Person> set = new TreeSet<>();
		set.add(new Person("李四", 10));
		set.add(new Person("张三", 10));
		set.add(new Person("张三", 10));
		set.add(new Person("王五", 5));
		System.out.println(set);  //输出:[Person [name=王五, age=5], Person [name=张三, age=10], Person [name=李四, age=10]]
	}
}
3.使用HashSet
HashSet判断重复元素的方式依靠的是Object类中的两个方法:
(1)hash码:public native int hashCode();
(2)对象比较:public boolean equals(Object obj);
在Java中进行对象比较的操作有两步:第一步要通过一个对象的唯一编码找到一个对象的信息,第二步当编码匹配之后再调用equals()方法进行内容的比较。

如:使用hashCode()与equals()消除重复

class Person{
	private String name;
	private int age;
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
public class Test{
	public static void main(String[] args) {
		Set<Person> set = new HashSet<>();
		set.add(new Person("李四", 10));
		set.add(new Person("张三", 10));
		set.add(new Person("张三", 10));
		set.add(new Person("王五", 5));
		System.out.println(set);  //输出:[Person [name=李四, age=10], Person [name=张三, age=10], Person [name=王五, age=5]]
	}
}
4.总结
(1)HashSet:无序存储,允许null,有且只有一个null;判断重复,需要覆写Object中的hashCode()以及equals()方法;只有两个对象的hashCode()以及equals()方法均返回true才认为两者相等。
(2)TreeSet:有序存储,不允许为null;如果要进行自定义类作为TreeSet存储,该类必须覆写Comparable接口
(3)Comparable:public int compareTo(Object o),类中所有属性都要参与运算
当>0,表示当前对象大于比较对象;
当=0,表示当前对象等于比较对象;
当<0,表示当前对象小于比较对象;
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值