zoukankan      html  css  js  c++  java
  • List和Map集合详细分析

    1.Java集合主要三种类型(两部分):

    第一部分:Collection(存单个数据,只能存取引用类型)

      (1).List :是一个有序集合,可以放重复的数据;(存顺序和取顺序相同)

      (2).Set :是一个无序集合,不允许放置重复的数据;(存顺序和取顺序不一定相同)

      (3).SortedSet:无序不可重复,存进去的元素可以按照元素的大小自动排序。

    第二部分:Map(存成对数据)

      (1).Map: 是一个无序集合,集合中包含一个键对象,一个值对象,键对象不允许重复,值对象可以重复(身份证号-姓名)。

    2.Java集合存取数据类型及结构

    2.1  常见集合的继承结构-Collection

       

                                              

    2.1.1、集合中常用实现类的数据结构分析:

    (1)List集合

      List集合继承了Collection接口,因此包含了collection中所有的方法,此外,List接口还定义了以下两个非常重要的方法:

      (a)get(int index):获得指定索引位置的元素

      (b)set(int index,Object obj):将集合中指定索引位置的对象修改为指定对象。

    (2)ArrayList

      采用数组存储元素,适合查询,不适合随机增删元素。(常用)。是可变数组,允许保存所有的元素,包括null,并可以根据索引位置对集合进行快速的随机访问:缺点是指定的索引位置插入对象或删除对象的速度较慢。

    (3)LinkedList

      底层采用双向链表数据结构存储数据,适合频繁的增删元素,不适合查询元素。

    (4)Vector

      底层和ArrayList集合相同,但是 Vector是线程安全的,效率较低。(不常用)

    (5)Set集合

       Set集合中的元素不按特定的方式排序,只是简单地把对象加入集合,Set集合中不能包含重复对象。set集合有Set接口的实现类组成,set接口继承了Collection接口,因包含了Collction接口的所有方法。 Set的构造方法有一个约束条件,传入的Collection对象不能把有重复值,必须小心操作可变对象(Mutable Object)。如果一个Set中可变元素改变了自身状态导致Object。equals(Object) = true,则会出现一些问题。

    (6)HashSet

      哈希表/散列表,底层是一个HashMap。HashSet有以下特点:

      a. 不能保证元素的排列顺序,顺序有可能发生变化
      b.不是同步的
      c. 集合元素可以是null,但只能放入一个null

      当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。

           简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相 等。
      注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。

      其规则是如果两个对 象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算 hashCode的值。

    (5)TreeSet:

      TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式, 自然排序定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。

      自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。
      Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。
       obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是 负数,则表明obj1小于obj2。  
      如果我们将两个对象的equals方法总是返回true,则这两个对象的compareTo方法返回应该返回0    
    b.定制排序
      定制排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法

    2.1.2、Collection接口中的方法分析:

    (1).list集合

     1 package list;
     2 import java.util.*;
     3 import java.util.ArrayList;
     4 public class Gather { // 创建类Gather
     5     public static void main(String[] args) { // 主方法
     6       List<String> list = new ArrayList<>();//创建集合对象
     7       list.add("a");
     8       list.add("b");
     9       list.add("c");
    10       //获得0~2之间随机数
    11       int i = (int)(Math.random()*(list.size() - 1));
    12       System.out.println("随机数组中的元素: "+list.get(i));
    13       list.remove(2);//将指定索引位置的元素从集合中移除
    14       System.out.println("将索引是2的元素从数组中移除后数组中的元素是:");
    15       for(int j = 0;j < list.size();j++){//循环遍历结合
    16           System.out.println(list.get(j));
    17       }
    18    }
    19     
    20 }
    21 /*
    22 运行结果:
    23 
    24 随机数组中的元素: a
    25 将索引是2的元素从数组中移除后数组中的元素是:
    26 a
    27 b
    28 */
    View Code

    (2)set集合

     1 import java.util.*;
     2 /**
     3  * 在项目中创建类UpdateStu,实现Comparable接口,重写该接口中的compareTo()方法。在主方法中
     4  * 创建UpdateStu对象,创建集合,并将UpdataStu对象添加到集合中,遍历该集合中的全部元素,以及通过
     5  * headSet(),subSet()方法获得的全部的部分集合。
     6  * @author z
     7  *
     8  */
     9 public class UpdateStu implements Comparable<Object> {
    10     String name;
    11     long id;
    12     public UpdateStu(String name, long id) {
    13         this.id = id;
    14         this.name = name;
    15     }
    16     public int compareTo(Object o) {
    17         UpdateStu upstu = (UpdateStu) o;
    18         int result = id > upstu.id ? 1 : (id == upstu.id ? 0 : -1);
    19         return result;
    20     }
    21     public long getId() {
    22         return id;
    23     }
    24     public void setId(long id) {
    25         this.id = id;
    26     }
    27     public String getName() {
    28         return name;
    29     }
    30     public void setName(String name) {
    31         this.name = name;
    32     }
    33     public static void main(String[] args) {
    34         UpdateStu stu1 = new UpdateStu("李同学", 01011);
    35         UpdateStu stu2 = new UpdateStu("陈同学", 01021);
    36         UpdateStu stu3 = new UpdateStu("王同学", 01051);
    37         UpdateStu stu4 = new UpdateStu("马同学", 01012);
    38         TreeSet<UpdateStu> tree = new TreeSet<>();
    39         tree.add(stu1);
    40         tree.add(stu2);
    41         tree.add(stu3);
    42         tree.add(stu4);
    43         Iterator<UpdateStu> it = tree.iterator();
    44         System.out.println("Set集合中的所有元素:");
    45         while (it.hasNext()) {
    46             UpdateStu stu = (UpdateStu) it.next();
    47             System.out.println(stu.getId() + " " + stu.getName());
    48         }
    49         it = tree.headSet(stu2).iterator();
    50         System.out.println("截取前面部分的集合:");
    51         while (it.hasNext()) {
    52             UpdateStu stu = (UpdateStu) it.next();
    53             System.out.println(stu.getId() + " " + stu.getName());
    54         }
    55         it = tree.subSet(stu2, stu3).iterator();
    56         System.out.println("截取中间部分的集合");
    57         while (it.hasNext()) {
    58             UpdateStu stu = (UpdateStu) it.next();
    59             System.out.println(stu.getId() + " " + stu.getName());
    60         }
    61     }
    62 }
    63 /*
    64 运行结果:
    65 
    66   
    67 
    68 Set集合中的所有元素:
    69 521 李同学
    70 522 马同学
    71 529 陈同学
    72 553 王同学
    73 截取前面部分的集合:
    74 521 李同学
    75 522 马同学
    76 截取中间部分的集合
    77 529 陈同学
    78 
    79    分析:存入TreeSet类实现的Set集合必须实现Comparable接口,该接口中的compareTo(Object o)方法比较此对象与指定对象的顺序,如果该对象小于,等于,或大于指定对象,则分别返回负整数,0或正整数。
    80 */
    View Code

    (3)contains方法:boolean contains(object o);判断集合中是否包含某个元素

     1 import java.util.*;
     2 
     3 class  Collection01
     4 {
     5     //重写equals方法
     6     
     7     public static void main(String[] args) 
     8     {
     9         //创建集合
    10         Collection c = new ArrayList();
    11         //创建Integer类型对象
    12         Integer i1 = new Integer(10);
    13         //添加元素
    14         c.add(i1);
    15         //判断集合中是否包含i1
    16         System.out.println(c.contains(i1));//true
    17         
    18         Integer i2= new Integer(10);
    19         System.out.println(c.contains(i2));//true
    20         
    21         Manager m1=new Manager(100,"JACK");
    22         c.add(m1);
    23         //contasins方法调用底层的是equals方法,如果equals方法返回True,就是包含
    24         System.out.println(c.contains(m1));//true
    25         
    26         Manager m2=new Manager(100,"JACK");
    27         //重写equas方法之前返回false,(比较内存地址)
    28         //System.out.println(c.contains(m2));//false
    29         //重写equas方法之后返回True,集合中的对象都要重写equalos方法(比较内容)
    30         System.out.println(c.contains(m2));//true
    31      
    32     }
    33 }
    34 class Manager
    35 { 
    36    int no;
    37    String name;
    38    Manager(int no,String name)
    39    {
    40        this.no=no;
    41        this.name=name;
    42    }
    43    public boolean equals(Object o)
    44    {
    45        if(this==o) return true;
    46        if(o instanceof Manager)
    47        {
    48          Manager m = (Manager)o;
    49          if(m.no == this.no && m.name.equals(this.name))
    50            {
    51              return true;
    52            }
    53        }
    54        return false;
    55    }
    56 
    57 }
    View Code

    (4)remove方法:boolean remove(object o);删除集合中的某个元素

     1 import java.util.*;
     2 /*
     3   boolean remove(Object o)
     4   集合中的元素都需要重写equals方法,在Object的equals方法比较内存地址,在解决实际问题的时候应该比较内容
     5 */
     6 
     7 class  Remove
     8 {
     9     public static void main(String[] args) 
    10     {
    11         Collection c = new ArrayList();
    12         Integer i1 = new Integer(10);
    13         c.add(i1);
    14         Integer i2=new Integer(10);
    15         c.remove(i2);
    16         System.out.println(c.size());//0
    17         Manager m2=new Manager(100,"ZHANG");
    18         c.remove(m2);
    19         System.out.println(c.size());//0
    20     }
    21 }
    22 class Manager
    23 { 
    24    int no;
    25    String name;
    26    Manager(int no,String name)
    27    {
    28        this.no=no;
    29        this.name=name;
    30    }
    31    
    32 }
    View Code

    (5)两种remove方法的区别

      a.迭代器的remove方法

     1 import java.util.*;
     2 
     3 class  Remove1
     4 {
     5     public static void main(String[] args) 
     6     {
     7         Collection c = new ArrayList();
     8         c.add(1);
     9         c.add(2);
    10         c.add(3);
    11         Iterator it = c.iterator();
    12         while(it.hasNext())
    13         {
    14             Object element = it.next();
    15             it.remove();
    16         }
    17         System.out.println(c.size());
    18     }
    19 }
    View Code

      b.集合自身带的remove方法

     1 import java.util.*;
     2 
     3 class  Remove1
     4 {
     5     public static void main(String[] args) 
     6     {
     7         Collection c = new ArrayList();
     8         c.add(1);
     9         c.add(2);
    10         c.add(3);
    11         Iterator it = c.iterator();
    12         while(it.hasNext())
    13         {
    14             Object element = it.next();
    15             c.remove(element);
    16             //集合自身带的remove在将元素删除后,迭代器失效,需要重新获得迭代器,若不添加此语句,则会出现异常
    17             it = c.iterator();
    18         }
    19         System.out.println(c.size());
    20     }
    21 }
    View Code

    2.1.3、List接口中的方法分析:(有序可重复)

    (1).添加元素,遍历元素

     1 import java.util.*;
     2 
     3 class Main   //有序可重复
     4 {
     5     public static void main(String[] args) 
     6     {
     7         List L = new ArrayList();
     8         L.add(100);
     9         L.add(200);
    10         L.add(1300);
    11         L.add(120);
    12         L.add(100);
    13         Iterator it = L.iterator();
    14         while (it.hasNext())
    15         {
    16            Object element =  it.next();
    17            System.out.println(element);
    18         }
    19         
    20     }
    21 }
    View Code

    (2)ArrayList底层原理

     1 package shili;
     2 
     3 import java.util.*;
     4 /**
     5  * ArrayList底层集合是数组
     6  * ArrayList默认容量是10,扩容后的新容量是原容量的1.5倍
     7  * vector集合底层默认初始容量是10,扩容后是原容量的2倍。
     8  * 如果优化ArrayList和Vector?
     9  * 尽量减少扩容操作,扩容需要拷贝数组,拷贝很消耗内存,一般在创建集合时指定初始化
    10 */
    11 class Main
    12 {
    13     public static void main(String[] args) 
    14     {
    15         //创建List集合
    16         List l = new ArrayList();
    17         l.add(10);
    18         l.add(20);
    19         l.add(30);
    20         //在下标为1的位置上添加100
    21         l.add(1,100);
    22         //获取第一个元素
    23         System.out.println(l.get(0));
    24         //便利(List集合特有的便利方式)
    25         System.out.println("--------------------");
    26         for(int i=0;i<l.size();i++){
    27             Object element= l.get(i);
    28             System.out.println(element);
    29         }
    30         
    31     }
    32 }
    View Code

    (3)ArrayList与Vector的区别

      a.Vector是线程安全的,Arrayliast是线程不安全的 。

      b.ArrayList在底层数组不够用的时候扩展为原来的1.5倍,Vector默认扩展为你原来的2倍。

      对于第一点可以通过原码来观察:

      vector原码:

     1 public class Vector<E>
     2     extends AbstractList<E>
     3     implements List<E>, RandomAccess, Cloneable, java.io.Serializable
     4 {
     5     /**
     6      * The array buffer into which the components of the vector are
     7      * stored. The capacity of the vector is the length of this array buffer,
     8      * and is at least large enough to contain all the vector's elements.
     9      *
    10      * <p>Any array elements following the last element in the Vector are null.
    11      *
    12      * @serial
    13      */
    14     protected Object[] elementData;
    View Code

      Vector的add方法:

    1 public synchronized boolean add(E e) {
    2         modCount++;
    3         ensureCapacityHelper(elementCount + 1);
    4         elementData[elementCount++] = e;
    5         return true;
    6     }
    View Code

      ArrayList的add方法

    1  public boolean add(E e) {
    2          ensureCapacityInternal(size + 1);  // Increments modCount!!
    3          elementData[size++] = e;
    4          return true;
    5      }
    View Code

      分析:从add方法中可以看到,vector的add方法中添加了synchronized关键字来保证vector的线程是安全的。

    其实vector的其他方法中,也都加了synchronized关键字。

    2.1.4  set接口中的方法分析:(无序不可重复)

    (1).HasHset

                             

     1 /*
     2   set集合中存储元素,该元素的hashCode和equals方法
     3   HashMap中有一个put的方法,put(key,value) key是无序不可重复的
     4   存储在hashSet集合或者HashMap集合Key部分的元素,需要同时重写hashCode方法和equals方法
     5 */
     6 import java.util.*;
     7 class  SetTest
     8 {
     9     public static void main(String[] args) 
    10     {
    11         //创建集合
    12         Set es =new HashSet();
    13         Employee e1 = new Employee("1000","u1");
    14         Employee e2 = new Employee("1001","u2");
    15         Employee e3 = new Employee("2000","u3");
    16         Employee e4 = new Employee("2001","u4");
    17         Employee e5 = new Employee("2001","u4");
    18       
    19        es.add(e1);
    20        es.add(e2);
    21        es.add(e3);
    22        es.add(e4);
    23        es.add(e5);
    24       System.out.println(es.size());
    25 
    26     }
    27 }
    28 
    29 //员工编号1000~9999
    30 class Employee
    31 {
    32     String no;
    33     String name;
    34     Employee(String no,String name)
    35     {
    36         this.no=no;
    37         this.name=name;
    38     }
    39     //重写equals方法,如果员工编号相同,并且名字相同,则是同一个对象
    40     public boolean equals(Object o)
    41     {
    42         if(this == o) {
    43          return true;
    44         }
    45         if(o instanceof Employee){
    46           Employee e= (Employee)o;
    47           if(e.no.equals(this.no) && e.name.equals(this.name)){
    48             return true;
    49           }
    50         }
    51         return false;
    52     }
    53     //重写hashCode方法
    54     public int hashCode()
    55     {
    56         return no.hashCode();
    57     }
    58 
    59 }
    View Code

    (2)SortedSet

     1 /*
     2   java.util.Set;
     3     java.util.SortSet;无序不可重复,但是进去的元素可以按照元素的大小顺序自动进行排序
     4       java.util.TreeSet;
     5 */
     6 import java.util.*;
     7 import java.text.*;
     8 class  SortSettest
     9 {
    10     public static void main(String[] args) throws ParseException 
    11     {
    12         //创建集合
    13         SortedSet ss = new TreeSet();
    14         //天加元素 自动装箱
    15         ss.add(30);
    16         ss.add(20);
    17         ss.add(33);
    18         ss.add(10);
    19         ss.add(60);
    20         ss.add(8);
    21         //遍历
    22         Iterator it = ss.iterator();
    23         while(it.hasNext()){
    24            Object e = it.next();
    25            System.out.println(e);
    26         }
    27         //String
    28         SortedSet str = new TreeSet();
    29         str.add("zhangsan");
    30         str.add("lisi");
    31         str.add("wangwu");
    32         str.add("maliu");
    33         str.add("liuba");
    34         //遍历
    35         it = str.iterator();
    36         while(it.hasNext()){
    37            Object e = it.next();
    38            System.out.println(e);
    39         }
    40         //Date
    41      SortedSet times =  new TreeSet();
    42         String t1 = "2009-10-01";
    43         String t2 = "2012-01-01";
    44         String t3 = "2014-06-08";
    45         String t4 = "2018-07-01";
    46         String t5 = "2008-08-08";
    47         //设置格式
    48       SimpleDateFormat def = new SimpleDateFormat("yyyy-MM-dd");
    49         //日期格式化
    50         Date ut1 = def.parse(t1);
    51         Date ut2 = def.parse(t2);
    52         Date ut3 = def.parse(t3);
    53         Date ut4 = def.parse(t4);
    54         Date ut5 = def.parse(t5);
    55         //添加
    56         times.add(ut1);
    57         times.add(ut2);
    58         times.add(ut3);
    59         times.add(ut4);
    60         times.add(ut5);
    61         //遍历
    62 
    63         it = times.iterator();
    64         while(it.hasNext()){
    65            Object e = it.next();
    66            if(e instanceof Date){
    67              Date d = (Date)e;
    68              System.out.println(def.format(d));
    69            }
    70           
    71         }
    72 
    73  
    74     }
    75 }
    View Code

    (3)SortedSet内部的比较方法compareTo()

     1 /*
     2    SortedSet集合存储元素内部排序方法
     3    sun编写TreeSe集合添加元素的时候,会调用compareTo方法完成比较
     4 */
     5 import  java.util.*;
     6 class  SortSet
     7 {
     8     public static void main(String[] args) 
     9     {
    10         SortedSet users = new TreeSet();
    11         User u1 = new User(10);
    12         User u2 = new User(20);
    13         User u3 = new User(13);
    14         User u4 = new User(15);
    15         User u5 = new User(2);
    16         users.add(u1);
    17         users.add(u2);
    18         users.add(u3);
    19         users.add(u4);
    20         users.add(u5);
    21         //遍历
    22         Iterator it = users.iterator();
    23         while(it.hasNext())
    24         {
    25            System.out.println(it.next());
    26         }
    27     }
    28 }
    29 class User implements Comparable //必须实现comparable接口
    30 {
    31     int age;
    32     User(int age)
    33     {
    34         this.age=age;
    35     }
    36     public String toString(){
    37        return "User[age="+age+"]";
    38     }
    39     //实现java.lang.Comparable;接口中的comparable方法
    40     //按照user的age进行排序
    41     @Override
    42     public int compareTo(Object o) {
    43         // TODO 自动生成的方法存根
    44         int age1=this.age;
    45         int age2=((User)o).age;
    46         return age2-age1;
    47     }
    48 }
    View Code

    (4)SortedSet内部的比较方法Comparator

     1 /*
     2 SortedSet集合存储元素内部排序方法
     3 */
     4 import java.util.*;
     5 import java.util.Comparator;
     6 class Main 
     7 {
     8     public static void main(String[] args) 
     9     {
    10         //创建TreeSet集合的时候提供一个比较器
    11         SortedSet products = new TreeSet(new ProductComparator());
    12         Product p1 = new Product(2.0);
    13         Product p2 = new Product(3.0);
    14         Product p3 = new Product(1.0);
    15         Product p4 = new Product(6.0);
    16         Product p5 = new Product(5.0);
    17         //添加元素
    18         products.add(p1);
    19         products.add(p2);
    20         products.add(p3);
    21         products.add(p4);
    22         products.add(p5);
    23         //遍历
    24         Iterator it = products.iterator();
    25         while(it.hasNext()){
    26            System.out.println(it.next());
    27         }
    28     }
    29 }
    30 
    31 
    32 class Product 
    33 {
    34     double price;
    35     Product(double price)
    36     {
    37         this.price=price;
    38     }
    39     public String toString(){
    40       return price + "";
    41     }
    42 }
    43 
    44 
    45 class ProductComparator implements Comparator
    46 {
    47     @Override
    48     public int compare(Object o1, Object o2) {
    49         // TODO 自动生成的方法存根
    50         double price1 = ((Product)o1).price;
    51         double price2 = ((Product)o2).price;
    52         if(price1 == price2){
    53          return 0;
    54         }
    55         else if(price1>price2){
    56         return 1;
    57         }
    58         else{
    59         return -1;
    60         }
    61     }
    62 }
    View Code

    2.2  常见集合的继承结构-Map

                                                                       

    2.2.1 Map集合中常用实现类的数据结构及特点

      (1)HashMap :

      哈希表/散列表,底层是一个哈希表,HashMap中的Key等同一个Set集合(无序不重复,结构如下图),允许key或vaue为空,线程不安全。如果要使map线程安全,方法参考:http://www.cnblogs.com/cloudwind/archive/2012/08/30/2664003.html

                                                                                                        图. 哈希表/散列表

    (2)Hashtable

      线程安全的效率低。不允许key或vaue为空,线程安全。

    (3)Properties

       属性类,也可以是Key 和value的方式存储元素,但是Key 和value只能是字符串类型。Properties是HashTable的子类,不过Properties添加了两个方法,load()和store()可以直接导入或者将映射写入文件。

    (4)SortedMap

      SortedMap中的key存储元素的特点是:无序不可重复,但可以按照元素的大小进行自动排序,SortedMap中的key等同于SortedSet。

    (5)TreeMap

      TreeMap的Key就是一个TreeSet。

    (6)LinkedHashMap

      详解:http://www.cnblogs.com/chenpi/p/5294077.html 

    2.2.2、 Map集合中常用的方法分析

                               

     1 /*
     2   Map中常用的方法举例
     3   *存储在Map集合key部分的元素需要重写hashCode+equals方法
     4 */
     5 import java.util.*;
     6 class Maptest
     7 {
     8     public static void main(String[] args) 
     9     {
    10         //创建Map集合
    11         Map persons = new HashMap();//HashMap的默认初始化容量是16,默认加载因子是0.75
    12         //存储键值对
    13         persons.put("10000","lisi");
    14         persons.put("10001","张三");
    15         persons.put("10002","wangwu");
    16         persons.put("10003","maliu");
    17         persons.put("10004","zhaoqi");
    18         //判断键值对你的个数,map中的key是无序不可重复的,和HashSet相同
    19         System.out.println(persons.size());
    20 
    21         System.out.println(persons.containsKey("10000"));
    22          
    23         System.out.println(persons.containsValue("张三"));
    24 
    25         System.out.println(persons.get("10000"));
    26  
    27         persons.remove("10004");
    28         System.out.println(persons.size());
    29 
    30         //获取所有的value
    31         Collection value = persons.values();
    32         Iterator it = value.iterator();
    33         while(it.hasNext())
    34         {
    35             System.out.println(it.next());
    36         }
    37         //获取所有的Key
    38         Set keys = persons.keySet();
    39         Iterator it2 = keys.iterator();
    40         while(it2.hasNext())
    41         {
    42             Object id = it2.next();
    43             Object name = persons.get(id);
    44             System.out.println(id+"->"+name);
    45         }
    46         //返回此映射中包含的映射关系的Set图
    47         Set entrySet = persons.entrySet();
    48         Iterator it3 = entrySet.iterator();
    49         while(it3.hasNext())
    50         {
    51             System.out.println(it3.next());
    52         }
    53         /*
    54           输出结果
    55           10001=张三
    56           10002=wangwu
    57           10000=lisi
    58           10003=maliu
    59         */
    60     }
    61 }
    View Code

    (1)Hashtable集合中常用的方法分析

     1 /*
     2    HashMap默认初始化容量是16,默认加载因子是0.75
     3    Hashtable 默认初始化容量是11,默认家在因子是0.75
     4    java.util.Properties,是由key和value都是字符串类型
     5 */
     6 import java.util.Properties;
     7 class  MapProperties
     8 {
     9     public static void main(String[] args) 
    10     {
    11         //创建属性类对象
    12         Properties p = new Properties();
    13         //存数据
    14         p.setProperty("1000","z");
    15         p.setProperty("1001","d");
    16         p.setProperty("1002","s");
    17         p.setProperty("1003","j");
    18         //遍历,通过key获取value
    19         String v1 = p.getProperty("1000");
    20         String v2 = p.getProperty("1001");
    21         String v3 = p.getProperty("1002");
    22         String v4 = p.getProperty("1003");
    23 
    24         System.out.println(v1);
    25         System.out.println(v2);
    26         System.out.println(v3);
    27         System.out.println(v4);
    28     }
    29 }
    30 /*
    31 运行结果 
    32    z 
    33    d
    34    s
    35    j
    36 */
    View Code

    (2)SortedMap集合的用法

     1 import java.util.*;
     2 
     3 /*
     4 SortedMap中的key特点:无序不可重复,但存进去的元素可以按照大小自动排序
     5 key的特点:1.实现Comparable接口2,,单独写一个比较器
     6 */
     7 class  SortedMaptest02
     8 {
     9     
    10     public static void main(String[] args)
    11     {
    12         //Map,Key存储Product,value个数
    13         SortedMap<Product, Double> product = new TreeMap<Product, Double>();
    14         //准备对象
    15         Product p1 = new Product("肉1",12.0);
    16         Product p2 = new Product("肉2",10.0);
    17         Product p3 = new Product("肉3",11.0);
    18         Product p4 = new Product("肉4",15.0);
    19         Product p5 = new Product("肉5",17.0);
    20         
    21         product.put(p1,2.0);
    22         product.put(p2,2.0);
    23         product.put(p3,2.0);
    24         product.put(p4,2.0);
    25         product.put(p5,2.0);
    26     //遍历
    27        Set keys = product.keySet();
    28        Iterator it = keys.iterator();
    29        while(it.hasNext())
    30         {
    31            Object k = it.next();
    32            Object v = product.get(k);
    33            System.out.println(k+"..."+v);
    34         }
    35     }
    36 }
    37 //实现Comparable接口
    38 class Product implements Comparable
    39 {
    40      String name;
    41      double price;
    42      Product(String name,double price){
    43     this.name = name;
    44        this.price = price;
    45      }
    46      public String toString()
    47     {
    48          return "Product[name = "+name+",price = "+price+"]";
    49     }
    50     //实现compareo方法,按照商品价格进行排序
    51     public int compareTo(Object o)
    52     {
    53         double price1 = this.price;
    54         double price2 = ((Product)o).price;
    55         if(price1>price2)
    56             return 1;
    57         else if(price2>price1)
    58             return -1;
    59         else return 0;
    60 
    61     }
    62 }
    View Code

    2.3  Collections集合工具类的用法

     1 package test;
     2 
     3 /*
     4 1.集合工具类 java.util.Collections (类)
     5 2.Java.util.Collection 接口
     6 */
     7 import java.util.*;
     8 class Main 
     9 {
    10     @SuppressWarnings("unchecked")
    11     public static void main(String[] args) 
    12     {
    13         @SuppressWarnings("rawtypes")
    14         List list = new ArrayList();
    15         list.add("5");
    16         list.add("9");
    17         list.add("8");
    18         list.add("4");
    19         list.add("6");
    20         @SuppressWarnings("rawtypes")
    21         Iterator it = list.iterator();
    22         while(it.hasNext()){
    23           System.out.println(it.next());
    24         }
    25         System.out.println(".........................");
    26         Collections.sort(list);
    27         it = list.iterator();
    28         while(it.hasNext()){
    29           System.out.println(it.next());
    30         }
    31         
    32         //对set集合进行排序
    33         Set s =  new HashSet();
    34         s.add("3");
    35         s.add("1");
    36         s.add("8");
    37         s.add("4");
    38         s.add("6");
    39         System.out.println(".........................");
    40         //不能更直接使用Collections。sort(s)进行排序
    41         //将Set集合转换成List集合
    42         List lists = new ArrayList(s);
    43         Collections.sort(lists);
    44         it = lists.iterator();
    45         while(it.hasNext()){
    46           System.out.println(it.next());
    47         }
    48         //将ArrayList转换成线程安全的
    49         List mylist = new ArrayList<>();
    50         Collections.synchronizedList(mylist);
    51         
    52     }
    53 }
    View Code

    3.泛型

      泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 JAVA语言引入泛型的好处是安全简单。在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

      泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率
    package test;
    
    /*
    JDk5.0新特性:泛型(编译阶段的语法,在编译阶段同一集合中的类型)
    1.语法实现
    2.优点:使集合中的元素的类型统一,减少强制类型转换
    3.缺点:只能存储一种数据类型
    */
    import java.util.*;
    class  Main
    {
        public static void main(String[] args) 
        {
            //创建一个List集合,只能存储字符串类型
            List <String> str = new ArrayList<String>();
            str.add("sd");
            str.add("sfhj");
            str.add("dsf");
            str.add("hjk");
            str.add("sdf");
            Iterator <String> it  = str.iterator();
            while(it.hasNext()){
                String s = it.next();
               System.out.println(s);
            }
        }
    }
    View Code
  • 相关阅读:
    jQuery.hover() 函数详解
    深入了解css的行高Line Height属性
    yii2 restfulapi QueryParamAuth验证
    yii2 restfulapi 的配置和访问
    yii2 urlmanager的配置
    xubuntu install nodejs
    使用Putty连接VirtualBox的Ubuntu
    mvc与mvvm
    对二叉树进行广度优先遍历
    JavaScript 中的 FileReader
  • 原文地址:https://www.cnblogs.com/xyzyj/p/6696545.html
Copyright © 2011-2022 走看看