java集合

集合类主要是负责保存、盛装其他数据,因此集合类也叫容器类。所有的集合类都在java.util包下面,集合只能保存对象,与数组都点区别,数组可以保存基本类型和对象,主要由Collection和Map接口派生出来。

一、Collection

Collection 是List、Set、Queue接口的父接口,它有以下接口:

  • boolean addAll(Collection c) :该方法是把集合c里的元素全部添加到操作集合中,如果添加操作改变了就返回true。
  • void clear() :这个方法是清除集合里的所有元素,把集合的长度变为零。
  • boolean contains(Object o):这个方法是判断集合是否包含指定元素。
  • boolean containsAll(Collection c):判断集合里是否包含集合c里所有的元素。
  • boolean isEmpty():判断集合是否为空,长度为零时返回true。
  • Iterator iterator():返回一个iterator对象,用来遍历集合。
  • boolean remove(Object o):删除集合中的元素o,一个或者多个成功就返回true。
  • boolean removeAll(Collection c):删除集合中包含集合c中的元素
  • boolean retainAll(Collection c):删除集合中不包含集合c中的元素。
  • int size():返回集合中的元素个数
  • Object toArray():把集合转换成数组

Collection 的实现类已经重写了toString的方法,可以一次性的输出所有的元素,以上的方法不用刻意去记,了解后,平时多用自然会记住。

Iterator接口
Iterator接口主要是用于遍历Collection集合元素。

  • boolean hasNext():如果被迭代的集合元素还未遍历,就返回true
  • Object next():返回集合里的下一个元素
  • void remove():删除上一次next返回的集合元素。

当使用Iterator迭代Collection集合元素的时候,集合里的元素不能被改变,只能用iterator的remove,否则会抛异常。具体原因看一下 Iterator的原码就明白了。

foreach循环遍历集合

for(Object obj : collection){
}

使用foreach循环,也不能修改集合的元素,否则会抛出异常。

二、Set集合

Set集合与Collection集合基本一样,没有增加方法,但set集合不能有重复的集合。
set集合是根据元素对象的equals方法比较的。

HashSet类
大多数使用set的时候就是使用这个实现类,具体特点:

  • 不能保证元素的排列顺序,顺序有可能发生变化
  • 不是同步的,如果多线程访问的时候,就要使用代码来控制
  • 集合元素值可以为null

HashSet 对比的是equals 和hashCode 两个方法,HashSet是根据hashCode值来决定元素的存储位置,当hashCode()方法返回的值不相同,可以存入,当hashCode返回相同,如果equals返回的也相同,那就会判断元素重复,无法添加,如果hashCode返回的相同,但equals返回的不相同,也会存入,但这样是最影响性能的。

LinkedHashSet类
LinkedHashSet类是HashSet的子类,所以有hashset的属性,也是根据hashcode来决定元素的存储位置,但它同时使用链表来未婚元素的次序,这样访问元素的时候会按照添加的顺序去访问,这这样会降低插入的性能,不过会提高迭代的性能。

TreeSet类
TreeSet 是SortedSet接口的实现类,TreeSet 可以确保集合元素处于排序状态,TreeSet增加了这几个方法:

  • Comparator comparator():如果采用了定制排序就会返回Comparator,如果采用自然排序就会返回null
  • Object first():返回集合中的第一个元素
  • Object last():返回集合中的最后一个元素
  • Object lower(Object e):返回指定元素之前的元素。
  • Object higher(Object e):返回指定元素之后的元素。
  • SortedSet subSet(fromElement,toElement):返回此set的子集合,范围从from(包含)到to(不包含)
  • SortedSet headSet(toElement):返回子集,由小于toElement的元素构成。
  • SortedSet tailSet(fromElement):返回子集,由大于或等于fromElement的元素组成

TreeSet支持两种排序方法:自然排序和定制排序,默认是自然排序

1、自然排序
用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列,这种方式就是自然排序。
compareTo方法哪来的呢?它是从Comparable接口继承过来的,方法返回int,当返回0,表示对象相等,对象相等则不能存入set中,返回正整数,表示调用者大于对比者,反之对比者小于调用者。如果一个对象添加到treeset集合里,这个对象没有实现Comparable接口,那么会报错。正常情况下,集合里的元素都是同一类的对象。
2、定制排序
定制排序通过Comparator接口来实现来帮助实现,这个接口有个方法 int compare(T o1,T o2),返回正数则o1比o2大,返回0表示o1等于o2,返回负数表示o1小于o2.
要实现定制排序,就要在创建TreeSet集合对象的时候,提供一个Comparator对象与该TreeSet集合关联。

public class TreeSetTest {

