集合类(常见的集合类:Collection、List、Set、ArrayList、linkedList、Vector、HashSet、TreeSet)
一、集合类
定义:一种为了对多个对象进行操作而进行存储的方式。
    1、与数组的区别: 
														      数组:可以存储对象,也可以存储基本数据类型,但是一次只能存储一种类型,数组长度固定。
集合:只能存储对象,长度可变,可以存储不同类型的对象。
集合众多的原因:每一种容器对数据的存储方式都有所不同,这个存储方式为:数据结构。
二、Collection
      1.增加对象:boolean add(Object object)  如果集合中没有object,那么添加它并返回true;
					  																				       如果集合中存在object(且该集合不能包含重复元素),则返回false。
					  									       另外:集合中存储的都是对象的引用(地址)。(Object可以放入任何对象)
2.获取长度:int size(): 返回此集合中的元素个数。
      3.删除元素:
												        void clear(): 清楚集合中的所有元素(除非该集合不支持clear方法)。
												        boolean remove(Object o): 删除集合中所有e.equals(e)==true的元素,并返回true。否则返回false。
                        (Arraylist中改写为:移除相等的首个元素)
												        Boolean removeAll(Cellection c): 移除和集合c 的交集中的元素。
      4.判断元素:
												        Boolean contains(Object o):判断集合中是否包含元素(对象)o。
												        boolean containsAll(Collection c):判断集合c是否是调用集合的子集。
5.交集: boolean retainAll(Cellection c): 仅保留和集合c的交集。
三、元素的取出(迭代器)
迭代器: 就是一个Iterator接口的子类对象,封装了取出其绑定集合的元素的方式。
        步骤:  1、通过调用集合的 Iterator iterator()方法返回该集合的迭代器,
									            2、将此迭代器赋值给 一个 	Iterator 型对象引用。 
									            3、通过此引用,调用迭代器的方法操作集合:
														              1)、boolean hasNext():如果集合中任有元素可以迭代,则返回true。
														              2)、Object next():返回迭代的下一个元素(列表中还在)。
              3)、void remove():从迭代器指向的集合中 移除 迭代器返回的最后一个元素。
        注意:你不能同时用迭代器和集合同时去操作同一组元素, 有可能会抛出并发异常。
								        原因:迭代器已经创建, 之后通过集合方法操作的元素过程(比如说增加),迭代器并不知道集合做了什么操作,还是只能
								                 按照原来的元素列表操作,就会发生错误。
四、List 接口
Collection 接口的子接口
特点:元素是有序的, 而且元素可以重复。 该类集合中有索引(角标)。
其特有的常见方法:
1、凡是可以操作角标(索引的)的方法都是该体系特有的方法。
          增:
															            void add(int index ,Object object);
															            Boolean add(int index, Collection c);
          删:
												                  remove(index):返回了移除的元素。
												            改:
												  		            set(index, element):在指定角标放入指定元素,返回原来的元素。
												            查:
												  		            get(index):返回index上的元素
												  		            subList(start,end):返回一个自己列表(依赖于原集合)
注:List集合特有的迭代器: listIterator(); 列表迭代器 (注意与iterator区别)
      listIterator:   
													        1、定义、解释。
是iteretor的子接口。
            在进行迭代操作的时候,不能使用集合方法对同组元素进行操作(原因在iterator讲解处)。
																			          而iterator的操作方法又比较少(只有判断、查找、删除,没有添加),局限了对元素组的课操作性。
																			          所以在list集合中就定义了新的迭代器:  listIterator。
        2、listIterator中新增的方法:
																			          1)、void add(): 在返回的元素后面的加入一个新元素
																			          2)、void set(object): 使用新元素替换返回的最后一个元素。
																			          3)、Boolean hasPrevious(): 逆向遍历列表(相对应: hasNext())
list 集合在涉及到需要判断元素是否相同时,底层调用的都是equals方法。(contains、 remove方法等)
list集合下,常见三大集合
            1、ArrayList:底层数据结构使用数组结构:  查询速度快。但是增删稍慢。(线程不同步,数组0.5倍延长)
													            2、Linkedlist:底层使用链表数据结构:   增删块, 但是查询慢。
													            3、Vector:底层是数组数据结构:查询赠删慢(线程同步,数组百分百延长)已经被ArrayList取代。
Vector: 在1.2版本过后,便几乎被ArrayList取代,同步的。
不过其有两个特有之处:
  
																				            1)、 在去方法中带有Element的方法是在1.1还没有Collection框架的时候特有的方法,与从list实现来的方法几乎一样。
            2)、	Vector除了有迭代器(iteretor、listIteretor	)外,还有一个枚举(与iteretor类似)
																								                Enumeration	 en = v.elements(); 通过Vector对象创建一个枚举
																								                en.hasMornElements();			(类似迭代的hasNext())
																								                en.nextElement();				(类似迭代的Next())
注意:枚举的所有功能都被迭代包含了,而且枚举方法名太长,不利于书写,所以,新的开发应当优先使用迭代而不是枚举。
linkedList:
底层使用链表数据结构。
      特有方法:
							 										          1)、addFirst()从集合列表开头插入元素
							 										          2)、addLast()从集合列表结尾插入元素(等效于add())
							 										          3)、getFirst()拿到第一个元素,返回这个元素
							 										          4)、getLast()拿到最后一个元素,返回这个元素
							 										          5)、removeFirst()移除第一个元素,返回这个元素
							 										          6)、removeLast()移除最后一个元素,返回这个元素
(如果列表中没有元素,那么:3到6方法抛 空元素异常)
      注:	 在1.6版本以后,新添加了获取和移除方法, 在空列表的时候,会返回null,不会发生异常。
							 							                1)、peekFirst()获取 但 不移除 列表第一个元素,列表为空返回null
          2)、peekLast()获取 但 不移除 列表最后一个元素,列表为空返回null
							 							                3)、pollFirst()获取 并 移除 列表第一个元素,列表为空返回null
							 							                4)、pollLast()获取 并 移除 列表第最后一个元素,列表为空返回null	
							  																      
五、Set 接口
Collection 接口的子接口
特点:元素是无序(存入和取出的顺序不一定一致)的,而且元素不能重复。 该类集合中没有索引。
Set集合的功能和Collection是一致的。
      Set集合下常见的子类集合:
																		                    HashSet:底层数据结构式: 哈希表。
TreeSet:
      HashSet: 
										          特点:元素无序(存入和取出的顺序一定不一样),而且元素唯一,没有索引。
底层数据: 底层使用哈希表作为数据结构。
          元素唯一性:  是通过元素的两个方法: hashCode 和 equals 来完成的。
																	              如果两个元素的HashCode值相同,就会判断equals是否为true。
																	              如果两个元素的HashCode值不同,就不会调用equals方法。
注意:对于判断元素是否存在、删除等操作,都依赖于元素的hashCode、equals等方法。
      哈希表:给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,
													        则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
      (哈希值与内存地址值之间的关系:默认的哈希值是内存地址值计算的哈希值,但是只是为了给人看的,真正在
												      内存中还是依靠内存地址值来进行运算的,而不是哈希值)
TreeSet:
底层数据结构: 二叉树 (保证元素唯一性的方法是保证compareTo 方法return 0)
比较方式: 方式一、就是让元素自己具有比较性,元素需要实现comparable接口,重写其中得compareTo方法,这个排序叫做自然排序(默认排序)
1、 无序性(按照输入元素类中自定义的compareTo方法来排定存储对象。)
2、 单一性(通过判断元素类中自定义的compareTo方法放回值是否为0来判断元素是否相等。)
3、 让需要存入到TreeSet中的元素,实现comparable接口,该接口中定义了一个public int compareTo方法
              4、 compareTo 方法:我们需要在类定义中重写该方法, public int compareTo, 
	   						      							            使得:  当有e.compareTo(e1)时,  
	   						      										                   如果e大于e1则返回正数,当e小于e1则返回负数, 等于则返回0.
	   						      										                     而且当有e等于e1时, 可以定义附属判断条件来判断 两个对象的大小。
    注意:TreeSet   本情况的所有的底层比较原理只是调用了元素的compareTo方法,与 equals等方法都无关。
	   														              (add、contains、remove等需要用到比较的方法)
	   														      所以我们定义所有的比较都返回正数,那么靠遍历迭代器取出的元素顺序和存入顺序一样。
	   														      如果定义所有的比较都返回负数,那么靠遍历迭代器去除的元素顺序和存入的顺序相反。
	   														      如果定义所有比较都返回0  ,那么就只能存入一个元素,最后也只能取出一个元素。
    方式二、当元素自身没有比较性或者具有的比较性不是自身所需要的,那么就要让集合自身具有比较性。
	   	          				          那么就要在集合一初始化时定义比较方式(也就是调用集合的构造方法)
1、 无序性(按照集合实例化的时候的比较器来排布元素的存储顺序。)
2、 单一性(通过集合的比较器的compare方法返回值是否为0 来判断元素是否相等。)
3、 定义一个比价器的类,使其实现comparator接口, 重写覆盖其中的 int compare(T o1, T o2) 方法。
        4、 compare 方法:我们需要在比较器类定义中重写该方法,int	compare(Object o1, Object o2), 
	   						      							      使得:  我们在该方法中比较两个对象,或者比较其对象的方法,或者直接定义一个数值返回。  
	   						      										               当返回值为正时代表o1大于o2,当返回值为负时代表o1小于o2,返回值为0 则代表两个对象相等。
