黑马程序员----集合类

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

集合与数组

数组虽然也可以存储对象,但长度是固定的;

集合长度是可变的。数组中可以存储任意数据类型,集合只能存储对象。

集合的底层运用的还是数组!

集合框架

两大接口

Java集合类主要由两个接口派生出来:

Collection

               Set         :不能存放重复对象

               List        :可存放重复对象,有序

Map      

               Map     :可对集合数据排序

迭代器

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

迭代器在Collcection接口中是通用的,它替代了Vector类中的Enumeration(枚举)。迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException

迭代器的next方法返回值类型是Object,所以要记得类型转换。(学到泛型就可以消除强转!)

Iterator iter = l.iterator();

while(iter.hasNext()){

       System.out.println(iter.next());

}

ListIterator迭代器可以在迭代过程中,对集合中的元素进行增删改!LIst集合专用

List接口中常用类

 

Vector:线程安全,但速度慢,已被ArrayList替代。

ArrayList:线程不安全,查询速度快。

LinkedList:链表结构,增删速度快。取出List集合中元素的方式:

get(int  index):通过脚标获取元素。

iterator():通过迭代方法获取迭代器对象。

ArrayListVector类都是基于数组实现的List,Vector比较古老,ArrayList取代了;

ArrayList是线程不安全的,Vector是线程安全的,但是即使这样,也不推荐使用Vector,因为Collections有方法可以得到线程安全的ArrayList对象;

Collections: static  List synchronizedList(List list)返回指定列表支持的同步(线程安全的)列表。

 

Set接口(元素不可以重复)

HashSet判断对象是否相等,先判断对象的hashCode()的值,false就将对象添加set中,true的话就判断对象equals()的值,false那对象不相同,true对象相同,不添加

SetCollection子接口;

SetCollection基本上一样,一点除外:

Set无法记住添加的顺序,不允许包含重复的元素。

当试图添加两个相同元素进Set集合,添加操作失败,add()方法返回false

Set判断两个对象是否相等用equals,而不是使用==

也就是说两个对象equals比较返回trueSet集合是不会接受这个两个对象的。

TreeSet的排序之自然排序

TreeSet会调用元素的compareTo(Object o)方法来比较元素之间的大小关系,然后将集合里的元素按升序排列.此时需要排序元素的类必须实现Compareble接口,并覆写其int compareTo(Object o)方法;

该方法用于比较对象,:obj1,compareTo(obj2),返回0,表示两个对象相等,若返回一个正整数,表示obj1大于obj2,若返回一个负整数,表示obj1小于obj2;

对于TreeSet集合而言,判断两个对象相等的标准是:

compareTo()方法比较返回 0;

public class Demo13 {
	public static void main(String[] args) {
		
		Set<Integer> s = new TreeSet<Integer>();
		s.add(1);
		s.add(192);
		s.add(123);
		
		s.add(56);
		s.add(13);
		s.add(96);
		System.out.println(s);//[1, 13, 56, 96, 123, 192]
	}
}

TreeSet的排序之定制排序

TreeSet的自然排序是根据元素的大小进行升序排序的,若想自己定制排序,比如降序排序,就可以使用Comparator接口了:

该接口包含int compare(Object o1,Object o2)方法,用于比较两个对象的大小,比较结果和compareTo方法一致;

要实现定制排序,需要在创建TreeSet集合对象时,提供一个一个Comparator对象,该对象里负责集合元素的排序逻辑;

class Student1{
	private Integer age;
	
	public Student1(Integer age) {
		super();
		this.age = age;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return age + "";
	}
}


 

class MyComparator implements Comparator{
	