	public static void main(String[] args) {
		TreeSet ts = new TreeSet<M>(new Comparator<M>() {

			public int compare(M o1, M o2) {
				
				return o1.age > o2.age ? 1 : o1.age < o2.age ? -1 : 0;
			}
		});	
		ts.add(new M(7));
		ts.add(new M(9));
		ts.add(new M(2));
		System.out.println(ts);
	}
}
class M{
	int age;
	public M(int age) {
		this.age =age;
	}	
	public String toString() {
		return "M:age="+age;
	}
}
三、List集合

List集合代表一个元素有序、可重复的元素,默认是按元素的添加顺序为索引。
List 是Collection的子接口,增加了以下一些方法:

  • void add(int index,Object element):将元素element插入到集合的index处
  • boolean addAll(int index,Collection c):将集合c插入到集合的index处
  • Object get(int index):返回集合index处的元素
  • int indexOf(Object o):返回对象o在集合中第一次出现的位置
  • int lastIndexOf(Object o):返回对象o在集合中最后一次出现的位置
  • Object remove(int index):删除集合index的元素并返回
  • Object set(int index,Object element):把集合index处的元素替换成element,并返回新元素
  • List subList(int fromIndex,int toIndex):返回从from开始到to的集合子集,不包含to处的元素

ArrayList和Vector实现类
两个实现类封装了一个动态的允许再分配的Object[] 数组。
这个两个类的用法基本相同,但ArrayList不是线程安全,而Vector是线程安全。

  • void ensureCapacity(int minCapacity):将集合中的Object[] 数组长度增加minCapacity,如果需要大量加入元素,可一次性增加,提高性能。
  • void trimToSize():调整集合中数组长度当前元素的个数,可节省空间
四、queue集合

Queue 用于模拟队列数据结构,先进先出(FIFO)

  • void add(Object e):加入队列的末尾
  • Object element():获取队列头部的元素,但不删除
  • boolean offer(Object e):加入队列的末尾,如果队列有容量限制,用这个方法会更好
  • Object peek():获取队列头部的元素,但不删除,如果为空返回null
  • Object poll():获取队列头部的元素,并且删除,如果队列为空返回null
  • Object remove():获取队列头部的元素,并且删除

PriorityQueue实现类
该类保存的元素不是按照加入队列的顺序,而是按照队列元素的大小进行重新排序,排序规则有自然排序和定制排序,使用跟TreeSet的一样。

Deque接口
Deque接口是Queue的子接口,代表一个双端队列。
该类包含了pop、push方法可当成栈来使用。
ArrayDeque 是Deque的实现类。
LinkedList是List、Deque接口的实现类。
使用ArrayList、Vector集合用随机访问的方法(get)来遍历元素,而对于LinkedList集合,应该使用迭代器来遍历,经常使用插入、删除的操作使用LinkedList的性能比较好。

五、Map

map 用于保存具有映射关系的数据,key、value可以是任何引用类型的数据,key不能重复,就是key对象的equals方法都是返回false。

  • void clear():清除map对象里的值
  • boolean containsKey(Object key):判断是否包含key
  • boolean containsValue(Object value):判断是否包含value
  • Set entrySet():返回set集合,集合里存放Map.Entry对象,这个对象是map内部类里面存放key-value对,有getKey、getValue、setValue方法
  • Object get(Object key):根据key获取value值
  • boolean isEmpty():判断集合是否为空
  • Set keySet():返回全部key的set集合
  • Object put(Object key,Object value):添加key-value对,如果存在key相等,会覆盖旧的value值
  • void putAll(Map m):复制map m到集合中
  • Object remove(Object key):根据key删除key-value对,返回value,如果没有key,就返回null
  • int size():返回map集合里的对数
  • Collection values():返回所有value组成的collection

实现类
HashMap和Hashtable
Hashtable的key和value不能为null,并且是线程安全的,HashMap的key或value,可以为null,不是线程安全。
他们的key对比的规则跟hashset的规则是一样的,而value的对比就是用equals方法对比。都是无序的。
LinkedHashMap是HashMap的子类,增加了链表来维护插入的顺序。
properties类
Properties类是Hashtable的子类,用来处理属性文件。

  • String getProperty(String key):根据key获取value
  • String getProperty(String key ,String defaultValue):根据key获取value,如果没有就返回defaultValue
  • Object setProperty(String key ,String value):根据key设置value
  • void load(InputStream inStream):从输入流中获取key-value,追加到到集合中。
  • void store(OutputStream outputSteam,String comments):将key-value输出到文件中
六、Collections工具类1、 排序操作

1、排序操作

  • void reverse(List list) 反转
  • void shuffle(List list) :随机排序
  • void sort(List list):根据元素的自然顺序排序
  • void sort(List list,Comparator c):根据指定的comparator产生的顺序排序
  • void swap(List list,int i,int j):交换
  • void rotate(List list,int distance):移动

2、查找、替换操作

3、同步控制
使用synchronizedXxx()方法包装成线程安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值