---------------------- 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