集合:
是什么?存数据的,以对象的形式存数据,所有存放的都是对象。
数组也是存数据的,有什么区别啊?
1. 数组的长度是固定的,集合的长度是可变的。
2. 数组可是存放基本数据类型和对象(应用数据类型),而集合只能存储对象。
3. 从存放的数据类型上,集合可以存多种对象,而数组只能存同一种。
集合的体系:
集合就像容器:容器有很多种,每一种的结构,不相同,他们的用途也不像同。
整个集合体系是以跟接口collection向下发展的 ,它有两个常用的只接口。List和Set。
List:有序,有索引,可以重复。Set:无序,没索引,不可以重复,保证元素唯一,怎么保证的呢?(注意:set子类只能用迭代取出)
List下面有三个常用的类,vertor,arraylist,linkedlist。
Vertor:jdk1.0就有的类,同步,增删改查都很慢,被arraylist取代了
arraylist:数组结构,查找快,不同步的,
linkedlist链表结构,不同步,增删元素的速度非常快。
Set下面也有两个常用的类:hashset ,treeset
Hashset:底层是哈希表结构。哈希表也用的是数组结构,他什么怎么保证元素的唯一性呢?
他是通过存储对象的hashcode和equals方法保证元素唯一性的。将数组分区。用元素的特有数据进行哈希运算。判断相应的区有没有这个哈希值,没有就存储,如果有在进行equals运算判断是不是同一个元素,相同不存,不同存储。(补充说明:hashcode和equals方法是object类中的方法。用hashcode存储元素后就不要给他的特有数据,可能会发生内存泄漏。如果要存储对象,对象需要复写hashcode和equals方法,这样存到hashset中的元素才能是唯一的。)
Treeset :底层二叉树结构。对Set集合中的元素的进行指定顺序的排序。那他是怎么保证唯一性的呢?
TreeSet保证元素唯一性的方式:就是参考比较方法的结果是否为0,如果return 0,视为两个对象重复,不存.
他的排序依靠两种方式:
1:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法。
2:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。
两种方式第二中跟好用。(注意:如果有多个比较条件,要用三元运算符)
Map:
双列集合,存放键值对,元素取出有两种方式:keyset enrtyset
子类有:Hashatable,hashmap,treemap
Hashatable不能存放null键和null值,不同步。而hashmap可以存放空键值,同步。Treemap底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。(hashtable:有一个子类properties,可以将键值进行持久化存储的对象,比较重要。)
集合重点说明:
1对于list和其子类,由于是数组结构,存储元素有索引,所有取出元素的方式有很多种.
如:
public static void main(String[] args) {
List list = new ArrayList();
list.add("abc0");
list.add("abc1");
list.add("abc2");
//--------------方式1----------------------
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//---------------方式2 ----------------------
for(Iterator it = list.iterator();it.hasNext(); ){
System.out.println(it.next());
<span style="font-family: Arial, Helvetica, sans-serif; white-space: normal; background-color: rgb(255, 255, 255); "> 用第二中比较高级。</span>
//-------------方式3------------
for(int x=0;x< list.size;x++){
System.out.println(list.get(x));
}
}
}
(注意:在迭代集合过程中,不能对集合进行其他操作,如添加删除等,这时就需要迭代器可以对迭代器的对象进行操作,但是由于Iterator迭代器只有 remove功能,所以建议使用其子接口ListIterator,它具备删除 remove 添加 add 修改 set 等功能,但此功能是List特有 ListIterator列表迭代器)
2对于set集合:
用Hashset集合存储元素,保证唯一,让元素复写hashcode和equals放法(可在元素中中用ALT+SHIFT+S快捷复写)
用Treeset集合存储元素,保证唯一,有两种方法。(这是重点)。
3对于map集合:
元素的两种取出方式:
把map集合转成set的方法:SetkeySet(); Set entrySet();//取的是键和值的映射关系。
取出map集合中所有元素的方式一:keySet()方法。
(A)可以将map集合中的键都取出存放到set集合中。对set集合进行迭代。迭代完成,再通过get方法对获取到的键进行值的获取。
/*Set keySet = map.keySet();
Iterator it = keySet.iterator();
while(it.hasNext()) {
Object key = it.next();
Object value = map.get(key);
System.out.println(key+":"+value);
}
..........................................................................................
Set keySet = map.keySet();
For(Iterator it = keySet.iterator();it.hasNext();)
Objcet key = it.next();
Objcet value =map.get(key);
System.out.println(key+":"+value);
(B)取出map集合中所有元素的方式二:entrySet()方法。
Set entrySet = map.entrySet();
Iterator it = entrySet.iterator();
while(it.hasNext()) {
Map.Entry me = (Map.Entry)it.next();
System.out.println(me.getKey()+"::::"+me.getValue());
}
.................................
Set entrySet = map.entrySet();
for(Iterator it = entrySet.iterator();it.hasNext();){
Entry entry=(Map.Entry)it.next;
Objcet key=entry.getKey();
Objcet value = entry.getValue();
System.out.println(key+":"+value);
}
4.collection和collections 以及arrays。
Collections是集合的工具。里面提供了一些静态的方法。
如:获取集合的枚举:
Enumeration en = Collections.enumeration(al);
Arrays:用于操作数组对象的工具类,里面都是静态方法。
asList方法:将数组转换成list集合。
集合变数组: toArray();