黑马程序员------集合总结*

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------



一、为什么出现了集合

因为面向对象中对事物都是以对象的形式而体现,为了方便对对象的操作,首先要对对象进行存储,而集合就是存储对象的一个很好的容器


二、集合和数组的区别

1、数组长度是固定的;集合长度是可变的

2、数组可以存储基本数据类型和引用数据类型;集合只能够存储对象

3、数组只能怪存储同一类型数据;集合可以存储不同类型的对象


三、集合的体系图



Collection是集合框架中常用的一个接口,其下有两个子接口List和Set

Collection

|--List(列表):集合中元素存放和提取是有序的;元素可以重复,因为该集合体系有索引

|--ArrayList

|--LikedList:

|--Vector:

|--Set(集):集合中元素存放和提取时无序的;元素保证唯一性

|--HashSet:

|--TreeSet:


四、迭代器

1、为什么会出现迭代器

每一个容器都有存和取的方式,而每个容器的底层数据结构不一样,所以存取方式可能也会不一样。因为要想从容器中取出数据,首先要判断容器中是否有这个数据,对于取出这个动作,不足以用一个函数来描述,基于封装思想,把这些方法封装在一个对象中,因此每个容器中都会有一个这样的对象,这时,由于容器中的元素在容器中去更方便,所以把这个对象抽象出来形成类定义在类中,形成类部类,而每个容器都有类部类,这时候再把这些类的共性(判断、取出)抽取出来形成一个接口Iterator。那么如何获取集合的取出对象呢,通过对外提供的一个方法iterator。

2、迭代器的好处

好处一,因为定义了迭代器,以后再有新的容器出现,直接实现这个接口就可以取出数据了

好处二,java使用了迭代器可以使得对容器的遍历操作和其底层完全隔离,达到很好的解耦效果

3、迭代器的创建

Iterator i  =集合对象.iterator();

迭代器的引用不是通过new创建的,而是通过集合对象调用iterator方法创建的。

因为Collection容器实现了Iterator接口,所以Collection的子类集合对象都具备迭代器

4、取出方式

第一种,for(Iterator i = 集合对象.iteraotor();i.hasNext()){i.next()}

第二种,Iterator i = 集合对象.iterator();   while(i.hasNext()){e.next()}

注意:迭代器的next方法返回的是Object,所以要进行类型转换

5、ListIterator接口

 ListIteratorList集合特有的迭代器,是Iterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。所以在迭代器时,只能用迭代器的方法操作元素。可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作。如果想要其他的操作,如添加、修改等,就需要使用其子接口:ListIterrator。该接口只能通过List集合的ListIterator方法获取。


ListIterator特有的方法

        add(obj);//后面增加一个元素

        set(obj);//该元素修改为obj

        hasPrevious();//判断前面有没有元素

        previous();//取前一个元素




五、List集合

List:元素存放时有序的,因为有索引,所以可以重复(不需要hashCode和equals方法保证元素唯一性)

|--ArrayList:底层数据结构是数组结构,采用数组形式来保存对象,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦(索引),线程不同步

|--LinkedLst:底层数据结构是链表结构,把每个对象存放在独立的空间中,每个空间存放着下一个对象的索引,每次需要查找时都需要从第一个索引开始

|--Vector:底层数据结构是数组结构,线程不同,枚举是Vection特有的方法,其作用和迭代器是一样的,因为其名称和方法的名称都过长,所以被ArrayList取代了。

注意:凡是可以操作角标的方法都是该集合体系特有的方法!

ArrayList集合方法:

//指定位置添加元素
al.add(1,"haha");
print(al);

//指定位置添加集合
al.add(1,al1);
print(al);

//指定位置删除元素
al.remove(1);
print(al);

//查找指定位置元素
print(al.get(0));

//修改指定位置的元素
al.set(1,"heihei");
print(al);

//获取对象位置indexOf(Object obj)
print(al.indexOf("heihei"));

//返回指定范围的元素(包头不包尾)
print(al.subList(1,3));


LinkedList集合特有方法:

 :以下方法如果列表为空,则抛出异常

  addFirst(); //将指定元素插入到此列表的开头 
  addLast();//将指定元素插入到此列表的结尾
    获取但不删除元素
  getFirst();
  getLast(); 
    获取并删除元素
  removeFirst();
  removeLast();
    :以下方法如果列表为空,则返回null
  offerFirst();
  offerLast();
  //获取不删除
  peetFirst();
  peetLast();
  //获取并删除
  pollFirst();
  pollLast();
 


六、Set集合

Set:元素存放时无序的,并且集合中元素具有唯一性,不可以重复

|--HashSet:底层数据结构是哈希表,线程不同步,可以存入null,但因为元素的唯一性,只能够存入一个null值,保证元素唯一性的原理是:使用了hashCode方法和equals方法,当我们使用add方法往集合中添加对象时,在add方法内部会首先调用hashCode方法来计算对象的哈希值,如果返回的哈希值和集合中已经存有的元素哈希值不一致,那么就将该对象添加进集合中,这时因为不同对象的哈希值也可能相同,所以当该对象哈希值和集合中已经存有的元素哈希值相同时,会继续调用equals方法来判断。

