黑马程序员——集合

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


集合:

集合可以分为Collection超级接口和Map超级接口两种类型。

 

    特点:

        1、可以存储不同数据类型的(其实集合一般存储的也是同一种类型),但只能存储引用类型。

        2、集合的长度是可以变化的。

        3、存储的元素都有对应的索引,从左边第一位以0开始,直到最后一个元素。

        4、每一个集合都有自己的长度,从左边第一位以1开始,直到最后一个元素。

                                长度的获取方法:集合名.size();   

 

 

Collection类型的集合:

Collection集合又分为两大类,List类型和Set类型的集合。

 

具体结构如下图:

 

                         

List类型集合:

     1、根据上图可知道此集合下的所有子类都是有“有序可重复”的特点。

        A、有序:并不是说存储进集合后会自动排序,而是表示那个元素先被存储进集合,此元素就先出去,对应的是先进先出的关系。

        B、可重复:是指集合里面的元素是可以重复出现的。

     2List集合下,有ArrayListVectorLinkedList三种常用集合类,每一个类又有其特点,使用时可以根据自己的需求去选择。如果对此集合类型理解得不深,可以抛开需求,直接使用ArrayList

 

为什么需要集合呢?

      因为数组长度固定,满足不了长度变化的需求,所以Java就提供了集合,每一个集合类中都具备有增删功能。那么为了获取元素,同时也提供了遍历功能。

 

ArrayList集合代码举例:     

 

import java.util.ArrayList;

/**
 * 需求:自定义String类型的集合,出现与"abc"字符串相同的元素删除掉。
 * 
 *        此题充分体现了集合长度可变化的特性
 */
public class ListDemo {
     public static void main(String[] args) {
		//创建集合对象
    	 ArrayList<String> al = new ArrayList<>();
    	 //添加元素
    	 al.add("Hello");
    	 al.add("abc");
    	 al.add("World");
    	 al.add("Java");
    	 al.add("abc");
    	 System.out.println(al);
    	 /**
    	  * 未遍历删除之前输出集合:[Hello,abc,World,Java,abc]
    	  * 是先添加Hello,打印在前的也是Hello,顺序依此类推并没有变化,且"abc"重复出现
    	  * 所以这就List集合的有序性和重复性
    	  */
    	 /**
    	  * List集合下的子类有三种遍历方式:
    	  *    1、获取迭代器遍历
    	  *    2、增强for遍历
    	  *    3、size()方法和get(int index)方法结合普通for循环
    	  *    
    	  *    为了获取元素并删除元素,使用第三种方式
    	  */
    	 for(int i=0;i<al.size();i++){
    		 //获取元素并判断
    		 if(al.get(i).equals("abc")){
    			 //相同就进来删掉元素
    			 al.remove(i);
    		 }
    	 }
    	 System.out.println(al);//遍历删除后输出集合:[Hello,World,Java]
    }
}

   Set类型集合:

      1Set集合子类的特点是“无序且唯一”的特点。

         A、无序:是指将元素添加进集合,打印出来的结果不是按先进先出的关系,而是按照某种排序方式输出。

         B、唯一:则是指元素只能出现一个,不能有重复的。既然手动添加多个相同元素,集合也会自动把相同的消灭掉。      

      

      2Set集合有HashSetTreeSet两种常用集合类,在HashSet类下又有一个子类LinkedHashSet类,都各自有其特点。

         HashSet:并不保证按照某种排序恒久不变的输出。

                  LinkedHashSet:即保证了有序性也保证了唯一性。

         TreeSet:默认是按照自然排序,但也可以手动设置排序关系。

                                     

     如果对此集合类型理解得不深,可以抛开需求,直接使用HashSet

 

HashSet集合代码举例:

 

import java.util.HashSet;

