集合框架Map与Collection: List、Set

目录

什么是集合

为什么要有集合

怎么用集合

集合的特点

集合和数组之间的区别

Collection接口

Map接口


什么是集合

集合和数组很像,是一个放置数据的容器,但他存放的都是java中最常见的东西:对象。

为什么要有集合

程序总是在运行时才知道某些条件,从而去创建对象。但在这之前并不知道对象的数量与类型,也就不能依靠创建命名的引用来持有每一个对象,也就需要在任意时刻和任意位置创建任意数量的对象。那这些对象存哪呢?我们知道,存很多东西的时候,我们第一个想到的就是数组,但数组是静态的,长度已定,所以不能符合我们创建任意数量的要求。咋整呢?于是乎集合应运而生~

怎么用集合

集合的特点:

1,用于存储对象的容器。

2,集合的长度是可变的。

3,集合中不可以存储基本数据类型值。

集合有很多种,大类呢咱们可以分为:Collection集合和Map

为什么这么分呢?

Collection:是独立元素的序列,就好像数组一样,他是一个个的独立的对象,比如说[cat,dog,fish],这就是一个集合,包含三个独立对象。

Map:是一组成对的“键值对”对象,{键,值} 比如说{1,cat}{2,dog}{3,fish}。他有啥好的呢?Map又叫地图,它允许你用键对象来寻找值对象,有点数组下标找数组内容的味道在里面,也像字典里用拼音来找字一样,所以Map也叫“关联数组”,“字典”。

 

那那么张大图,写的都是啥呢?

我们可以看到,Collection和Map都写着<<接口>>他们两个是高度抽象出来的“爷爷”辈的人物,位高权重的,平时咱们可惹不起。

Collection底下分管着Queue接口(队列)List接口(列表)和Set接口(集)三个得力干将,咱们主要用的呢,都是得力干将们的具体实现。

Map人丁没那么兴旺,主要用的呢,就是TreeMap、HashMap、HashTable。

 

集合和数组之间的区别

1、数组可以存储基本数据类型和引用数据类型(对象),但只能存储同一种。而集合只能存储引用数据类型(对象),但可以存储不同类型的对象(但我们并不这样做)。

2、数组是静态的,一旦创建长度无法改变。集合容量是动态的,达到条件后可以对集合进行扩容。

3、底层实现不同,数组底层是顺序表,而集合的底层实现有多种结构,比如顺序表、散列表和树等。

 

 

 

而具体的List、Set、Map一篇文章讲不清楚,我们得分多几篇文章来,结合源码,慢慢说明白~

下面我们先讲讲顶层的接口,他们所具有的功能。

 

 

Collection接口

作为顶层Collection,它所具有的功能应该是提炼到了最极致的,作为该类型集合(独立序列)应该都需要拥有的功能,具体的实现呢,需要交给具体的结构咯。

咱们先从出生说起,集合作为“数组的补充”,他应该具备什么功能呢?照搬一下数组,基础属性是必须的吧,增删改查是必须的吧,数组还能遍历,咱们也得遍历一下吧。

 

1、增

       boolean add(Object obj):

       boolean addAll(Collection coll):

      看方法便知道,“增”操作起码有两种,一是增单个对象,二是将一整个集合都增加进来,最后返回的就是“增”这个操作是否成功。

 

2、删

       boolean remove(object obj):

       boolean removeAll(Collection coll);

       void clear();

       “删”的前两种情况和“增”大同小异,第三种clear是什么呢?就是从该集合中删除所有元素,将集合彻底取空。

 

3、改

前面说过,Collection是独立元素的序列,在[cat,dog,fish]中将fish改成rat,不就是删掉fish以后增加rat么,所以

 

4、查

       boolean contains(object obj):

       boolean containsAll(Colllection coll);

       boolean isEmpty():判断集合中是否有元素。

 

下面是Collection所有的方法,咱们不一一赘述了。

 

来个例子~

public class DJ_CollectionDemo {
	public static void main(String[] args) {
		Collection coll = new ArrayList();  //ArrayList后面会说到滴,这里可以先略过,直接看作Collection                                              
		show(coll);
	}

	public static void show(Collection coll) {
		// 1.添加元素
		coll.add("abc1");
		coll.add("abc2");
		coll.add("abc3");
		System.out.println(coll);// [abc1, abc2, abc3] 打印集合会打印集合里的所有值:一个字符串整体

		// 2.删除集合
		coll.remove("abc2");
		System.out.println(coll);// [abc1, abc3] remove会改变集合长度
//		coll.clear();
//		System.out.println();//  无内容

		// 判断
		System.out.println(coll.contains("abc4"));// false
		System.out.println(coll.contains("abc1"));// true
	}
public class DJ_CollectionDemo {
	public static void main(String[] args) {
		Collection c1 = new ArrayList();
		Collection c2 = new ArrayList();
		show(c1, c2);
	}

