Java集合框架

来源:互联网 发布:ehviewer网络错误 编辑:程序博客网 时间:2024/05/04 21:56


-------------------------------

Collection

|--List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。

|--Vector:内部是数组数据结构,是同步的。增删,查询都很慢!
|--ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。
|--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快

|--Set:元素不能重复,无序。

|--HashSet: 内部数据结构是哈希表 ,是不同步的。

|--TreeSet:可以对Set集合中的元素进行排序。是不同步的。

需要注意的问题:

1:在使用迭代器Iterator时,不要同时进行集合操作,会发生ConcurrentModificationException异常

可以使用Iterator的子类ListIterator来完成(List特有的)

     ArrayList<String> al = new ArrayList<String>();

al.add("abc");
al.add("hahah");


ListIterator<String> it = al.listIterator();
while(it.hasNext()){
String str = it.next();
if(str=="abc")
{
it.add("as");
}
System.out.println(str);
}           

//在遍历list的同时,在list中加入了一个元素

//此时list中的元素有abc、hahah、as


2:List的contains,remove方法都调用的是equals方法

所以List判断是否包含否元素时,包含的对象须复写equals方法


3:HashSet如何保证该集合的元素唯一性呢?
是通过对象的hashCode和equals方法来完成对象唯一性的。
如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 
如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。
如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。

记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。
一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。
建立对象判断是否相同的依据

3:判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。 

TreeSet对元素进行排序的方式一:
让元素自身具备比较功能,元就需要实现Comparable接口。覆盖compareTo方法。

如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?
可以使用TreeSet集合第二种排序方式二:
让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。
将该类对象作为参数传递给TreeSet集合的构造函数。


public class ComparatorByName implements Comparator<Person> {

public int compare(Person o1, Person o2) {

int temp = o1.getName().compareTo(o2.getName());
return temp==0? o1.getAge()-o2.getAge(): temp;
}
}

TreeSet<Person> ts = new TreeSet<Person>(new ComparatorByName());

两种方法均有时,比较器优先


4:集合的一些技巧:
需要唯一吗?
需要:Set
需要制定顺序: 
需要: TreeSet
不需要:HashSet
但是想要一个和存储一致的顺序(有序):LinkedHashSet
不需要:List
需要频繁增删吗?
需要:LinkedList
不需要:ArrayList

Map
|--Hashtable :内部结构是哈希表,是同步的。不允许null作为键,null作为值。
|--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。
|--HashMap : 内部结构是哈希表,不是同步的。允许null作为键,null作为值。
|--TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。 

后缀名就是该集合所属的体系。
前缀名就是该集合的数据结构。

看到array:就要想到数组,就要想到查询快,有角标.
看到link:就要想到链表,就要想到增删快,就要想要 add get remove+frist last的方法 
看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法。 
看到tree:就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator 。


而且通常这些常用的集合容器都是不同步的。 


============================================


Map常用的子类:
|--Hashtable :内部结构是哈希表,是同步的。不允许null作为键,null作为值。
|--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。
|--HashMap : 内部结构是哈希表,不是同步的。允许null作为键,null作为值。
|--TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。 

1:Map遍历:

方法一:

//取出map中的所有元素。
//原理,通过keySet方法获取map中所有的键所在的Set集合,在通过Set的迭代器获取到每一个键,
//在对每一个键通过map集合的get方法获取其对应的值即可。
/*
Set<Integer> keySet = map.keySet();
Iterator<Integer> it = keySet.iterator();

while(it.hasNext()){
Integer key = it.next();
String value = map.get(key);
System.out.println(key+":"+value);

}


方法二:

* 通过Map转成set就可以迭代。
* 找到了另一个方法。entrySet。
* 该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型就是Map.Entry类型(结婚证)
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();

Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();

while(it.hasNext()){
Map.Entry<Integer, String> me = it.next();
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key+"::::"+value);

}

2:HashMap保证键唯一(通HashSet保证元素唯一)

复写hashCode,equals方法

TreeMap按键排序(同TreeSet)




0 0
原创粉丝点击