public class SetDemo {
     public static void main(String[] args) {
		//创建集合对象
    	HashSet<Integer> hs = new HashSet<>();
    	hs.add(3);
    	hs.add(2);
    	hs.add(3);
    	hs.add(20);
    	hs.add(10);
    	System.out.println(hs);
    	/**
    	 * 直接输出集合结果:[2,3,20,10]
    	 * 此时发现集合添加和输出的顺序不同,而且"3"也只出现了一个
    	 * 所以这就是Set集合的无序性和唯一性
    	 */
    	/**
    	 * List集合下的子类有两种遍历方式:
    	 *   1、获取迭代器遍历
    	 *   2、增强for遍历
    	 */
    	//使用增强for遍历
    	for(Integer i:hs){
    		System.out.print(i+" ");
    	}
    }
}

 

Map类型的集合:

    特点:具有键值对关系。就是将键映射到值的对象,一个映射不能包含重复的键,每个键只能映射一个对应的值。

    注意:如果一个集合添加同一个键的值多次,那么后面进来的值就会把前面的值顶出去,最后输出的结果是此键和最后一个值。

             格式:Map<key,value>

                   Key -->此映射所维护的键的类型

                 Value -->映射值的类型

 

Map类型集合下有HashMapTreeMap两个常用集合类:

   

具体结构如下图:

 

 

根据上图可以知道,Map类型集合的子类与Set类型集合的子类有异曲同工之妙,所以参照Set集合子类即可。

 

Map集合的遍历:

有两种方法:

          1、键找值:

                    A、获取所有键的集合

                    B、遍历键的集合,得到每一个键

                    C、根据键到集合中去找值

    以HashMap为例:

           此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null 元素。

import java.util.HashMap;
import java.util.Set;

public class MapDemo {
     public static void main(String[] args) {
	     //创建对象
    	 HashMap<Integer, String> hm = new HashMap<>();
    	 //添加元素,键和值要根据对应的类型添加,注意Map集合与Collection集合的添加方法不一样
    	 hm.put(2,"WY");
    	 hm.put(1, "HE");
    	 hm.put(3, "MS");
    	 hm.put(2, "LS");
    	 
    	 //获取所有的键的集合
    	 Set<Integer> set = hm.keySet();
    	 //遍历键的集合,得到每一个键
    	 for(Integer key:set){
    		 //根据键到集合中获取值
    		 String value = hm.get(key);
    		 System.out.println(key+":"+value);
    		 /**
    		  * 输出结果:1:WY
    		  *               2:LS
    		  *               3:MS
    		  *  此时并不是按添加的顺序输出,而是按某种顺序输出             
    		  *  键2出现两次,存储两次值,但该键只能出现一次,输出的是最后存储的值
    		  *  所以Map集合具有无序性和唯一性
    		  */
    	 }
    }
}


          2、键值对对象找键和值:

                    A、获取所有的键值对对象的集合

                    B、遍历键值对对象的集合,获取每一个键值对对象

                    C、根据键值对对象去获取键和值

 

TreeMap集合为例:

        默认使用元素的自然顺序对元素进行排序,或者根据特有的构造方法使用 Comparator 进行排序。

 

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class MapDemo {
     public static void main(String[] args) {
	     //创建对象
    	 TreeMap<Integer, String> tm = new TreeMap<>();
    	 //添加元素
    	 tm.put(2,"WY");
    	 tm.put(1, "HE");
    	 tm.put(3, "MS");
         
    	 //获取所有的键值对对象的集合
    	 Set<Map.Entry<Integer, String>> set = tm.entrySet();
    	 //遍历键值对对象的集合,获取每一个键值对对象
    	 for(Map.Entry<Integer, String> me:set){
    		 //根据键值对对象去获取键和值
    		 Integer key = me.getKey();
    		 String value = me.getValue();
    		 System.out.println(key+":"+value);
    	 }
    }
}

注意:此方法中getKey()getValue()方法是在Map.Entry<K,V>接口中。

 

 

CollectionMap的区别:

        1Map 存储的是键值对形式的元素,键唯一,值可以重复。夫妻对

        2Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复。光棍

 


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值