黑马程序员--java基础--java中常用的"容器"-集合

                                     ------- android培训java培训、期待与您交流! ----------

                                 集合

集合的由来


图解


java中集合框架

java中集合体系也是不断向上抽取而来的



集合框架的构成图




 
                                          Collection
Collection是集合框架中的常用接口。

                    1、List元素是有序的,元素可以重复。因为该集合体系有索引。
                   2、Set元素是无序的,元素不可以重复。
 
Collection接口中的常见操作
1、添加元素
        add(Objectobj); //add方法的参数类型是Object。以便于接收任意类型对象。
2、删除元素
        remove(Objectobj);
        removeAll(另一集合);//调用者只保留另一集合中没有的元素。
        clear();//清空集合
3、判断元素
        contains(Objectobj);//判断是否存在obj这个元素
        isEmpty();//是否为空
4、获取个数,集合长度
        size();
5、取交集
        retainAll(另一集合);//调用者只保留两集合的共性元素。
应用事例
 
public class CollectionDemo {
	public static void main(String[] args) {
		Collection c1 = new ArrayList();
		Collection c2 = new ArrayList();
		show(c1,c2);
	}
	public static void show(Collection c1,Collection c2){
		//给c1添加元素。
		c1.add("abc1");
		c1.add("abc2");
		c1.add("abc3");
		c1.add("abc4");
		//给c2添加元素。
		c2.add("abc1");
		c2.add("abc2");
		c2.add("abc3");
		c2.add("abc4");
		c2.add("abc5");
		
		System.out.println("c1:"+c1);
		System.out.println("c2:"+c2);
		
		//演示addAll
		
//		c1.addAll(c2);//将c2中的元素添加到c1中。
		
		
		//演示removeAll
//		boolean b = c1.removeAll(c2);//将两个集合中的相同元素从调用removeAll的集合中删除。
//		System.out.println("removeAll:"+b);
		
		//演示containsAll
//		boolean b = c1.containsAll(c2);
//		System.out.println("containsAll:"+b);
		
		//演示retainAll
		boolean b = c1.retainAll(c2);//取交集,保留和指定的集合相同的元素,而删除不同的元素。
								//和removeAll功能相反 。
		System.out.println("retainAll:"+b);
		System.out.println("c1:"+c1);
	}
	
	public static void show(Collection coll){
		
		//1,添加元素。add.
		coll.add("abc1");
		coll.add("abc2");
		coll.add("abc3");
		System.out.println(coll);
		//2,删除元素。remove
//		coll.remove("abc2");//会改变集合的长度 
		//清空集合.
//		coll.clear();
		System.out.println(coll.contains("abc3"));
		System.out.println(coll);
	}

}


                                                                   迭代

        迭代是取出集合中元素的一种方式。
      

         因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。

如图


 
迭代的常见操作
        hasNext();有下一个元素,返回真
        next();取出下一个元素
        remove();移除

应用事例

public class IteratorDemo {
	public static void main(String[] args) {

		Collection coll = new ArrayList();
		coll.add("abc1");
		coll.add("abc2");
		coll.add("abc3");
		coll.add("abc4");
		//使用了Collection中的iterator()方法。 调用集合中的迭代器方法,是为了获取集合中的迭代器对象。
		Iterator it = coll.iterator();		
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

}


                                                                              List

组成

        List:元素是有序的,元素可以重复。
            |--ArrayList:底层的数据结构使用的是数组结构。查询速度很快。但是增删稍慢。线程不同步。
            |--LinkedList:底层使用的是链表数据结构。增删速度很快,查询稍慢。线程不同步。
            |--Vector:底层是数组数据结构。线程同步。

 

List的特有方法

        凡是可以操作角标的方法都是该体系特有的方法。
1、增
        booleanadd(index,element);//指定位置添加元素
        BooleanaddAll(index,Collection);//在指定位置增加给定集合中的所有元素,若省略位置参数,则在当前集合的后面依次添加元素
2、删
        Booleanremove(index);//删除指定位置的元素
3、改
        set(index,element);//修改指定位置的元素。
4、查
        get(index);//通过角标获取元素
        subList(from,to);//获取部分对象元素
5、其他
        listIterator();//List特有的迭代器
        indexOf(obj);//获取元素第一次出现的位置,如果没有则返回-1
public class ListDemo {
	public static void main(String[] args) {
		List list = new ArrayList();
		show(list);
	}
	public static void show(List list) {
		//添加元素
		list.add("abc1");
		list.add("abc2");
		list.add("abc3");
		System.out.println(list);
		//插入元素。		
		list.add(1,"abc9");
		//删除元素。
		System.out.println("remove:"+list.remove(2));
		//修改元素。
		System.out.println("set:"+list.set(1, "abc8"));
		//获取元素。
		System.out.println("get:"+list.get(0));
		//获取子列表。
		System.out.println("sublist:"+list.subList(1, 2));
		System.out.println(list);
	}

}


 
ListIterator

        ListIterator是List集合特有的迭代器,是Iterator的子接口。
Iterator方法是有限的,只能对元素进行判断,取出,删除的操作。如果想要其他的操作,如添加、修改等,就需要使用其子接口:ListIterrator。该接口只能通过List集合的ListIterator方法获取。
ListIterator特有的方法

        add(obj);//增加
        set(obj);//修改为obj
        hasPrevious();//判断前面有没有元素
        previous();//取前一个元素

 应用事例

