集合小结

集合的内容可以分为下:
在这里插入图片描述
**为什么需要集合? 在代码的编写过程中,需要存储大量数据。可以利用之前的数组存储一些数据,但利用数组存储数据有以下的毛病:①是 数组的长度必须固定 ②数组不能排序 ③数组不能实现某些特殊的数据结构
**
基于以上的分析,Java提出了集合的概念,集合即为存储 某些具有 特殊数据结构 的数据 的一个容器
那么有哪些常用的数据结构: ①存储有序的,里面的元素可以重复
②存储无序的,里面的元素不可以重复;要清楚这种存储 不重复数据 的机理
③两种数据之间 存在 某种关系 ,通过一种数据可以 找到 另外 一种数据 (即 键-值对)

在这里插入图片描述
要清楚有哪些常用数据容器,每种容器中存储 的数据类型,每种容器 的特点。
所有的容器的 根接口 为 Collection.来看看 API中对 Collection的描述:
The root interface in the collection hierarchy.A collection represents a group of objects,
known as its elemennts.
Some collections allow duplicate elements and other do not.Some are ordered and others unordered.
The JDk does not provide any direct implementations of this interface:it probides implementations of more specific subinterfaces like Set and List.

对每种数据 结构 的主要操作 为: 增 、删 、改、查** (查看API+自己总结)

其中:增和查 get(int index)比较简单,查主要为遍历。在Collection接口中有两个方法 :
(1)iterator()、toArray() ListIterator()都可以实现对集合的遍历
(2)增强for循环,对于数组和Collection均可使用,但是此方法 不可修改元素和删除远胜于
(3)普通for循环,使用 索引加get(i)的方法,这种方法可以删除元素和修改元素

