码迷,mamicode.com
首页 > 编程语言 > 详细

java集合

时间:2016-07-21 11:11:14      阅读:375      评论:0      收藏:0      [点我收藏+]

标签:list set map


    Java集合是一种特别有用的工具类,可以存储数量不等的对象,并且可以实现常用的数据结构,如栈,队列等,除此之外,java集合可以保存具有映射关系的关联数组。Java集合可以分为SetListQueue Map 四种体系,其中Set代表无序不可重复的集合;List代表有序可重复的集合;而Map则代表具有映射关系的集合,Queue代表一种队列集合实现。Java集合就像是一种容器可以把多个对象(实际上是对象的引用)丢进该容器中。从java5开始增加泛型后,java集合可以记住容器中对象的数据类型,从而可以编出更简洁健壮的代码。

   可以使用数组来保存多个对象,但数组的长度是固定的,如果需要保存数据变化的数据,数组就有点无能为力了。而且数组不能保存具有映射关系的数据。为了保存不确定的数据,以及保存具有映射关系的数据,java提供了集合类。集合里不能保存基本类型的值,只能保存对象。Java集合主要由两个接口派生出来,Collection Map;而SetListCollection 接口派生出来的子接口,分别代表了无顺序集合和有序集合。如果访问list集合,可以通过元素的索引来访问,如果访问Map集合中的元素,可以通过key来访问,如果访问set集合中的元素,那只能根据元素本身来访问。这些集合的最常见的实现类是HashSet,TreeSet,ArrayList,ArrayDeque,LinkedListHashMap,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集合时,可以正向迭代也可以反向迭代。

ArrayListvector都是基于数组实现的List类,都封装了一个动态的Object[]数组。ArrayList是线程不安全的,当多个线程访问同一个ArrayList时,如果有超过一个线程修改过了ArrayList集合,则程序必须手动的保证该集合的同步性。而Vector是线程安全的,因此它的性能相对低一些。

 

Queue集合:用于模拟队列这种数据结构。Deque代表一个双端队列,它是queue的子接口。可以同时从两端来添加或删除元素,因此Deque既可以当做队列来使用,也可以当成栈来使用。它的一个实现类是ArrayDeque

 

LinkedList 类是List接口的一个实现类,他是一个集合。可以通过索引来访问,除此之外,它还实现了Deque接口,可以被当成双端队列来使用,既可以当做栈来使用,也可以当做队列来使用。

如果需要遍历List集合元素,ArrayListvector应该采用随机访问方法(get)来遍历集合元素,对于LinkedList集合,则应该采用迭代器(Iterator)来遍历集合元素。

 

Map用于保存具有映射关系的数据。Mapkey不允许重复。把map里所有的key放在一起,组成了一个set,因此有keySet()方法;当放入重复的key时,新的value会覆盖原有的value;

HashMap可以将null作为keyvalue为了成功的在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 是一个红黑树结构,每个keyvalue对即作为红黑树的一个节点。TreeMap存储keyvalue对时,需要根据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 LinkedHashMaphashMap慢一点,因为它需要维护链表来保持map中的key-value时的添加顺序。


java集合

标签:list set map

原文地址:http://11835236.blog.51cto.com/11825236/1828252

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!