Notas de classificação da coleção Java

Comparação de tipo de dados de referência:

Comparable接口
1、“排序”的实体类都体现了java.lang.Comparable接口,
	Comparable接口中只有一个方法
		public int compareTo(Object obj);
		该方法:
			返回	0	表示	this == obj;
			返回整数	表示	this > obj;
			返回负数	表示	this < obj;
2、实现了Comparable 接口的类通过实现 compareTo 方法
   从而确定该类对象的排序方式。
   
引用数据类型 -> 内置类:
	1、整数、小数 Integer Float Double 直接比较基本数据类型的大小
	2、字符:比较Unicode码之差
	3、字符串:
		1)如果其中一个是另外一个起始开始的子串,返回长度只差
		2)否则返回第一个不想等的Unicode码之差
	4java.util.Date;根据日期的长整数型比较
Comparator 
1、思考:很多排序规则
	- 淘宝商品 价格 点击量 名称 等等
	- 只有字节码没有源码
2、提供排序的比较器,业务比较器
	- 实现 java.util.Comparator 接口
	- 重写 public int compare(T o1, T o2);
3、作用:
	- 解耦:独立于实体类
	- 方便:便于应对各种排序规则
Collections 之排序
1Collections 工具类,提供了大量便于处理容器的方法
2、关于排序方法
	- 1public static < T extends Comparable< ? super T > > void sort(List<T> list)
	- 2) public static < T > void sort(List<T> list, Comparator< ? super T> c)
	
	
自定义类型:
1、实体类  java.lang.Comparable + compareTo
2、业务排序类 java.util.Comparator + compare

推荐使用第二种
	1)解耦:与实体类分离
	2)方便:应对多变的排序规则
新闻信息:时间排序、点击量、标题
商品:价格 、收藏量

排序容器
1TreeSet:数据元素可以排序且不可重复
	Set接口:HashSet,元素必须重写 hashcode 和 equals 方法。
	TreeSet去重:比较等于0即为重复 不需要重写hashcode 和 equals方法。
	1)元素可以排序 java.lang.Comparable + compareTo
		new TreeSet();
	2)排序业务类:java.util.Comparator + compare
		new TreeSet(Comparator< ? super E > comparator);
			构造一个新的空 TreeSet,它根据制定比较容器进行排序。
		注意:在添加数据是排序,数据更改不会影响原来的数据。
			尽量不要修改数据,否则可能出现重复。可用final来修饰。
2TreeMap:要求键可以排序,原理同上。
 .队列 QueueDeque
 .Enumeration
 .HashtableProperties
 .引用类型(强、软、弱、虚) 与 WeakHashMap
 .IdentityHashMapEnumMap
 .同步控制与只读设置
 .开源工具包:
	-Guava:Google Collection
	-Apache Commons Collection
 .容器总结


 .队列 QueueDeque
 	Queue:单向
 		-队列通常FIFO (先进先出)
 		-优先级队列和堆栈LIFO (后进先出)
 		方法: 	抛出异常		特殊值	(一般后面的方法优于前面的方法)
 			插入	add(e)		offer(e) (失败返回false)
 			移除	remove()	poll()	(失败返回null)
 			获取	element()	peek()	(失败返回null)
 	Deque:双向 两端访问
 		全名double - ended queue, 是一种具有队列和栈的性质的数据结构。
 		双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
 		1、次接口扩展了Queue接口,在将双端队列用作队列时,将得到FIFO(先进先出)行为
 		2、可用作LIFO (后进先出) 堆栈
 		方法:	第一个元素							最后一个元素
 			  	抛出异常	  		特殊值			抛出异常	  		特殊值
 			插入	addFirst(e)		offerFirst(e)	addLast(e)		offerLast(e)
 					push(e)							add(e)			offer(e)
 			移除	removeFirst()	pollFirst()		removeLast()	pollLast()
 					remove()/pop()	poll()
 			获取	getFirst()		peekFirst()		getLast()		peekLast()
 					element()		peek()
Enumeration
	- 比较古老的接口
	- 枚举Enumeration,作用和Iterator类型,都是输出数据
	- 方法:
		- hasMoreElements()
		- nextElements()
	Vector:elements();
	StringTokenizer
Hashtable
	-Hashtable:Map实现类,与HashMap操作相同
		区别		HashMap		 			Hashtable
		线程安全	线程不安全,非同步,	线程安全,同步,
					效率相对高		  		效率相对低下
		null		键最多一个null,		键与值都不能为null
					值可以多个为null
		父类		AbstractMap				Dictionary
	-Properties 键与值只能为字符串  (PropertiesHashtable的子类 )
		作用:读写资源配置文件
		要求:键与值只能为字符串
		常用方法
			- getProperty(String key)	如果获取的不存在 返回 null
			  getProperty(String key, String defaultValue)	如果不存在 使用后面的默认值
			- setProperty(String key, String value)	:调用 Hashstable 的put方法
			后缀:.properties
			- store(OutputStream out, String comments)	:将此Properties表中的属性列表(键和元素对)写入输出流。
			  store(Writer writer, String comments)	:将此Properties表中的属性列表(键和元素对)写入输出字符。
			  load(InputStream inStream)	:从输入流中读取属性列表(键和元素对)
			  load(Reader reader)	:按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
			.xml
			- storeToXML(OutputStream os, String comment) 	:发出一个表示此表中包含的所有属性的 XML 文档。默认:UTF-8字符集
			  storeToXML(OutputStream os, String comment, String encoding)	:使用指定的编码发出一个表示此类中包含的所有属性的 XML 文档。
			  loadFromXML(InputStream in)	将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。

	类路径加载资源文件
		1、类.class.getResourceAsStream("/"); //类相对路径的 /bin 
		2Thread.currentThread().getContextClassLoader().getResourceAsStream(""); //"" bin
		
其他Map实现类
	·引用分类:(面试)
		- 强引用:StringReference:引用指向对象,gc(Garbage collection)运行时不回收
		- 软引用:SoftReference gc 运行时可能回收(jvm内存不够)
		- 弱引用:WeakReference gc 运行时立即回收
		- 虚引用:PhantomReference 类似于无引用,主要跟踪对象被回收的状态,
				  不能单独使用,必须与引用队列(ReferenceQueue)联合使用
				  
	·目的:避免对象长期驻留在内存中,解决垃圾回收机制回收时机问题
	·WeakHashMap
		√ 键为弱引用,回收键后自动删除key-value对象	
	·IdentityHashMap:
		√ 键只以地址去重,而不是比较hashCode与equals.
		√ 注意:键是常量池中的字符串
	·EnumMap:
		√ 键必须为枚举的值。
		√ 构造器:public EnumMap(指定枚举class对象)	  

同步控制与只读设置
	·同步控制:多线程并发访问集合的线程安全
		1、常用容器:ArrayList HashMap 等都是线程不安全的
		2Collections提供了synchronizedXxx()方法,将指定容器包装成同步
			synchronizedList()
			synchronizedSet()
			synchronizedMap()
	·不可变设置:“只读”访问,Collection提供了三种方法
		1emptyXxx() 空的不可变的集合
		2singletonXxx() 一个元素不可变的集合
		3unmodifiableXxx() 不可变容器

Guess you like

Origin blog.csdn.net/WSYLH/article/details/130148668