|--TreeSet:底层数据机构是二叉树,不可以存入null,保证元素唯一性的原理是:复写了Comparable接口中的compareTo方法,当使用add方法往集合中添加对象时,首先会遍历集合中已经存在的数据,并调用compareTo方法,根据方法的返回值决定是否插入和插入的位置。



1、HashSet集合:

hashCode方法和equals方法;

	
        public int hashCode(){
		return this.name.hashCode()+age;
	}
	
	public boolean equals(Object obj){
		if(!(obj instanceof Student)){
			return flase;
		}else{
			Student s =(Student) obj;
			return this.name.equals(obj.name) && this.age==s.age;
		}
	}

注意:HashSet判断元素是否存在和删除元素时也是调用了hashCode和equals方法


2、TreeSet集合:

保证元素唯一性是调用了Comparable接口中的compareTo方法;

对元素进行排序有两种方式:

1、让元素自身具备比较性,调用Comparable接口中的compareTo方法,通过返回值进行排序,这种方式也称为元素的自然排序,也叫默认排序

	
               	public int compareTo(Object obj){
		    if(obj instanceof Student){
			throw new RunTimeException("此对象不是所属Student类");
		    }else{
			Student s = (Student)obj;
			//这里根据年龄进行排序,如果年龄相同,在判断姓名,注意,这里比较年龄时要形成Integer类的对象,因为compareTo方法只能怪比较对象
			if(0==(new Integer(this.age).compareTo(new Integer(s.age)))){
				return this.name.compareTo(s.name);				
			}
			}else{
				return new Integer(this.age).compareTo(new Integer(s.age));
			}
		}
		}


2、当元素自身不具备比较性,或是该比较性不是所需要的时候就需要创建比较器,此比较器为一个自定义类实现Comparator接口,并且复写compare方法的对象

class Bijiaoqi implements Cpmparator{
	public int compare(Object obj1,Object obj2){
		Student s1 =(Student)obj1;
		student s2 =(student)obj2;
		
		int dj = s1.getName().compareTo(s2.getName());
		if(dj==0){
			return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
		}else{
			return dj;
		}
	}
}



七、Map集合(Map<K,V>)

何时使用Map集合

当数据之间存在映射关系的时候使用Map集合


Map集合与Collection集合的区别

1、Map集合和Collection集合在集合框架中是并列存在的

2、Map集合是一个双列集合,存储的是键值对;Collection集合是一个单列集合,存储的是单个对象

3、Map集合存入键值对的方法是put方法;Collection集合存入对象的方法是add方法


Map集合的特点:

1、存入键值对是一对一对的存入

2、保证键的唯一性

3、Map集合中没有直接取出值的方法,只有通过keySet方法获取到键存到Set集合中,然后再通过创建迭代器来获取相应的值;或者通过entrySet方法获取映射关系存到Set集合中,然后通过创建迭代器取出映射关系,再通过Map.Entry接口实例的getKey方法和getValue方法来获取键和值


Map集合的子类

|--hashtable:底层是哈希表数据结构,不可以存入null键和null值,线程同步,JDK1.0,效率低,已被HashMap取代。

|--hashMap:底层是哈希表数据结构,可以存入null键和null值,因为键的唯一性,所以只能存一个null,线程不同步,JDK1.2,效率高

|--TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行排序


Mao集合中的方法:

m.put("01","zs1");
m.put("02","zs2");
/*
* put方法:
* 1、当集合中没有新加入的元素时,返回null
* 2、当集合中已经存在新加入的元素时,返回该值
* 3、第二次加入同样的值,会覆盖前面的值
* */
System.out.println("put:"+m.put("03","zs3"));
System.out.println("put:"+m.put("03","zs33"));

//判断是否包含"01"键
System.out.println("containsKey:"+m.containsKey("01"));

//判断是否有"01"键,有的话返回这个键对应的值,没有的话返回null
//System.out.println("remove:"+m.remove("01"));

//判断是否有“01”键,有的话返回这个键对应的值,没有的话返回null
System.out.println("get:"+m.get("01"));
System.out.println("get:"+m.get(null)); //如果是Hashtable类就不行

//获取Map集合中所有的值(注意:这里values方法的返回类型是Collection。Collection coll = m.values())
System.out.println("values:"+m.values());



八、Map集合的两种取出方式

1、通过keySet方法获取到键存到Set集合中,然后再通过创建迭代器来获取相应的值

//第一种方法,调用keySet方法
		Set s = m.keySet();
		
		Iterator i = s.iterator();
		
		while(i.hasNext()){
			String str = i.next();
			System.out.println(str+"....."+m.get(str));
		}

2、通过entrySet方法获取映射关系存到Set集合中,然后通过创建迭代器取出映射关系,再通过Map.Entry接口实例的getKey方法和getValue方法来获取键和值

//第二种方法,调用enteySet方法
		Set<Map.Entry> s1 = m.entrySet();
		
		Iterator<Map.Entry> i1 = s1.iterator();
		
		while(i1.hasNext()){
			Map.Entry me = i1.next();
			String str1 = me.getKey();
			String str2 = me.getValue();
			System.out.println(str1+"....."+str2);
		}



---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值