引用数据类型比较:
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码之差
4、java.util.Date;根据日期的长整数型比较
Comparator
1、思考:很多排序规则
- 淘宝商品 价格 点击量 名称 等等
- 只有字节码没有源码
2、提供排序的比较器,业务比较器
- 实现 java.util.Comparator 接口
- 重写 public int compare(T o1, T o2);
3、作用:
- 解耦:独立于实体类
- 方便:便于应对各种排序规则
Collections 之排序
1、Collections 工具类,提供了大量便于处理容器的方法
2、关于排序方法
- 1)public 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)方便:应对多变的排序规则
新闻信息:时间排序、点击量、标题
商品:价格 、收藏量
排序容器
1、TreeSet:数据元素可以排序且不可重复
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来修饰。
2、TreeMap:要求键可以排序,原理同上。
.队列 Queue 与 Deque
.Enumeration
.Hashtable 与 Properties
.引用类型(强、软、弱、虚) 与 WeakHashMap
.IdentityHashMap 与 EnumMap
.同步控制与只读设置
.开源工具包:
-Guava:Google Collection
-Apache Commons Collection
.容器总结
.队列 Queue 与 Deque
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 键与值只能为字符串 (Properties 是 Hashtable的子类 )
作用:读写资源配置文件
要求:键与值只能为字符串
常用方法
- 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
2、Thread.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 等都是线程不安全的
2、Collections提供了synchronizedXxx()方法,将指定容器包装成同步
synchronizedList()
synchronizedSet()
synchronizedMap()
·不可变设置:“只读”访问,Collection提供了三种方法
1、emptyXxx() 空的不可变的集合
2、singletonXxx() 一个元素不可变的集合
3、unmodifiableXxx() 不可变容器