集合框架(一)

本文深入探讨了集合框架中的核心概念,包括List、Set及其迭代器的使用,并详细介绍了HashSet和TreeSet的工作原理及实现方式。同时,文章还阐述了如何在实际场景中灵活运用这些集合类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合框架介绍

Collection

          |-----List:元素是有序的,元素可以重复,因为该结婚体系有索引

                  |-----ArrayList:底层数据结构使用的是数组结构;线程不同步JDK1.2。特点是查询快,增删慢

                  |-----LinkedList:底层使用的是链表数据结构;特点是增删慢,查询快

                  |-----Vector:底层是数据数据结构;是线程同步的。JDK1.0被ArrayList替代。(一般不用了)

         |-----Set:元素是无序的,元素不可以重复

                  |-----HashSet:底层数据结构是哈希表,线程非同步的;

                  |-----TreeSet:可以对Set集合中的元素进行排序,底层数据结构是二叉树;

 

迭代器:用于取出元素的方式

该取出方式被定义成为了内部类,而每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都是共性内容判断和取出,那么可以将共性抽取。

这些内部类都符合一个规则,该规则是Iterator。通过iterator();方法获取。

 

List集合特有的迭代器,ListIterator是Iterator的子接口,在迭代时,不可以通过集合中的方法操作集合中的元素,因为会发生异常,

所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素进行判断,取出,删除操作

如果想要其他的操作,如添加、删除等,就需要使用其自接口ListIterator。该接口只能通过List的listIterator();方法获取,因为其中的元素都含有角标

		ArrayList al = new ArrayList();
		
		al.add("java01");
		al.add("java02");
		al.add("java03");
		al.add("java04");	
		for(ListIterator li = al.listIterator(); li.hasNext();)
		{
			Object obj = li.next();
			if(obj.equals("java02"))
			{
				li.set("java002");
				li.add("java003");
			}
		}

 

HashSet

HashSet是通过两个方法来确保元素的唯一性:hashCode和equals方法来完成的

如果hashCode值相同,才会判断equals是否为true;如果hashCode值不同,才会调用equals方法来进一步判断;

所以,当使用HashCode结构来存储自定义对象的时候,需要覆写hashCode和equals方法。对于判断元素是否存在、删除等操作的时候,一拉的方法是元素的着两个方法。

 

TreeSet

底层数据结构是二叉树,保证元素的唯一性一局是compareTo方法,元素必须具备可比性;

第一种:让元素自身具备比较性;元素需要实现Comparable接口,覆盖compareTo方法,这种方式也成为元素的自然顺序,或者叫做默认顺序

//使对象自身具备比较性
class Student implements Comparable
{
	private String name;
	private int age;
	Student(String name, int age)
	{
		this.name = name;
		this.age = age;
	}
	public String getName()
	{
		return this.name;
	}
	public int getAge()
	{
		return this.age;
	}
	public int compareTo(Object obj)
	{
		if(obj instanceof Student)
			throw new RuntimeException("不是学生对象!");
		Student s = (Student)obj;
		if(this.age > s.age)
			return 1;
		else if(this.age == s.age)
			return 0;
		else
			return -1;
	}
}

 

第二种:当元素自身不具备计较性,或者具备的比较性不是所需要的,这时就让需要让集合自身具备比较性。在集合初始化时,就有了比较方式(参阅构造函数)

 

//自定义比较器类,实现比较方法接口
class MyCompare implements Comparator
{
	public int compare(Object o1, Object o2)
	{
		Student s1 = (Student)o1;
		Student s2 = (Student)o2;
		int num = s1.getName().compareTo(s2.getName());
		if(num == 0)
		{
			if(s1.getAge() > s2.getAge())
				return 1;
			else if(s1.getAge() == s2.getAge())
				return 0;
			else
				return -1;
		}
		return num;
	}
}
TreeSet ts = new TreeSet(new MyCompare());//初始化的同时,使容器自身具备比较性

两种都存在时,以比较器为主。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值