11 集合(上)

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

						集合(上)


1、集合概念
    为什么出现集合类:
	在面向对象的编程思想中,都是以对象的形式对事物进行描述的,为了保证对象的生命周期,我们需要持有对象
	在很多情况下,我们不知道在程序中需要创建多少个对象,这时就不能依靠定义引用对象的变量来持有每一个对象
	所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。

  数组和集合类的区别:
	*数组也可以存储对象,但长度是固定的;集合长度是可变的。
	*数组中可以存储基本数据类型,集合只能存储对象。

  集合类的特点:
	集合类只用于存储对象
	集合类的长度可变
	一个集合可以存储多种类型的对象

    集合类详解:
	JDK为我们提供了一套完整的容器类库,这些容器可以用于存储各种类型的对象,并且长度都是可变的,
	我们把这些类统称为集合类,它们都位于java.util包中。
	整个集合类按照存储的结构被分为单列集合和双列集合:
	    *单列集合的根接口是Collection:一个独立的元素的序列,这些元素服从一条或多条规则
	        |--List(列表)集合的特点是元素有序、包含重复元素。
		|--Set(集)集合的特点是元素无序、不包含重复元素。
	    *双列集合的根接口是Map:存储的是键值映射关系,一组成对的”键值对”对象,允许根据键来查找值。
		Map集合的键不允许有重复,所以Map集合的所有key键构成了一个Set集合。
		|--HashMap
		|--TreeMap。


2、collection的功能:
    当容器多了以后,每一个容器因为数据结构的不同,分出了很多容器。那么这些都具备一些共性的特点
    出现上向抽取。最终顶层类或者接口中定义的就是集合框架的共性方法。这个顶层接口之一就是Collection
    collection是接口,不能创建对象,所以通过子类,如ArrayList来创建对象。
	例:collection c = new ArrayList();
	boolean add();				//添加元素
	boolean addAll(collection对象)		//添加一堆元素
	boolean remove();			//删除元素
	boolean removeAll(collection对象)	//删除调用对象中与传入对象相同的元素
	void clear();				//清空
	int size();				//获取元素个数
	boolean retainAll(collection对象)	//获取两个集合的交集,调用者存的是两个对象交集的元素
	boolean isEmpty();			//判断是否是空
	boolean contains();			//判断某个元素是否在集合中
	boolean containsAll(collection对象)	//判断一堆元素是否存在
	开发是把集合元素取出来,要么挨个判断,要么列在网页上,不是简单的输出


3、List集合
    可存放重复元素,元素存取是有序的。

    List集合中特有方法:
	    添加功能:
		boolean list.add(String item);	//向list里添加元素
		void list.add(index,String item)//在index索引位插入元素 item.其他元素依次顺延,
	    删除功能:
		boolean list.remove(String item)//删除元素item,有返回真,没有返回假
		boolean list.remove(int index)	//根据索引位(角标)index删除元素,会把删除的元素返回
	    修改功能:
		E list.set(int index, E element)//对指定索引index位置的元素进行修改。返回传入元素.
	    获取功能:
		List List subList(int fromIndex, int toIndex)//根据指定的头(fromIndex)尾(toIndex)
								角标获取子列表
		E list.get(int index)		//通过索引位(角标)获取到对应的元素
			for(int x=0; x<list.size(); x++) {
				System.out.println(list.get(x));	
			}

    List接口中的常用类:
	Vector:底层数据结构是数组结构,线程安全,但速度慢,已被ArrayList替代。
	    Vector中提供了一个独特的元素取出方式,就是枚举Enumeration。
		此接口Enumeration的功能与 Iterator 接口的功能是重复的
		通过Enumeration的hasMoreElements()方法判断是否还有元素
		通过Enumeration的nextElement()方法返回下一个元素
	    Enumeration的名称和方法的名称过程,书写很麻烦。所以被Iterator所取代
	ArrayList:底层数据结构是数组结构,线程不安全,查询速度快。
	    可变长度的ArrayList:
		ArrayList内部封装了一个默认长度为10的数组。 当超出长度时,集合内部会自动生成一个新的数组。
		将原数组中的元素复制到新数组中,在将新元素添加到新数组。
		新数组的长度:ArrayList 50%延长;Vector 100%延长
	LinkedList:底层是链表数据结构,线程不安全,增删速度快。
	    添加功能:
		void addFirst();
		void addLast();
		    在jdk1.6后
		void peekFirst();替代
		void PeekLast();如果集合元素没有,该方法不会抛出异常,而是返回null
	    删除功能:
		void removeFirst();   //pollFirst();替代
		void removeLast();    //pollLast();如果集合元素没有,该方法不会抛异常,null
	    获取功能:
		E getFirst();//如果
		E getLast();
	
4、Set集合
  Set集合不允许有重复元素,无存储顺序
    Set集合通过存入对象的equals方法来保证集合中没有重复元素
    Set接口中的方法和collection中的方法一致
    Set接口取出元素的方法只有迭代器
    Set接口中的子接口:
    |--HashSet:
	    线程不安全,存取速度快。
	    存储元素效率非常高
	    底层使用哈希算法来保证没有重复元素:
		底层数据结构是哈希表,这种结构其实就是哈希值的存储,每一个对象都有自己的哈希值。
		存储对象时,先调用对象的hashCode()计算一个哈希值,在集合中查找是否有哈希值相同的对象
		如果没有,直接存入。如果有,通过equals()和相同对象比较内容是否相同。
		返回true为重复元素,只存一个。返回false就存入
	        往HashSet集合里存储的对象必须正确重写hashCode和equals方法
	    HashSet和ArrayList的区别:
		ArrayList判断包含,以及删除,依据元素的equals方法
		HashSet判断包含,以及删除,依据元素的hashCode()方法,哈希值相同,equals()再判断
    |--TreeSet:
	    线程不安全,可以对Set集合中的元素进行排序。
	    通过二叉树算法保证无重复元素,并对元素进行排序:
		通过compareTo或compare方法中的返回值来保证元素的唯一性,返回0,就视为同一个元素
		返回正数放已有元素右边,返回负数放元素左边,以二叉树形式存放保证有序(左小右大)
	    当TreeSet集合中的元素不具备比较功能,或者具备的比较功能不是所需要时,指定比较算法:
		自然顺序:让元素自身具备比较性,元素实现Comparable接口,覆盖compareTo方法
		比较器顺序:集合自身具备比较器,类实现Comparator接口。覆盖compare方法。
			    将Comparator接口的子类对象作为参数传递给TreeSet的构造函数。
		相对而言,第二种方式较为常用。
                注意:在进行比较的时,一定要明确主要条件和次要条件。
                技巧:
                    当看到Hash开头的对象,底层用的是哈希表。就要想到hashCode方法和equals方法。
                    当看到Tree开头,就要想到二叉树。就要想到两个接口,
                    一个是Comparable,一个是Comparator。
		当元素自身具备比较性,同时TreeSet集合也具备比较器,这时以比较器为主。

	建议:
	    一般在描述对象时,如果该对象封装了具体的数据,会出现很多这样的对象,如:员工,学生对象等
	    这时就需要进行容器的存储。在描述该类对象时,要复写几个方法:
		1、hashCode()	2、equals()
		3、toString();//可写可不写,建议写上
		4,最好实现Comparable接口让该类具备自然排序功能。
		建议对象自身判断是否相同的依据,同时让对象具备基本的比较性
\
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值