删在Collection中提供了:remove(Object o)、removeAll(Collection<?> c) (note:删的话主要有一个条件的判断,自定义类型 在使用 equals()时要注意方法的重写)
主要有:普通for循环删除(索引做自减运算),迭代器删除(使用迭代器自身的remove方法)。

							        /*方法1:普通for循环
							        						for(int i =0;i<arr.size();i++) {
																								if(arr.get(i).equals(3)){
																									arr.remove(arr.get(i));
																									i--;  //索引自减,否则删除不干净
																								}
																							}
											
											
																							
								  /*方法2:迭代器
								  					while(itr.hasNext()) {
																	if((Integer)itr.next()==3) {
																		itr.remove(); //迭代器自身的remove 方法
																	}
																}
																System.out.println(arr);
																						
	  					
						改的话:
											//情形1:修改List中的元素
											ArrayList<String>  arr1 = new ArrayList<>();
											arr1.add("zhou");
											arr1.add("zhou");
											arr1.add("wang");
											arr1.add("yang");
											
											
											//将 zhou 该成 hui
											for(int i =0;i<arr1.size();i++) { //遍历整个集合List
												
												if("zhou".equals(arr1.get(i))) { //关键是 获取 set()方法如何使用?  索引 与 ,数据的对比也很重要
													arr1.set(i, "hui");     
												}
											}
											System.out.println(arr1);
											
						
									
											//情形2:向List中添加元素,使用  ListIterator  
											list中提供了一个方法: set(int index,E element)
														
													ListIterator itr = arr.listIterator();
														while(itr.hasNext()) {
															int i = (Integer)itr.next();  //强制类型转换
															if(i==1) {
																itr.add(10); //使用list迭代器向集合中添加元素
															}
														}	  					

Set型集合中存放的是没有顺序,不可重叠的元素。Set接口主要有两个实现类,分别是HashSet和TreeSet。
其中,HashSet是根据对象的哈希值来确定元素在集合中存储位置,有因此具有良好的存取和查找性能。
TreeSet则是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序。

HashSet存储原理:当向HashSet集合中添加一个元素时,首先会调用该元素的hashCode()方法来确定该元素的存储位置
然后再调用元素对象的equals()方法来确保该位置没有重复元素。

	   				HashSet集合之所以能确保不出现重复的元素,是因为它在存入元素时做了许多工作。当调用HashSet集合的add()方法存入元素时,首先调用
	   				当前存入元素的hashCode()方法获得对象的哈希值,然后根据对象的哈希值计算出一个存储位置;如果该位置上没有元素,则直接将元素存入;
	   				如果该位置上有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较。如果返回的结果为false就将该元素存入集合;
	   				返回的结果为true则说明有重复元素,就将该元素舍弃。
	   				
	   			根据以上分析:当向 HashSet中添加元素时(尤其是自定义对象行元素),需要重写  hashCode()和equals()方法。

TreeSet:是Set接口另一个实现类,它内部采用平衡平衡二叉树来存储元素,这样的结构可以保证 TreeSet集合中没有重复的元素,并且可以对元素进行排序。
集合中的元素在进行比较时,都会调用compareTo()方法,该方法是Comparable接口中定义的,因此要相对集合中的元素进行排序
就必须实现 Comparable接口。Java中大部分类都实现了Compaarable接口,并默认 实现了接口中的CompareTo()方法,如Integer、Double和String类

在实际中,除了会向TreeSet集合中存储一些Java中默认的数据类型外,还回存储一些用户自定义的类型数据,如Student类型数据、Teacher型数据。由于这些自定义类型数据
没有实现Comparable接口,因此也就无法直接在 TreeSet集合中进行排序操作。为了解决这个问题,Java提供了两种TreeSet的排序规则,分别为:自然排序和定制排序。在默认情况下,TreeSet集合都是采用 自然排序。

 自然排序:
	  		 		自然排序要求向TreeSet集合存储的元素所在类必须  实现   Comparable 接口,并重写 CompareTo()方法进行比较。
	  		 				@Override
							public int compareTo(Person o) {
								//定义比较方式 ,先比较年龄,在比较姓名
								
								if(age>o.getAge()) return 1;
								if(age==o.getAge()) {
									return this.name.compareTo(o.getName());
								}
								return -1;
							}

定制排序:
有时候,用户自定义的类型数据所在的类没有实现Comparable接口或者对于实现了Comparable接口的类而不是想 按照定义的CompareTo()方法进行排序。
例如,希望存储在TreeSet集合中的字符串可以 按照长度 而不是 英文字母的顺序 进行排序,这时可以通过在创建 TreeSet集合时就自定义一个比较器来对元素
进行定制排序。使用 TreeSet集合的 TreeSet( Comparator<? super E> comparator)有参构造方法

					//按照字符串的长度进行排序
								TreeSet<String> ts1 = new TreeSet<String>(new Comparator<String>() {
									@Override
									public int compare(String o1, String o2) {
										return o1.length()-o2.length();
									}
								});
								
								
								ts1.add("1234");
								ts1.add("345");
								ts1.add("123456");
								ts1.add("1234567");
								
								for(String s:ts1) {
									System.out.println(s);
								}

Map:从其英文 意思上可以看出 是 映射的关系 ,即 从一种数据可以 映射到另外 一种数据, key—> value.
Map中的映射关系时一对一的,一个键对象Key对应唯一一个值对象Value,其中键 对象和 值 对象可以是任意数据类型
并且键对象 Key不允许重复,这样在访问Map集合中的元素时,只要指定了Key就能找到对应的 Value。

		HashMap:
					对Map进行遍历的方法:
									 (1) 获得所有的键,根据键获得对应的值
									 (2)获取 键值对,依次拆分键值对  entrySet()
									 
					删 
					
					改:put()方法
					
		
		
		 TreeMap:
		 			Map接口还有一个常用的实现类TreeMapp,他也是用来存储键值映射关系的,并且不允许出现重复的键。
		 			在TreeMap内部是通过二叉树的原理来保证键的唯一性,这与TreeSet集合存储的原理一样,因此TreeMap中的所有的键是按照某种顺序排列的。
		 			
		 			A Red-Black tree based NavigableMap implementation.The map is stored according to the natural ordering of its keys,
		 			
		 			or by a Comparator provided at map creation time,depending on which constructor is use.
		 			
		 			上面标明 ,该集合按照 键的大小对Map进行排序。可以按照  自定义的顺序进行也可以实现 Comparator 接口。
		 			
		 		
		 Properties:
		 			 Map接口还有一个实现类Hashtable,它和HashMap 十分相似,其中一个主要区别 在于 Hashtable是线程安全的。、
		 			 另外在使用方面,Hashtable的小列表也不及HashMap,所以,目前基本 被HashMap类取代,但Hashtable类有一个子类 Properties在实际应用中非常重要
		 			 Propperties主要用来存储字符串类型的键和值,在实际开发应用中,经常使用  Properties集合类 来存取应用的配置  项。
		
		
		 
		 Collections工具类,在Java中,针对集合的操作非常频繁,例如将集合的元素排序、从集合中查找某个元素等。针对这些常见操作,Java提供了一个
		 				  工具类专门用来操作集合,这个类就是Collections.
		 				  
		 				  		 
		Arrays工具类:在Java.util包中,除了针对  集合操作 提供了  一个集合工具类 Collections,还针对 数组操作  提供了一个数组工具类-Arrays。
					Arrays工具类提供了大量针对数组操作的静态方法。

猜你喜欢

转载自blog.csdn.net/ZHOUJIAN_TANK/article/details/88379963
今日推荐