	@Override
	public int compare(Object o1, Object o2) {
		if(o1 instanceof Student1 & o2 instanceof Student1){
			Student1 s1 = (Student1)o1;
			Student1 s2 = (Student1)o2;
			if(s1.getAge() > s2.getAge()){
				return -1;
			}else if(s1.getAge() < s2.getAge()){
				return 1;
			}
		}
		return 0;
	}


 

public class Demo{
	public static void main(String[] args) {
		Set<Student1> s = new TreeSet(new MyComparator());
		/**
		 * 要实现定制排序,需要在创建TreeSet集合对象时,提供一个一个Comparator对象,
		 * 该对象里负责集合元素的排序逻辑;
		 */
		s.add(new Student1(140));
		s.add(new Student1(15));
		s.add(new Student1(11));
		s.add(new Student1(63));
		s.add(new Student1(96));
		
		System.out.println(s);
	}
}
 

 

Map接口

 

映射关系,也有人称为字典,Map集合里存在两组值,一组是key,一组是valueMap里的key不允许重复。通过key总能找到唯一的value与之对应。

Map里的key集存储方式和对应的Set集合中的元素存储方式一致;

学生都有一个学号,我们能点学号就能找到某个学生,好比这个学号就是key,学生就是value

Map.Entry是Map接口的内部接口,专门用来保存key-value内容

//Map的demo

public class TestDemo {

        public static void main(String[] args) {
                MapTest();
        }
//定义Map集合测试方法
        private static void MapTest()
        {
                //定义一个Hashtable对象
                Map hashTable=new Hashtable<String, Integer>();
                hashTable.put("liuming", 23);
                hashTable.put("jinyao", 22);
                hashTable.put("ganbin", 25);
                //hashTable.put(null,null)会运行出错,因为Hashtable不允许存null值或null键
                
                //Map集合获取集合的Value值有两种方式,分别是使用keySet()和entrySet()方法实现
                //这里使用keySet()方法获取value值,输出结果为:25 22 23
                Set keySet=hashTable.keySet();
                for(Iterator it=keySet.iterator();it.hasNext();)
                {
                        System.out.print(hashTable.get(it.next())+" ");
                }
                System.out.println();
                //定义一个HashMap对象
                Map hashMap=new HashMap<String, Integer>();
                hashMap.put("xiaoming", 12);
                hashMap.put("xiaohua", 13);
                hashMap.put("gouzi", 15);
                hashMap.put(null,null);
                
                //这里使用获取Map集合Value值的第二种方法:entrySet()方法来实现
                //entrySet()返回类型是Set<Map.Entry<k,v>>集合,里面存的类型是:键和值的映射关系。即将Map集合中映射关系存入到Set集合中
                //然后通过Set集合的迭代方法取出关系,通过Map.Entry的getKey()和getValue()分别取出key键和value值。
                Set<Map.Entry<String, Integer>> entrySet=hashMap.entrySet();
                Iterator<Map.Entry<String, Integer> > iterator=entrySet.iterator();
                while (iterator.hasNext()) {
                        Map.Entry<String, Integer> me=iterator.next();
                        String key=me.getKey();
                        Integer value=me.getValue();
                        System.out.print(value+" ");
                }
                System.out.println();
                //定义TreeMap集合,对存入集合中的元素进行排序
                Map treeMap =new TreeMap<String, String>();
                treeMap.put("bb", "yuwen");
                treeMap.put("ee", "shuxue");
                treeMap.put("gg", "yinyu");
                treeMap.put("aa", "wuli");
                treeMap.put("cc", "huaxue");
                treeMap.put("dd", "shengwu");
                
                //这里采用entrySet()方法来取元素,结果为:aa-wuli bb-yuwen cc-huaxue dd-shengwu ee-shuxue gg-yinyu
                //通过取得结果我们会发现TreeMap按键对存入的元素进行了排序。联想到TreeSet,我们可以知道TreeSet和TreeMap都具有排序功能
                Set<Map.Entry<String, String>> teSet=treeMap.entrySet();
                Iterator<Map.Entry<String, String>> iterator2=teSet.iterator();
                while (iterator2.hasNext()) {
                        Map.Entry<String, String> me=iterator2.next();
                        String key=me.getKey();
                        String value=me.getValue();
                        System.out.print(key+"-"+value+" ");
                }
        }
}

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值