	//关于ALL类的
	public static void show(Collection c1, Collection c2) {
		// 给c1添加元素。
		c1.add("abc1");
		c1.add("abc2");
		c1.add("abc3");
		// 给c2添加元素。
		c2.add("abc1");
		c2.add("abc2");
		c2.add("abc4");

		//演示addAll
		c1.addAll(c2);//将c2中的元素添加到c1中。
		System.out.println(c1);//[abc1, abc2, abc3, abc1, abc2, abc4]  
		// 演示removeAll
		boolean b = c1.removeAll(c2);//将两个集合中的相同元素从调用removeAll的集合中删除。
		System.out.println("removeAll:"+b);//true
		System.out.println(c1);//[abc3]
		

		// 演示containsAll
		boolean b2 = c1.containsAll(c2);
		System.out.println("containsAll:"+b2);//false

		// 演示retainAll
		c2.add("abc3");//c1通过removeAll已经只剩abc3了。c2加一个以演示下面方法
		boolean b3 = c1.retainAll(c2);// 取交集,保留和指定的集合相同的元素,而删除不同的元素。
		// 和removeAll功能相反 。
		System.out.println("retainAll:" + b3);//true
		System.out.println("c1:" + c1);//[abc3]
	}

 

5、获取

       int size():     

       Iterator iterator():

public class DJ_IteratorDemo {
	public static void main(String[] args) {
		Collection coll = new ArrayList();
		coll.add("abc1");
		coll.add("abc2");
		coll.add("abc3");
		coll.add("abc4");
		
		System.out.println(coll); //[abc1, abc2, abc3, abc4]
		
		//使用了Collection中的iterator()方法。 调用集合中的迭代器方法,是为了获取集合中的迭代器对象。
		Iterator it = coll.iterator();		
		while(it.hasNext()){
			System.out.println(it.next());  //类似指针,一开始指向第一个,然后往下指
		}
		
		for(Iterator it2 = coll.iterator(); it.hasNext(); ){//优点:若迭代器用过以后就不用了,这种方法能省一点内存
			System.out.println(it.next());
		}
		
//		System.out.println(it.next());
//		System.out.println(it.next());
//		System.out.println(it.next());
//		System.out.println(it.next());
//		System.out.println(it.next());//java.util.NoSuchElementException
	}
}

 

 

Map接口

那么同理,Map接口也应该是作为“关联数组”里都需要的功能。有什么呢?增删改查了解一下~

1、增
    value put(key,value):返回前一个和key关联的值,如果没有返回null.

    void putAll(Map<? extends K, ? extends V> m);

 

2、删
    void  clear():清空map集合。
    value remove(key):根据指定的key翻出这个键值对。 

 

3、改

default V replace(K key, V value);
default boolean replace(K key, V oldValue, V newValue)

4、判断
    boolean containsKey(key):
    boolean containsValue(value):
    boolean isEmpty();

 

5,获取。 
    value get(key):通过键获取值,如果没有该键返回null。
    int size(): 获取键值对的个数。 

     boolean containsKey(Object key);  Map中是否包含此Key
     boolean containsValue(Object value);Map中是否包含此Value

    

public class DJ_MapDemo {

        public static void main(String[] args) {

              

               Map<Integer, String> map=new HashMap<Integer, String>();

               method(map);



        }

       

        public static void method(Map<Integer,String> map) {

               //添加元素

               System.out.println(map.put(8, "caidj"));//null

               System.out.println(map.put(8, "chenp")); //caidj  存相同键,系统会覆盖

               map.put(5, "value5");

               map.put(2, "value2");

               System.out.println(map);//{2=value2, 5=value5, 8=chenp}

               System.out.println("******************");

              

               //删除元素

                System.out.println("remove:"+map.remove(2));//remove:value2

               System.out.println(map);//{5=value5, 8=chenp}

               System.out.println("******************");

              

               //判断

               System.out.println("containskey:"+map.containsKey(5));

                System.out.println("******************");//containskey:true

               System.out.println("get:"+map.get(5));//get:value5

        }

}
public class DJ_MapDemo {

        public static void main(String[] args) {

              

               Map<Integer, String> map=new HashMap<Integer, String>();

               method_2(map);



        }

       



        public static void method_2(Map<Integer, String>  map) {



               map.put(8,"zhaoliu");

               map.put(2,"zhaoliu");

               map.put(7,"xiaoqiang");

               map.put(6,"wangcai");

              

               //取出map中所有的元素

               //法一:

               //原理:通过keySet方法获取map中所有的键所在的Set集合,通过set的迭代器获取每一个键

               //再对每一个键获取其对应的值即可

               Set<Integer> keySet = map.keySet();

               Iterator<Integer> iterator = keySet.iterator();

              

               while(iterator.hasNext()) {

                       Integer keySet1 =iterator.next();

                       String string=map.get(keySet1);

                       System.out.println(keySet1+":"+string);

               }

              

               /*法二:entrySet

                * 通过Map转成set就可以迭代。

                * 该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型就是Map.Entry(类型)

                */

               /*

                * Set<Map.Entry<Integer, String>> entrySet =map.entrySet();

                * Iterator<Map.Entry<Integer, String>> iterator2=entrySet.iterator();

                       while(iterator2.hasNext()) {

                               Map.Entry<Integer, String> me = iterator2.next();

                               Integer key = me.getKey();

                               String value = me.getValue();

                               System.out.println(key+"::::"+value);

                               }

                */

              

        }

}
发布了38 篇原创文章 · 获赞 6 · 访问量 1923

猜你喜欢

转载自blog.csdn.net/weixin_43827227/article/details/98044685