您的位置:首页 > 编程语言 > Java开发

java集合

2016-07-21 07:53 369 查看
Java集合是一种特别有用的工具类,可以存储数量不等的对象,并且可以实现常用的数据结构,如栈,队列等,除此之外,java集合可以保存具有映射关系的关联数组。Java集合可以分为Set、List、Queue 和Map 四种体系,其中Set代表无序不可重复的集合;List代表有序可重复的集合;而Map则代表具有映射关系的集合,Queue代表一种队列集合实现。Java集合就像是一种容器可以把多个对象(实际上是对象的引用)丢进该容器中。从java5开始增加泛型后,java集合可以记住容器中对象的数据类型,从而可以编出更简洁健壮的代码。
可以使用数组来保存多个对象,但数组的长度是固定的,如果需要保存数据变化的数据,数组就有点无能为力了。而且数组不能保存具有映射关系的数据。为了保存不确定的数据,以及保存具有映射关系的数据,java提供了集合类。集合里不能保存基本类型的值,只能保存对象。Java集合主要由两个接口派生出来,Collection 和Map;而Set和List是Collection 接口派生出来的子接口,分别代表了无顺序集合和有序集合。如果访问list集合,可以通过元素的索引来访问,如果访问Map集合中的元素,可以通过key来访问,如果访问set集合中的元素,那只能根据元素本身来访问。这些集合的最常见的实现类是HashSet,TreeSet,ArrayList,ArrayDeque,LinkedList和HashMap,TreeMap等;
所有的Collection实现类都重写了toString方法,该方法可以一次性的输出集合中的所有元素。