                List list = new ArrayList();
		list.add("abc1");
		list.add("abc2");
		list.add("abc3");
		
		System.out.println("list:"+list);
		ListIterator it = list.listIterator();//获取列表迭代器对象
		//它可以实现在迭代过程中完成对元素的增删改查。
		//注意:只有list集合具备该迭代功能.
		while(it.hasNext()){
			Object obj = it.next();
			if(obj.equals("abc2")){
				it.set("abc9");
			}
		}

Vector

枚举Enumeration

        是Vector特有的取出方式。

        其实枚举和迭代是一样的。

方法

         addElement(obj);//添加元素,相当于add(obj);
         Enumerationelements();//Vector特有取出方式(枚举)
         hasMoreElements();//相当于Iterator的hasNext()方法
         nextElements();//相当于Iterator的next()方法

应用事例

public class VectorDemo {
	public static void main(String[] args) {
		Vector v = new Vector();
		v.addElement("abc1");
		v.addElement("abc2");
		v.addElement("abc3");
		v.addElement("abc4");
		Enumeration en = v.elements();
		while(en.hasMoreElements()){
			System.out.println("nextelment:"+en.nextElement());
		}
	}
}



LinkedList
        LinkedList:底层使用的是链表数据结构。增删速度很快。
特有方法:
1、增
        addFirst();
        addLast();
2、获取
        //获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
        getFirst();
        getLast();
3、删
        //获取元素,并删除元素。如果集合中没有元素,会出现NoSuchElementException
        removeFirst();
        removeLast();

应用事例

public class LinkedListDemo {
	public static void main(String[] args) {
		LinkedList link = new LinkedList();
		link.addFirst("abc1");
		link.addFirst("abc2");
		link.addFirst("abc3");
		link.addFirst("abc4");
		System.out.println(link.getFirst());//获取第一个但不删除。
		System.out.println(link.removeFirst());//获取元素但是会删除。
		Iterator it = link.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		System.out.println(link);
		}
	}
}

Arraylist与Linkedlist区别图解


                                                                                Set


        Set:元素是无序,元素不可以重复。     
 
1、HasSet

        HashSet:线程不安全,存取速度快。
       可以通过元素的两个方法,hashCode和equals来完成保证元素唯一性。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。

注意:HashSet对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法。

应用事例

public class HashSetDemo {
	public static void main(String[] args) {
		HashSet hs = new HashSet();
		hs.add("hehe");
		hs.add("hahah");
		hs.add("xixii");
		hs.add("hehe");
		Iterator it = hs.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
}


2、TreeSet

        a、底层的数据结构为二叉树结构

        b)可对Set集合中的元素进行排序,TreeSet类实现了Comparable接口,需要复写compareTo方法,才能让对象按指定需求(如人的年龄大小比较等)进行排序,并加入集合。    

排序的两种方式
        1)第一种排序方式: 让元素自身具备比较性。(实现Comparable接口,覆盖compareTo方法)
        2)第二种方式:比较器
        当元素自身不具备比较性时,定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

        比较器构造方式:定义一个类,实现Comparator接口,覆盖compare方法。


                                                                   Map集合
        Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合。
特点
        1)该集合存储键值对,一对一对往里存
        2)要保证键的唯一性。

Map集合的常用方法
1、添加
        Vput(K key,V value);//添加元素,如果出现添加时,相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的值。
        voidputAll(Map <? extends K,? extends V> m);//添加一个集合
2、删除
        clear();//清空
        Vremove(Object key);//删除指定键值对
3、判断
        containsKey(Objectkey);//判断键是否存在
        containsValue(Objectvalue)//判断值是否存在
        isEmpty();//判断是否为空
4、获取
        Vget(Object key);//通过键获取对应的值
        size();//获取集合的长度
        Collection<V>value();//获取Map集合中所以得值,返回一个Collection集合

 

                public static void method(Map<Integer,String> map){
		// 添加元素。
		System.out.println(map.put(8, "wangcai"));//返回null
		System.out.println(map.put(8, "xiaoqiang"));//wangcai 存相同键,值会覆盖。
		map.put(2,"zhangsan");
		map.put(7,"zhaoliu");
		//删除。
//		System.out.println("remove:"+map.remove(2));
		//判断。
//		System.out.println("containskey:"+map.containsKey(7));
		//获取。 
		System.out.println("get:"+map.get(6));
		System.out.println(map);
	}

Map集合的取出原理:将Map集合转成Set集合。再通过迭代器取出。


                Set<Integer> keySet = map.keySet();
		Iterator<Integer> it = keySet.iterator();
		
		while(it.hasNext()){
			Integer key = it.next();
			String value = map.get(key);
			System.out.println(key+":"+value);
			
		}


将Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是:Map.Entry
 
                 a、Map集合中村的是映射关系这样的两个数据,是先有Map这个集合,才可有映射关系的存在,而且此类关系是集合的内部事务。
                 b、并且这个映射关系可以直接访问Map集合中的内部成员,所以定义在内部。

 



应用事例

                Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
<span style="white-space:pre">		</span>Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
<span style="white-space:pre">		</span>while(it.hasNext()){
<span style="white-space:pre">			</span>Map.Entry<Integer, String> me = it.next();
<span style="white-space:pre">			</span>Integer key = me.getKey();
<span style="white-space:pre">			</span>String value = me.getValue();
<span style="white-space:pre">			</span>System.out.println(key+"::::"+value);
<span style="white-space:pre">		</span>}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值