• Java集合类--->入门下篇


    HashSet集合  

      在上篇大概了解了什么是集合类,知道它可以存储任意类型的对象,并且比数组灵活,集合类的长度可以变化。这里将接着介绍一下,Set接口的实现类之一,HashSet集合,Set集合:元素不能重复,无序(双否定)与List集合恰好相反(双肯定),不过两者都是单列集合。

      Set接口主要有两个实现类,一个是HashSet,一个是TreeSet,前者是根据对象的哈希值确定元素在集合中的存储位置,因此具有良好的存取和查找性能,后者是以二叉树的方式存储元素,它可以实现对集合中的元素进行排序

      对于应用系列,直接上例子:  

     1 package testCollection;
     2 import java.util.*;
     3 public class testHash {
     4     public static void main(String[] args) {
     5         HashSet hashSet = new HashSet();
     6         hashSet.add("wangwu");
     7         hashSet.add("1234");
     8         hashSet.add(123);
     9         hashSet.add(123);//这里再次出现123这个对象,重复但编译器未报异常
    10         Iterator it = hashSet.iterator();
    11         while(it.hasNext())
    12         {
    13             System.out.print(it.next()+" 	");
    14         }
    15 
    16     }
    17 
    18 }

    输出结果:

      Integer类型的“123”只出现了一次,说明第二次的“123”根本没有添加进集合中。HashSet之所以能确保不出现重复的元素,是因为在向Set中添加对象时,会先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则将这个对象直接存贮在此位置,若此对象已经有对象存储,在通过equals()比较这两个对象是否相同,如果相同,则后一个对象就不能再添加进来。提醒:equals()比较的是对象的内容是否相等,“==”比较的是对象引用所指向的堆位置是否相同。这个过程发生在运行阶段,并非编译阶段,所以敲代码时不会报错。

      如果数据量足够庞大,且需要进行排序,请考虑使用TreeSet。

    HashMap双列集合

      前面提到过,双列集合就是键值对,一个键对应一个值,就像我们的函数一样,自变量对应于一个因变量。主要了解一下常使用的双列集合HashMap与Properties,下面分别介绍介绍。

      看看HashMap的官方帮助文档介绍: 

      HashMap集合是基于哈希表的Map接口实现的,用于存储键值的映射关系,但是不保证映射的顺序,先来演示一下:

     1 package testCollection;
     2 import java.util.*;
     3 public class testHashMap {
     4     public static void main(String[] args) {
     5         HashMap<Integer,String> hashMap = new HashMap<Integer,String>();
     6         //put方法:添加键值对
     7         hashMap.put(13, "ZSY");
     8         hashMap.put(25, "LZ");
     9         hashMap.put(30, "HY");
    10         hashMap.put(49, "ZYC");
    11         hashMap.put(52, "HHZ");
    12         //keySet方法:获取键的集合
    13         Set keyset=hashMap.keySet();
    14         Iterator it = keyset.iterator();
    15         while(it.hasNext())
    16         {
    17             System.out.print(it.next().toString()+" 	");
    18         }
    19         System.out.println("
    ");
    20         //values方法:获取值得集合
    21         Collection coll = hashMap.values();
    22         it=coll.iterator();
    23         while(it.hasNext())
    24         {
    25             System.out.print(it.next().toString()+"	");
    26         }
    27         //输出键值对
    28         System.out.println("
    ");
    29         System.out.println(hashMap);
    30     }
    31 
    32 }

    输出结果:

    49     52     25     13     30     
    
    ZYC    HHZ    LZ    ZSY    HY    
    
    {49=ZYC, 52=HHZ, 25=LZ, 13=ZSY, 30=HY}

      直接印证了HashMap不保证映射的顺序,不再做多余解释。

      大神说,还有一个经常用的方法就是通过键获得值,get方法。举个例子:(基于上面的代码)

    1         Set keyset=hashMap.keySet();
    2         Iterator it = keyset.iterator();
    3         while(it.hasNext())
    4         {
    5             Object key = it.next();
    6             Object value = hashMap.get(key);
    7             System.out.println("键:"+key.toString()+"  值:"+value.toString());
    8         }

    输出结果:

      其实以上便是Map的一种遍历方式,但是还有另外一种常用遍历方式:先获取集合中的所有映射关系,然后从映射关系中取出键和值。在进行例子演示前,我得先学习一下Map.Entry。Map.Entry 是Map中的一个接口,表示一个映射项(就是键值对,里面有Key和Value),Map.Entry里有相应的getKey和getValue方法,让我们能够从一个项中取出Key和Value。

      上面那段话,可能对于我这种初学者稍微有些抽象。于是我换种解释,看上个例子中代码第6行,这种遍历方式得思想就是:先得到key,然后通过key去得到value,然而使用Entry可以一次性得到这两种值。那么它究竟是怎么实现的,我给自己举一个例子:

     1 //entrySet()方法
     2         Set entSet = hashMap.entrySet();
     3         Iterator itor = entSet.iterator();
     4         while(itor.hasNext())
     5         {
     6             Map.Entry entry = (Entry) itor.next();
     7             System.out.println(entry.getValue()); 
     8             System.out.println(entry.getKey());
     9         
    10         }

      说白了,entry表示的就是键值对,因此键与值都包含了。但是entrySet()方法返回的还是一个Set集合,只不过是下面这种形式的:

    49=ZYC
    52=HHZ
    25=LZ
    13=ZSY
    30=HY

      因此,提供了分别获取键与值的方法,getKey()、getValue()的方法。个人猜测,它实现的方式就是以“=”为分隔符号,分别取左边或者右边,由此得到键与值。总之,记住,它是一种较好的遍历方式就行了。

    Properties双列集合

      很容易知道properties的汉语意思:属性,我就习惯称它为属性集合,它是一个class,主要用于存储字符串类型的键和值,实现了Map接口,所以它也是一种简单的Map集合,大神说:在实际开发中,经常使用properties集合存取应用的配置项,假如说:设计一个绘图工具,要求字体为微软雅黑、字号为20px、字体颜色为绿色,那么:

    font=微软雅黑
    size= 20px
    color=green

      这个类主要提供了针对于字符串的存取以及保存到文件的方法。

     1 package testCollection;
     2 import java.util.*;
     3 public class testProperties {
     4     public static void main(String[] args) {
     5         Properties p = new  Properties();
     6         p.setProperty("123", "123123");
     7         p.setProperty("456", "456456");
     8         p.setProperty("789", "789789");
     9         Set<String> num=p.stringPropertyNames();
    10         Iterator it = num.iterator();
    11         while(it.hasNext())
    12         {
    13             String str = it.next().toString();
    14             System.out.println(p.getProperty( str));
    15             System.out.println(str);
    16         }
    17     }
    18 }

    输出结果:

    123123
    123
    456456
    456
    789789
    789

    集合类暂时讲这么多吧,注意it.next()在while中一般只能出现一次。

      

      

      

  • 相关阅读:
    深入理解RunLoop
    Universal Framework for iOS
    Framework的制作流程,Xode-6.0.1
    Xcode 6制作动态及静态Framework
    Volley与Picasso的对比
    WebView全面学习(二)-- Native与js双方通信
    WebView全面学习(一)--常用类和方法
    Hybrid框架安全隐患分析
    Android笔记--View绘制流程源码分析(二)
    Android笔记--View绘制流程源码分析(一)
  • 原文地址:https://www.cnblogs.com/Cirgo/p/8446812.html
Copyright © 2020-2023  润新知