Itertor必须依赖于Collection 对象,它仅用于遍历集合。当使用Iterator对集合元素进行迭代时,iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何影响。在使用Iterator迭代集合的过程中,不能修改集合元素,否则会引发异常。除了使用Iterator 接口迭代访问Collection集合里的元素以外,java5还提供foreach循环迭代访问集合元素。
与使用Iterator接口迭代访问集合元素类似的是,foreach循环中的迭代变量也不是集合元素本身,系统只是依次把集合元素的值赋给迭代变量,因此当使用foreach循环迭代访问集合元素时,该集合也不能被改变。 HashSet类:它是Set接口的典型实现,它通过hash算法来存储集合中的元素,因此具有很好的存储和查找性能。当向Hashset集合中存入一个元素,它会调用hashCode()方法来得到该对象的hashCode值,然后根具hashCode值来决定元素存放的位置。HashSet集合判断两个元素相等的标准是通过equals()方法比较相等,并且两个对象的的hashCode()方法返回的值也相等。TreeSet并不是根据元素的插入顺序进行排序的,而是根据元素的实际值的大小来进行排序的。如果试图把一个对象添加到TreeSet时,则该对象的类必须实现Comparable接口,否则程序会抛出异常。 总结起来一句话,如果希望TreeSet能正常运转,TreeSet只能添加同一种类型的对象。当把一个对象加入到TreeSet时,它会调用该对象的compareTo方法与容器中的其他对象进行比较,然后根据红黑树结构找到它的存储位置,如果比较两个对象值相等,新对象无法添加到TreeSet中。TreeSet可以删除没有被修改的实例变量,且不能与其他被修改实例变量的对象重复。 TreeSet的自然排序时根据集合元素的大小,将他们升序排列。如果需要定制排列,则可已通过Comparator接口的帮助,该接口里包含一个int compare(T o1,T o2)方法,该方法用于比较o1 和o2 的大小;TreeSet对集合元素排序不管集合元素本身的大小,而是由Comparator对象负责集合元素的排序规则。如果比较两个元素返回0,这样TreeSet不会把第二个元素添加进去。 HashSet的性能总是比TreeSet好,因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的的Set时,才考虑使用TreeSet,否则都应该使用HashSet。 List:它代表一个有顺序可重复的集合。集合中每个元素都有对应的索引,默认按照元素的添加顺序来设置索引。与Set集合相比,List增加了根据索引来插入、替换、删除集合元素的方法。public class ListIteratorTest {
public static void main(String[] args) {
String []books={"redis",
"javaEE"
};
List bookList=new ArrayList();
for(inti=0;i<books.length;i++){
bookList.add(books[i]);
ListIterator lit=bookList.listIterator();
while(lit.hasNext()){
System.out.println(lit.next());
lit.add("------");
}
System.out.println("----下面开始反向迭代----");
while(lit.hasPrevious()){
System.out.println(lit.previous());
}
}
}
}ListIterator迭代List集合时,可以正向迭代也可以反向迭代。ArrayList和vector都是基于数组实现的List类,都封装了一个动态的Object[]数组。ArrayList是线程不安全的,当多个线程访问同一个ArrayList时,如果有超过一个线程修改过了ArrayList集合,则程序必须手动的保证该集合的同步性。而Vector是线程安全的,因此它的性能相对低一些。 Queue集合:用于模拟队列这种数据结构。Deque代表一个双端队列,它是queue的子接口。可以同时从两端来添加或删除元素,因此Deque既可以当做队列来使用,也可以当成栈来使用。它的一个实现类是ArrayDeque。 LinkedList 类是List接口的一个实现类,他是一个集合。可以通过索引来访问,除此之外,它还实现了Deque接口,可以被当成双端队列来使用,既可以当做栈来使用,也可以当做队列来使用。如果需要遍历List集合元素,ArrayList,vector应该采用随机访问方法(get)来遍历集合元素,对于LinkedList集合,则应该采用迭代器(Iterator)来遍历集合元素。 Map用于保存具有映射关系的数据。Map的key不允许重复。把map里所有的key放在一起,组成了一个set,因此有keySet()方法;当放入重复的key时,新的value会覆盖原有的value;HashMap可以将null作为key或value;为了成功的在HashMap中存储,获取对象,用作key的对象必须实现hashCode()方法和equals()方法。判断这两个值相等的标准更简单,这两个方法返回的值都相等即可。
LinkedHashMap也使用双向链表来维护key-value的次序,该链表负责维护Map的迭代顺序,迭代顺序与key-value 的插入顺序保持一致。
使用Properties读写属性文件。Properties类可以把Map对象和属性文件关联起来,从而把Map对象中的key-value对写入属性文件中。Properties属性文件里的key-value都是字符串类型。
public class PropertiesTest {
public static void main(String[] args) throws Exception {
Properties props=new Properties();
props.setProperty("username", "xiaoshuai");
props.setProperty("password", "123456");
props.store(new FileOutputStream("F://prop.text"), "comment line");
Properties props2=new Properties();
props2.setProperty("gender", "male");
props2.load(new FileInputStream("F://prop.text"));
System.out.println(props2);
}
}
TreeMap 是一个红黑树结构,每个key—value对即作为红黑树的一个节点。TreeMap存储key—value对时,需要根据key对节点进行排序,TreeMap可以保证所有的key-value对处于一个有序状态。它也有两种排序方式:自然排序和定制排序;
自然排序:treeMap的所有key对象必须实现Comparable接口,而且所有的key应该是同一个类的对象。
定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对Treemap中的所有key进行排序。
自然排序中,TreeMap中判断两个key相等的标准是:两个key通过compareTo()方法返回0,则认为这两个key相等。
TreeMap 通常比HashMap要慢,因为Treemap底层采用红黑树来管理key-value对,使用TreeMap有一个好处,它的键值对总是处于有序状态,无需专门进行排序操作。对于一般的存储和查询操作,应考虑使用HashMap,因为其是基于快速查询设计的,其底层采用数组来存储。但是程序需要一个总是排序好的Map时,则可以考虑使用TreeMap。 LinkedHashMap比hashMap慢一点,因为它需要维护链表来保持map中的key-value时的添加顺序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  list set map