黑马程序员_集合

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

 

集合框架:

       |--Collection

              |--List

                     |--ArrayList

                     |--LinkedList

                     |--Vector

              |--Set

                     |--HashSet

                     |--TreeSet

 

这些容器对数据的存储方式的不同是他们之间最本质的区别

这个存储方式称之为:数据结构 

 

罗列了集合框架后不得要提一下集合的搭档:迭代器

 

迭代器

 

            格式:

                     Iterator ite =集合对象.iterator()

 

方式一:

Iterator ite = 集合对象.iterator();

while(ite.hasNext)

{

       sop(ite.next);

}


 

方式二:

for(Iterator ite = 集合对象.iterator(); ite.hasNext; )

{

       sop(ite.next);

}


 

方式二的好处:循环结束后释放Iterator

 

Collection

       List:元素是有序的,元素可以重复,因为该集合体系有索引

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

 

List

       特有方法:(凡是可以操作角标的方法都是该体系特有的方法)

       以下列举的是常见的

 

       

           add(index, element);

           addAll(index, Collection);

      

           remove(index);

     

           set(index, element);

     

          get(index);

          subList(from, to);

 

说起方法,这里详细介绍一个listIterator()方法:

ListIterator

List集合特有的迭代器:ListIteratorIterator的子接口

 

之所以在有Iterator的情况下又编写一个子类ListIterator是因为功能的扩展需要:

 

当我们用集合操作数据的同时又用迭代器操作集合中的数据,

容易引发并发修改异常,就像两只脚同时踹中一个足球一样,

所以同一个数据只能用一种方式来操作。

 

这样就有很大的限制

 

Iterator方法是有限的

只能对元素进行判断、取出、删除的操作

 

所以

 

如果想要其他的操作如添加、修改等,就需要使用其子接口,ListIterator

 

该接口只能通过List集合的listIterator方法来获取

                       格式:

                 ListIterator li = List集合对象.listIterator();

 

List集合具体对象的特点:

 

ArrayList:

底层的数据结构使用的是数组结构

 

特点:

查询速度快(按脚标查询当然快)

但是增删稍慢(插入一个元素,后面的元素的脚标都要往后挪,就像往一排麻将里插进一张牌,而且还是要一张一张挪的那种)

线程不同步

每次50%延长

 

LinkedList:

底层使用的是链表数据结构

 

特点:

增删速度快

查询速度稍慢

 

Vector:

底层是数组数据结构

 

特点:

线程同步

每次100%延长

(被ArrayList替换,开发时大多数都用)

 

List集合具体对象的应用:

 

Vector 

枚举就是Vector特有的取出方式,发现枚举和迭代器很像,其实枚举和迭代是一样的

 

因为枚举的名称以及方法的名称都过长,所以被迭代器取代了,枚举郁郁而终。

 

class VectorDemo

{

       	public static void main(String[] args)

	{

       		Vector v = new Vector();

       		v.add("java01");

       		v.add("java02");

       		Enumeration en = v.elments();

       		while(en.hasMoreElements())

		{

       			System.out.println(en.nextElements());

		}
	
	}

}

 

LinkList

 

LinkList特有方法JDK1.6以前:

       addFirst();

       addLast();

      

       getFirst();

       getLast();

             获取元素,但不删除元素,如果集合中没有元素,会出现NoSuchElementException

 

       removeFirst();

       removeLast();

             获取元素,但是元素被删除,如果集合中没有元素,会出现NoSuchElementException

 

JDK1.6出现了替代方法:

       offerFirst();

       offerLast();

 

       peekFirst();

       peekLast();

             获取元素,但不删除元素,如果集合中没有元素,会返回null

 

       pollFirst();

       pollLast();

             获取元素,但是元素被删除,如果集合中没有元素,会返回null

 

模拟队列:先进先出

 

class DuiLie

{

       	private LinkedList link;

       	DuiLie()

	{

       		link = new LinkedList();

	}

	public void set(Object obj)

	{

       		link.addFirst(obj);

	}

	public Object get()

	{

       		return link.removeLast();

	}

	public boolean isNull()

	{

       		return link.isEmpty();

	}

}

class Demo

{

       	public static void main(String[] args)

	{

       		DuiLie dl = new DuiLie();

       		dl.set("java01");

       		dl.set("java02");

       		dl.set("java03");

       

       		while(!dl.isNull())

		{

       			System.out.println(dl.get());

		}

	}

}

 

