JAVA集合类

集合概述

分为两大类,单类集合Collection和双列集合Map。

一、Collection接口

Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是List和Set。

1.List接口

List的特点是元素有序、元素可重复,所有的元素是以一种线性方式进行存储的,元素的存入顺序和取出顺序一致。List接口的主要实现类有ArrayList和LinkedList。

List实现类

1.1 ArrayList

ArrayList集合是一个长度可变的数组。在ArrayList内部封装一个长度可变的数组对象,当存入的元素超过数组的长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素。

ArrayList的增删

ArrayList list = new ArrayList();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
System.out.println(list.size());//4
System.out.println(list.get(1));//李四

由于ArrayList集合的底层是使用一个数组来保存元素,在增加或删除指定位置的元素时,会导致创建新的数组,效率比较低,因此不适合做大量的增删操作,也因此对于查询元素很方便。

1.2 LinkedList

LinkedList集合解决了ArrayList集合增删效率低的局限。ListedList集合内部维护了一个双向循环来链表,通过前后的指向将所有的元素连接起来,使其具备很高的效率。

集合方法

代码

LinkedList linkedList = new LinkedList();
linkedList.add("张三");
linkedList.add("李四");
linkedList.add("王五");
linkedList.add("赵六");
System.out.println(linkedList);//[张三, 李四, 王五, 赵六]
linkedList.add(3,"student");
System.out.println(linkedList);//[张三, 李四, 王五, student, 赵六]
linkedList.addFirst("First");
System.out.println(linkedList);//[First, 张三, 李四, 王五, student, 赵六]
System.out.println(linkedList.getFirst());//First
linkedList.removeFirst();
System.out.println(linkedList);//[李四, 王五, student, 赵六]

Iterator接口

像数组一样,我们经常需要遍历集合中的所有元素,因此提供了一个Iterator接口,主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。

ArrayList list = new ArrayList();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
Iterator it = list.iterator();
while (it.hasNext()){
    Object next = it.next();
    System.out.println(next);
}
//张三 李四 王五 赵六

如果在使用迭代器的过程中移除某个元素,会导致出现异常。

解决的方法:

第一种:只要找到想移除的元素,用break跳出即可。

第二种:直接使用迭代器it。remove()的方法既可。

遍历改进:foreach

for(容器中元素类型 临时变量 :容器变量) {     执行语句 }

2.Set接口

Set的特点是元素无序不可重复。Set接口的主要实现类有HashSet和TreeSet。

2.1HashSet

HashSet是根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能。

HashSet hashSet = new HashSet();       
hashSet.add("张三");                     
hashSet.add("李四");                     
hashSet.add("王五");                     
hashSet.add("赵六");
hashSet.add("李四");                      
Iterator iterator = hashSet.iterator();
while (iterator.hasNext()){            
    Object next = iterator.next();     
    System.out.print(next + " ");      
}//李四 张三 王五 赵六                         

可以看出HashSet确实是无序不重复的集合,当调用add()方法时,首先调用hashCode()获得对象的哈希值,继而通过哈希值计算除一个存储位置。如果在计算出来的存储位置上没有元素,则直接将元素存入该位置。若是有元素,则调用equals()方法让当前存入元素在该存储位置的元素进行比较,若是返回false就将该元素存入集合,若是true,则说明元素重复,将该元素舍弃。

LinkedHashSet

HashSet集合存储的元素是无序的,如果想让元素的存取顺序一致,可以使用Java中提供的LinkedHashSet类,LinkedHashSet类是HashSet的子类。

2.2TreeSet

TreeSet则是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序。

TreeSet treeSet = new TreeSet();       
treeSet.add(3);                        
treeSet.add(2);                        
treeSet.add(4);                        
treeSet.add(1);
treeSet.add(1);                        
System.out.println(treeSet);//[1 2 3 4]

实现有序排列,是因为元素的类都实现了Comparable接口,Comparable接口强行对实现它的类的对象进行整体排序。

Comparable接口的 compareTo() 方法被称为自然比较方法。当一个自定义的类中没有重写compareTo()方法,则没有办法实现对存入对象的有序排列。

二、Map接口

