java集合

xiaoxiao2024-03-29  29

import java.util.List;    import java.util.ArrayList;    import java.util.LinkedList;       import java.util.Map;    import java.util.HashMap;    import java.util.LinkedHashMap;    import java.util.TreeMap;    import java.util.Set;    import java.util.HashSet;    import java.util.LinkedHashSet;    import java.util.TreeSet;    import java.util.Vector;    import java.util.Hashtable;  list:提供基于索引的对成员的随机访问2007-10-3 1、java.util.ArrayList 注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步 List list = Collections.synchronizedList(new ArrayList(...)); 2、java.util.LinkedList List list = Collections.synchronizedList(new LinkedList(...)); ArrayList进行随机访问,可在常量时间完成,不论你选择的元素为何,所需要的时间相同 LInkedList而言,随机选择某一元素的动作需要在链表上进行,越靠近链表尾端,花费的时间愈久。 如果将元素安插至序列的中央位置,对 LinkedList来说花费的代价明显小于ArrayList ?? 3. java.lang.Object   java.util.AbstractCollection       java.util.AbstractList           java.util.Vector 4、java.util.Hashtable Hashtable 是同步的 java.lang.Object   java.util.Dictionary       java.util.Hashtable 此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值 下面这个示例创建了一个数字的哈希表。它将数字的名称用作键:      Hashtable numbers = new Hashtable();      numbers.put("one", new Integer(1));      numbers.put("two", new Integer(2));      numbers.put("three", new Integer(3));要检索一个数字,可以使用以下代码:    Integer n = (Integer)numbers.get("two");       if (n != null) {             System.out.println("two = " + n);       } 5、java.util.HashMap java.lang.Object   java.util.AbstractMap       java.util.HashMap 基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键 Map m = Collections.synchronizedMap(new HashMap(...)); 6、java.util.TreeMap java.lang.Object   java.util.AbstractMap       java.util.TreeMap Map m = Collections.synchronizedMap(new TreeMap(...)); SortedMap 接口的基于红黑树的实现。此类保证了映射按照升序顺序排列关键字,根据使用的构造方法不同,可能会按照键的类的自然顺序 进行排序(参见 Comparable),或者按照创建时所提供的比较器进行排序。 7、java.util.TreeSet java.lang.Object   java.util.AbstractCollection       java.util.AbstractSet           java.util.TreeSet 此类实现 Set 接口,该接口由 TreeMap 实例支持。此类保证排序后的 set 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序 进行排序(参见 Comparable),或按照在创建 set 时所提供的比较器进行排序。 SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...)); 应用 package test.jihe; import java.util.Comparator; import java.util.Iterator; import java.util.TreeMap; public class testone { public static void main (String[] args)   {        TreeMap map = new TreeMap((Comparator) new MyComparator());     map.put("sungnag", "");     map.put("yangmin", "");     map.put("zhangliang", "");     map.put("laoli", "");     map.put("yuzong", "");     for( Iterator it = map.keySet().iterator(); it.hasNext(); )     {       String key = (String)it.next();       System.out.println( "Key: "+key );     }   }   static class MyComparator implements Comparator   {     public int compare(Object element1,Object element2)     {       System.out.println("begin....");       String a = element1.toString().toLowerCase();       System.out.print("a = "+a);       String b = element2.toString().toLowerCase();       System.out.print("    b = "+b+"   rs ="+a.compareTo( b ));       System.out.println("");       return a.compareTo( b );     }   } } begin.... a = yangmin    b = sungnag   rs =6 begin.... a = zhangliang    b = sungnag   rs =7 begin.... a = zhangliang    b = yangmin   rs =1 begin.... a = laoli    b = yangmin   rs =-13 begin.... a = laoli    b = sungnag   rs =-7 begin.... a = yuzong    b = yangmin   rs =20 begin.... a = yuzong    b = zhangliang   rs =-1 Key: laoli Key: sungnag Key: yangmin Key: yuzong Key: zhangliang public   class   myComparator   implements   Comparator   {     public   int   compare(Object   element1,   Object   element2)   {     Integer   Int1   =   (Integer)   element1;     Integer   Int2   =   (Integer)   element2;     int   num1   =   Int1.intValue();     int   num2   =   Int2.intValue();         return   num1   -   num2;     }     }    1            |——SortedSet接口——TreeSet实现类   2Set接口——|——HashSet实现类   3            |——LinkedHashSet实现类   4HashSet   5此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。   6此类为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此集合进行迭代所需的时间与 HashSet 实例的大小(元素的数量)和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。   7   8我们应该为要存放到散列表的各个对象定义hashCode()和equals();   9import java.util.HashSet; 10import java.util.Iterator; 11public class HashSetTest { 12         public static void main(String[] args) 13         { 14                 HashSet hs=new HashSet(); 15                 /**//*hs.add("one"); 16                 hs.add("two"); 17                 hs.add("three"); 18                 hs.add("four");*/ 19                 hs.add(new Student(1,"zhangsan")); 20                 hs.add(new Student(2,"lishi")); 21                 hs.add(new Student(3,"wangwu")); 22                 hs.add(new Student(1,"zhangsan")); 23                24                 Iterator it=hs.iterator(); 25                 while(it.hasNext()) 26                 { 27                         System.out.println(it.next()); 28                 } 29         } 30} 31class Student         //HashSet要重写hashCode和equals方法 32{ 33         int num; 34         String name; 35         Student(int num,String name) 36         { 37                 this.num=num; 38                 this.name=name; 39         } 40         public String toString() 41         { 42                 return "num :"+num+" name:"+name; 43         } 44         public int hashCode() 45         { 46                 return num*name.hashCode(); 47         } 48         public boolean equals(Object o) 49         { 50                 Student s=(Student)o; 51                 return num==s.num && name.equals(s.name); 52         } 53} 54 55TreeSet 56此类实现 Set 接口,该接口由 TreeMap 实例支持。此类保证排序后的 set 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序 进行排序,或按照在创建 set 时所提供的比较器进行排序。 57是一个有序集合,元素中安升序排序,缺省是按照自然顺序进行排序,意味着TreeSet中元素要实现Comparable接口; 58我们可以构造TreeSet对象时,传递实现了Comparator接口的比较器对象. 59import java.util.*; 60public class TreeSetTest { 61         public static void main(String[] args) 62         { 63                 //TreeSet ts=new TreeSet(); 64                 TreeSet ts=new TreeSet(new Students.compareToStudent()); 65                 ts.add(new Students(2,"zhangshan")); 66                 ts.add(new Students(3,"lishi")); 67                 ts.add(new Students(1,"wangwu")); 68                 ts.add(new Students(4,"maliu")); 69                70                 Iterator it=ts.iterator(); 71                 while(it.hasNext()) 72                 { 73                         System.out.println(it.next()); 74                 }                75         } 76} 77class Students implements Comparable 78{ 79         int num; 80         String name; 81         Students(int num,String name) 82         { 83                 this.num=num; 84                 this.name=name; 85         } 86         static class compareToStudent implements Comparator         //定义一个内部类来实现比较器 87         { 88                 public int compare(Object o1, Object o2) { 89                         Students s1=(Students)o1; 90                         Students s2=(Students)o2; 91                         int rulst= s1.num > s2.num ? 1 : (s1.num==s2.num ? 0 :-1); 92                         if(rulst==0) 93                         { 94                                 rulst=s1.name.compareTo(s2.name); 95                         }                96                         return rulst; 97                 }                98         } 99         public int compareTo(Object o)                 //写具体的比较方法 100         { 101                 int result; 102                 Students s=(Students)o; 103                 result=num >s.num ? 1:(num==s.num ? 0 : -1); 104                 if(result==0) 105                 { 106                         result=name.compareTo(s.name); 107                 } 108                 return result; 109         } 110         public String toString() 111         { 112                 return num+":"+name; 113         } 114} 115总结 116HashSet是基于Hash算法实现的,其性能通常优于TreeSet,我们通常都应该使用HashSet,在我们需要排序的功能时,我门才使用TreeSet 8、java.util.HashSet java.lang.Object   java.util.AbstractCollection       java.util.AbstractSet           java.util.HashSet 所有已实现的接口: Serializable, Cloneable, Iterable, Collection, Set 直接已知子类: JobStateReasons, LinkedHashSet 此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。 Set s = Collections.synchronizedSet(new HashSet(...)); 三、之间的区别 1、Vector类和ArrayList类 主要不同之处在于同步。Vector是线程安全的,但ArrayList不是。这使得ArrayList要比Vector快速,其性能也更好一些。 如果要从Java SDK得到一个线程安全的LinkedList,你可以利用一个同步封装器从Collections.synchronizedList(List)得到一个。然而,使用同步封装器相当于加入了一个间接层,它会带来昂贵的性能代价。和Vector相比,经过同步封装的LinkedList在性能上处于显著的劣势,因为Vector不需要为了线程安全而进行任何额外的间接调用。 只有List和Map具有高效的线程安全实现(分别是Vector和Hashtable类)。这两个高效的线程安全类的存在只是为了向后兼容,而不是出于性能上的考虑。        ArrayList和Vector通常比LinkedList和同步封装之后的LinkedList有着更好的性能。有些情况下LinkedList会有更好的性能,例如,当大量元素需要同时加入到大型集合的开头和末尾时。一般而言,建议优先使用ArrayList/Vector类,只有当它们存在明显的性能问题而LinkedList能够改进性能时,才使用LinkedList HashTable和HashMap的区别: HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。 HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。 HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。 HashTable使用Enumeration,HashMap使用Iterator。 HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

 

转载请注明原文地址: https://www.6miu.com/read-5014605.html

最新回复(0)