Java集合详讲

一.JAVA集合整体框架结构:

Collection接口:

      1.List接口:存入的对象是有序的,允许重复,只需要重写equals()方法;

        1)ArrayList类:可添加null元素,依赖数组实现,随机访问较好,当需要大量插入、删除操作时性能较差,不真正存放对象,之存放对象引用;

        2)LinkedList类:依赖双链表实现,插入、删除性能较好,随机访问性能较差;

        3)Vector类:比较老的实现类,已被淘汰,线程安全;

  2.Set接口:存入的对象是无序的,但无序并不等于随机,每次执行结果是相同的,不允许重复,添加进Set中的元素所在的类一定要重写equals()和hashCode()方法保证Set不可重复性;

1)HashSet类:元素存储不保证顺序,可添加null,但只能添加一次;

2)LinkedHashSet类:使用链表维护了添加进集合的顺序导致遍历LinkedHashSet元素集时是按照添加进的元素顺序遍历的;

3)SortedSet接口:

   ①TreeSet类:以下部分详讲;

Map接口:

1.HashMap类:通过哈希码存储,不保证顺序,允许键为null,但只能出现一次;

2. LinkedHashMap类:使用链表维护了添加进集合的顺序导致遍历LinkedHashMap元素集时是按照添加进的元素顺序遍历的;

3.Hashtable类:比较老的实现类,线程安全,不允许使用null作为key和value;

4.SortedMap接口:

  ①TreeMap类:以下部分详讲;

二.List接口:

  1.数组和List之间的转换:

   1)数组转集合:

      Arrays类的asList(T... a)方法,返回由指定数组支持的固定大小的列表。如:List<String> strlist = Arrays.asList("zhangsan","lisi");

  2)集合转数组,如下所示:

     List lst = new ArrayList();

        lst.add(123);

        lst.add(456);

        Object[] obj =lst.toArray();

        for(Object o:obj){

             System.out.println(o);

        }

  2.List的遍历,具体见下面实例:

     ① iterator()方法;

     ②增强for循环;

  3.List的常用方法:

方法

描述

add(E e)

在集合的后面添加元素

add(int index, E element)

在集合的指定位置添加元素

remove(int index)

删除指定索引的元素

remove(Object o)

删除指定对象

clear()

删除集合中的所有元素

set(int index, E element)

在指定位置替换元素,返回对象

get(int index)

返回指定集合位置的元素

indexOf(Object o)

返回指定元素出现的第一个索引,如无返回-1

LastIndexOf(Object o)

返回指定元素出现的第一个索引(从后向前查找),如无返回-1

isEmpty()

若集合无元素返回true

contains(Object o)

查询是否包含指定元素,是则返回true

equals(Object o)

是否和制定集合相等,如是返回true

iterator()

返回集合的迭代方法

hashCode()

返回列表中哈希表的值

size()

返回列表的元素数量

toArray()

返回一个数组,包含列表的所有元素

     

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三.Set接口

 1.Set数据存储过程:

当向Set中添加对象时首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了对象在Set中的存储位置,若此对象之前没有对象存储,则这个对象直接存储到该位置,若此位置已有对象存储再通过equals()方法比较两个对象是否相同,若相同则此对象就不能添加进来,若不相同则两个对象存储在同一位置,此方案不建议使用,需保证hashCode()和equals()方法一致性;

2.TreeSet类

存储对象要求:

   1)只能添加同一个类的对象;

   2)可按照添加进集合中的元素的指定顺序遍历;

  排序方法:

1)自然排序(添加类时要实现Comparable接口):

要求自定义类实现java.lang. Comparable接口并重写其compareTo(T o)方法,在其中指明按照哪个属性进行排序,向TreeSet中添加元素时首先按照compareTo(T o)进行比较,一旦返回0,虽然仅仅是两个对象  的此属性值相同,但程序会认为这连个对象是相同的,后一个对象不能添加进来;PS: compareTo(T o)与hashCode()和equals()方法保持一致,当返回为0是认为属性值是一样的;

2)定制排序要求:

①创建一个实现了Comparator接口的类对象;

②将此对象作为形参传递给TreeSet构造器中;

③向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象;

四.Map接口(key和value均为引用数据类型,key用set存放,不允许重复,常用String):

  1.HashMap类:

   1)Key是用Set来存放的,不可重复,values是用Collection来存放的,可重复,一个key-value对是一个Entry,所有的Entry是用Set来存放的,也不可重复;

   2)向HashMap中添加元素时会调用key所在类的equals()方法判断两个key是否相同,若相同则不能添加进后添加的元素。

   3)如何遍历Map?详细见下面实例;

      ①Set KeySet():遍历key

      ②Collection Values():遍历values

      ③Set entrySet():遍历key-value

  4)HashSet是一个特殊的HashMap,当values为NULL时,此时HashMap就为HashSet;

  2.TreeMap:按照添加进Map中的元素的Key的指定顺序进行排序;

要求:key必须是同一个类的对象,也有自然排序和定制排序两种;

  3.Properties类:继承Hashtable,常用来处理属性文件,键和值均为String类型;

五.常用操作类:

  操作集合工具类:Collections,可操作Collection以及Map的工具类;操作数组工具类:Arrays

六.应用实例:

 1.List集合遍历的三种方法比较:

package com.test;

import java.util.ArrayList;

import java.util.List;

import java.util.Iterator;

public class test {

   public static void main(String[] args) {

      List alist = new ArrayList();

      alist.add(123);

      alist.add(456);

      alist.add(245);

      //三种迭代方法比较

        //内部不锁定,效率最高,但在多线程要考虑并发操作的问题;

      for(int i=0;i<alist.size();i++){

         System.out.println(alist.get(i));

      }    

      //其内部还是调用了迭代器遍历的方式,这种循环方式有限制,不建议使用;

       for(Object j : alist){

         System.out.println(j);

      }

      //执行过程中会执行数据锁定,性能较差,若要去掉元素必须用iter.remove()方法;

      Iterator iter = alist.iterator();

      while(iter.hasNext()){

         System.out.println(iter.next());

      }

   }

}

2.Map的遍历实例:

package com.test;

import java.util.*;

public class test {

   public static void main(String[] args) {

      Map map = new HashMap();

      map.put(001, "zhangsan");

      map.put(002, "lisi");

      map.put(003, "wangmazi");

      //1.遍历key

      Set keyset = map.keySet();

      for(Object keys:keyset){

         System.out.println(keys);

      }

      //2.遍历value

      Collection coll = map.values();

      Iterator i = coll.iterator();

      while(i.hasNext()){

         System.out.println(i.next());

      }

      //3.遍历key-value

      //方式1

      Set set1 = map.keySet();

      for(Object keys:set1){

         System.out.println(keys+"->"+map.get(keys));

      }

      //方式2

      Set set2 = map.entrySet();

      for(Object ss:set2){

         Map.Entry s = (Map.Entry)ss;

         System.out.println(s.getKey()+"->"+s.getValue());

      }

   }

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值