而且当初步判断有o1等于o1时, 可以定义附属判断条件来判断 两个对象的大小。
      注意:TreeSet   本情况的所有的底层比较原理只是调用了集合比较器的compare方法,与 元素equals等方法都无关。
	   														          (add、contains、remove等需要用到比较的方法)
	   														        所以我们定义所有的比较都返回正数,那么靠遍历迭代器取出的元素顺序和存入顺序一样。
	   														        如果定义所有的比较都返回负数,那么靠遍历迭代器去除的元素顺序和存入的顺序相反。
	   														          如果定义所有比较都返回0  ,那么就只能存入一个元素,最后也只能取出一个元素。
集合类(常见的集合类:Collection、List、Set、ArrayList、linkedList、Vector、HashSet、TreeSet)的更多相关文章
- List集合与Set集合(ArrayList,LinkedList,Vector,HashSet,LinkedHashSet,可变参数)
		List集合介绍及常用方法 import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* java. ... 
- ArrayList,LinkedList,Vector集合的认识
		最近在温习Java集合部分,花了三天时间读完了ArrayList与LinkedList以及Vector部分的源码.之前都是停留在简单使用ArrayList的API,读完源码看完不少文章后总算是对原理方 ... 
- ArrayList LinkedList Vector
		ArrayList是基于数组实现的,没有容量的限制. 在删除元素的时候,并不会减少数组的容量大小,可以调用ArrayList的trimeToSize()来缩小数组的容量. ArrayList, Lin ... 
- ArrayList, LinkedList, Vector - dudu:史上最详解
		ArrayList, LinkedList, Vector - dudu:史上最详解 我们来比较一下ArrayList, LinkedLIst和Vector它们之间的区别.BZ的JDK版本是1.7.0 ... 
- 集合类源码(二)Collection之List(ArrayList, LinkedList, Vector)
		ArrayList 功能 完全命名 public class ArrayList<E> extends AbstractList<E> implements List<E ... 
- java 中 ArrayList LinkedList Vector 三者的异同点
		1.ArrayList和Vector都是基于数组实现的,所以查询速度很快,增加和删除(非最后一个节点)速度慢: Vector是线程安全的,ArrayList不是. 2.LinkedList 是一个双向 ... 
- ArrayList,LinkedList,vector的区别
		1,Vector.ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储. 2.List中的元素有序.允许有重复的元素,Set中的元素无序.不允许有重复元素. ... 
- ArrayList   LinkedList   Vector之间的区别
		List主要有ArrayList,LinkedList和vector三种实现.这三种都实现了List接口,使用方式也很相似,主要区别在于其实现方式的不同! 这三种数据结构中,ArrayList和Vec ... 
- 比较Java数组,ArrayList,LinkedList,Vector 性能比较
		public class PerformanceTester { public static final int TIMES=100000; public static abstract class ... 
- java类集框架(ArrayList,LinkedList,Vector区别)
		主要分两个接口:collection和Map 主要分三类:集合(set).列表(List).映射(Map)1.集合:没有重复对象,没有特定排序方式2.列表:对象按索引位置排序,可以有重复对象3.映射: ... 
随机推荐
- Jmeter(GUI模式)教程
			前些天,领导让我做接口的压力测试.What??我从未接触过这方面,什么都不知道,一脸蒙.于是我从学习jmeter开始入手. 现在记录下来jmeter的使用步骤,希望能对大家有所帮助. 一.安装Jmet ... 
- HAOI2016 找相同字符 后缀自动机
			两个串,考虑一建一跑.枚举模式串的位置\(i\),考虑每次统计以\(i\)结尾的所有符合要求的串.在后缀自动机上走时记录当前匹配长度\(curlen\),则当前节点的贡献是\((curlen-len[ ... 
- Beta项目展示
			Team C# 一.团队成员简介 杜正远,队长. 博客地址:http://www.cnblogs.com/kevindu/ 崔强,全职PM. 博客地址:http://www.cnblogs.com/m ... 
- [转载]Memory Limits for Windows and Windows Server Releases
			Memory Limits for Windows and Windows Server Releases This topic describes the memory limits for sup ... 
- Windows 安装 docker 以及1709的简单使用
			PS C:\> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force PS C:\> Install-P ... 
- RabbitMQ基础知识详解
			什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中 ... 
- 监控系统 & monitoring & DevOps
			监控系统 & monitoring & DevOps https://github.com/topics/monitoring https://github.com/marketpla ... 
- ssh 将22端口换为其它 防火墙设置
			废话不多说,先通过当前的SSH端口(默认为:22)登陆. 1.修改配置文件:/etc/ssh/sshd_config ,找到 #port 22 2.先将Port 22 前面的 # 号去掉,并另起一行. ... 
- Bootstrap图像
			前面的话 图像在网页制作中也是常要用到的元素,本文将详细介绍Bootstrap图像 响应式图片 通过为图片添加 .img-responsive 类可以让图片支持响应式布局.其实质是为图片设置了 max ... 
- 洛谷P2397 yyy loves Maths VI (mode)
			P2397 yyy loves Maths VI (mode) 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居 ... 