ArrayList

 

去除ArrayList中重复的元素

 

class Demo

{

       	public static void main(String[] args)

	{

       

	}

	public static ArrayList singleArrayList(ArrayList list)

	{

       		ArrayList newAl = new ArrayList();

       		ListIterator ite = list.listIterator();

       		while(ite.hasNext())

		{

       			Object obj = ite.next();

       			if(!newAl.contains(obj))

              			ite.add(obj);

		}

		return newAl;

	}

}

 

因为contains方法底层靠的是equals为准的

所以再写一个类,并且覆盖equals方法,自定义规则

class Person

{

       	private String name;

       	private int age;

       	Person(String name, int age)

	{

       		this.name = name;

       		this.age = age;

	}

	public String getName()

	{

       		return this.name;

	}

	public int getAge()

	{

       		return this.age;

	}

	public boolean equals(Object obj)

	{

       		if(obj intanceof Person)

              		return false;

       		Person p = (Person)obj;

       		return p.name.equals(this.name) && p.age == this.age;

	}

}

class Demo

{

       	public static void main(String[] args)

	{

       

	}

	public static ArrayList singleArrayList(ArrayList list)

	{

       		ArrayList newAl = new ArrayList();

       		ListIterator ite = list.listIterator();

       		while(ite.hasNext())

		{

       			Object obj = ite.next();

       			if(!newAl.contains(obj))

              			ite.add(obj);

		}

		return newAl;

	}

}

 

Set

元素是无序的(存入和取出的循序不一定一致),元素不可以重复

 

HashSet:

底层数据结构是哈希表(哈希表的特点:唯一性)

 

HashSet是如何保证元素唯一性的呢?

                    是通过元素的两个方法:hashCode()equals()来完成的

                    如果元素的HashCode值相同,才会判断equals是否为true

                    如果元素的HashCode值不同,才会调用equals

 

                    注意:   对于判断元素是否存在,以及删除等操作,依赖的方法是元素的

                                   hashCodeequlas方法

                                   先比hashCode()再比equals()

 

class Student

{

       	private String name;

       	private int age;

       	Student(String name,int age)

	{

       		this.name = name;

       		this.age = age;

	}

	public Stirng getName()

	{

       		return this.name;

	}

	public int getAge()

	{

       		return this.age;

	}

	public int hashCode()

	{

       		return this.name .hashCode()+ this.age*37;

	}

	public boolean equals(Object obj)

	{

       		if(!(obj instanceof Student))

              		throw new ClassCastException(“类型不匹配”);

       		Student stu = (Student)obj;

       		return this.name.equals(stu.name) && this.age == stu.age;

	}

	public void toString()

	{

       		System.out.println(“[”+this.name+”,”+this.age+”]”);

	}

}


 

 

TreaSet

底层数据结构是二叉树 

 

可以对Set集合中的元素进行排序

 

排序时,当主要条件相同时,一定要判断一下次要条件

底层数据结构是二叉树

保证元素唯一性的依据

compareTo方法return 0,则该对象不存储进Set集合

 

TreeSet排序的第一种方式:

              让元素自身具备比较性

             元素需要实现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 age;
	}
	public int compareTo(Object obj)
	{
		if(!(obj intanceof Student))
			throw new RuntimeException(“不是学生对象”);
		Student s = (Student)obj;
		if(this.age > s.age)
			return 1;
		if(this.age == s.age)
		{
			return this.name.comparaTo(s.age);
		}
		return -1;
	}
}


 

TreeSet排序的第二种方式:

 

              当元素自身不具备比较性时,或者具备的比较性不是所需要的

              这时就需要让集合自身具备比较性

              在集合初始化时,就有了比较方式

 

第二种方式:
实现Comparator方式排序

class MyCmpara implements Comparator
{
	public int compare(Object o1, Object o2)
	{
		Student stu1 = null;
		Student stu2 = null;
		if((o1 instanceof Student) && (o2 instanceof Student))
		{
			stu1 = (Student)o1;
			stu2 = (Student)o2;
		}
		int num = stu1.getName().compareTo(stu2.getName());
		if(num == 0)
			return new Integer(stu1.getAge()).compareTo(new Integer(stu2.getAge()));
		return num;
	}
}


第一种方式是属于默认元素排序,第二种方式与第一种方式同时使用时,第二种覆盖第一种

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值