Map:双列集合类的根接口,用于存储具有键(Key)、值(Value)映射关系的元素,每个元素都包含一对键值,其中键值不可重复并且每个键最多只能映射到一个值,在使用Map集合时可以通过指定的Key找到对应的Value。

2.1HashMap

HashMap集合是Map接口的一个实现类,用于存储键值映射关系,但HashMap集合没有重复的键并且键值无序。

HashMap hashMap = new HashMap();           
hashMap.put("1","张三");                     
hashMap.put("2","李四");                     
hashMap.put("3","王五");                     
hashMap.put("4","赵六");                     
System.out.println(hashMap.get("1"));//张三  
System.out.println(hashMap.get("2"));//李四  
System.out.println(hashMap.get("3"));//王五  
System.out.println(hashMap.get("4"));//赵六  
System.out.println(hashMap.get(1));//null  
//注意要与key值相同,存放的是 "1"                      

遍历Map,获取键值对 

HashMap hashMap = new HashMap();                 
hashMap.put("1","张三");                           
hashMap.put("2","李四");                           
hashMap.put("3","王五");                           
hashMap.put("4","赵六");                           
Set keyset = hashMap.keySet();//获取键集合            
Iterator iterator = keyset.iterator();           
while (iterator.hasNext()){                      
    Object key = iterator.next();                
    Object value = hashMap.get(key);             
    System.out.print(key + ":" + value + " ");   
}  //1:张三 2:李四 3:王五 4:赵六                         

 hashMap方法

HashMap map = new HashMap(); // 创建Map集合                              
map.put("1", "张三");                                                  
map.put("3", "李四");                                                  
map.put("2", "王五");                                                  
map.put("4", "赵六");                                                  
System.out.println("集合大小为:" + map.size());//4                        
System.out.println("判断是否包含传入的键:" + map.containsKey("2"));//true      
System.out.println("判断是否包含传入的值:" + map.containsValue("王五"));//true   
System.out.println("移除键为1的值是:" + map.remove("1"));//张三               
Collection values = map.values();//获取值                               
Iterator it = values.iterator();                                     
while (it.hasNext()) {                                               
    Object value = it.next();                                        
    System.out.println(value);                                       
}//王五 李四 赵六                                                          

 LinkedHashMap类

从上面可以看出,HashMap集合迭代出来的元素的顺序和存入的顺序是不一致的,想要一致,可以使用LinkedHashMap类,它是HashMap的子类。

2.2TreeHash类

HashMap集合存储的元素的键值是无序的和不可重复的,为了对集合中的元素的键值进行排序,Map接口提供了另一个可以对集合中元素键值进行排序的类TreeMap。

TreeMap map = new TreeMap();// 创建Map集合          
map.put("3", "张三");                             
map.put("2", "李四");                             
map.put("3", "王五");                             
map.put("4", "赵六");                             
Set keySet = map.keySet();                      
Iterator iterator = keySet.iterator();          
while (iterator.hasNext()){                     
    Object key = iterator.next();               
    Object value = map.get(key);                
    System.out.println(key  + ":" + value);     
}//2:李四                                         
 //3:王五                                         
 // 4:赵六                                        

不仅有序排列,同时后面的覆盖前面的,打印出来的是 王五 ,说明第一个张三被覆盖。因此,reeMap中的键必须是唯一的,不能重复并且有序,如果存储了相同的键,后存储的值则会覆盖原有的值。

2.3Hashtable类

和HashMap十分相似,区别在于Hashtable是线程安全的。Hashtable存取元素时速度很慢,目前基本上被HashMap类所取代。

2.4Properties

Hashtable类的子类Properties。

Properties主要用来存储字符串类型的键和值,在实际开发中,经常使用Properties集合来存取应用的配置项。

Properties properties = new Properties();                                   
properties.setProperty("color", "green");                                   
properties.setProperty("language", "Chinese");                              
Enumeration names = properties.propertyNames();//获取Enumeration对象所有键枚举       
while (names.hasMoreElements()) {                                           
    String key = (String) names.nextElement();                              
    String value = properties.getProperty(key);// 获取对应键的值                   
    System.out.println(key + " = " + value);                                
}                                                                           
//color = green                                                             
//language = Chinese                                                        
                                                                            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值