您的位置:首页 > 职场人生

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

2014-02-23 21:18 232 查看
----------------------
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():通过迭代方法获取迭代器对象。

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

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

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

 

Set接口(元素不可以重复)
HashSet判断对象是否相等,先判断对象的hashCode()的值,false就将对象添加set中,true的话就判断对象equals()的值,false那对象不相同,true对象相同,不添加
Set是Collection子接口;
Set和Collection基本上一样,一点除外:

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

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

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

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

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,一组是value。Map里的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: