黑马程序员--Java学习笔记之集合框架

来源:互联网 发布:mouldflow软件 编辑:程序博客网 时间:2024/04/28 14:38
--------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! -------------------

一、Collection

Collection|--List:元素是有序的。元素可以重复,因为有索引     |--ArrayList:底层使用数组结构。查询快,但是增加、删除慢。可变长度数组,默认创建是10,如果添加时超过,则会新建一个ArrayList长度为原长的150%,之后把所有元素copy进新的ArrayList。      |--LinkedList:链表数据结构。增加、删除快,查询慢。特有方法:addFirst() addLast() getFirst() getLast() removeFirst() removeLast()1.6之后新方法:peekFirst()....     |--Vector:数组数据结构。和ArrayList差不多,比ArrayList早,是线程同步的。增删查都满。一般不用。可变长度,...200%...。支持枚举取元素(也支持迭代器、遍历)。|--Set:元素无序。元素不可以重复     |--HashSet:底层数据结构式哈希表。无序,不能重复。HashSet如何保证元素唯一性?是通过元素的两个方法,hashCode()和equals()来完成。如果元素的HashCode值相同,才会判断equals是否为true。注意,对于判断元素是否存在、及删除都是依赖于以上两个方法。而ArrayList只依赖于equals()     |--TreeSet:可以对Set集合中的元素进行自然排序。往TreeSet中存放的对象具有比较性。(可以实现Comparable,并覆盖int compareTo()方法,强制使其具备可比较性)排序时,当主要条件相同时一定要判断次要条件。不能存入重复元素。*使用二叉树,仿堆栈?仿队列?compareTo()返回1 0 -1(各含义)

TreeSet集合排序方式

1、实现Comparable接口,覆盖compareTo()方法
2、当元素不具备可比较性时,让集合具有可比性。定义一个比较器,并在集合在初始化时传递给TreeSet的构造函数

当两种排序都存在时,以比较器为主

二、Collection和Collections的关系

Coolection是java.util包下的一个集合接口,是将各集合类向上抽象出的最顶端的接口。它为各种具体集合提供了统一的操作方式。它的最重要的两个子接口是List和Set。

Collections是java.util包下的一个集合工具类,它包含了各种和集合操作有关的静态方法,比如常见的搜索、排序操作、线程安全化等。

三、List和Set的异同点

1、相同点:List和Set都是Collection的子接口,都能存储元素,也都具有集合常用的操作方法,比如增加、删除、查找、判断等。

2、不同点:List的底层实现主要是数组或者链表数据结构,因此是有序的,并且有索引,这样可以精确的定位到List中具体位置的元素,类似于数组;List中可以存储重复的元素。

 Set的底层实现主要是哈希表或者二叉树,所以是无序的(其中实现类TreeSet可以自然排序,除外),Set中不可以存储重复的元素。

四、Map中的常用类,以及各自的特点

Map<K,V>   映射关系。和Set很像,其实Set底层就是使用Map集合|--Hashtable:底层是哈希表数据结构。不允许存入null建和值。线程同步。api 1.0 效率低下|--HashMap:底层是哈希表数据结构。允许存入null建和值。线程不同步。api 1.0 效率高|--TreeMap:底层是二叉树。可以用于给map中的键进行排序。线程不同步。

五、并发修改异常

ArrayList al = new ArrayList();al.add("java");//集合操作数据al.add("net");Iterator it = al.iterator();//获取迭代器,用迭代器操作数据while(it.hasNext()){System.out.println(it.next());al.add("c++");//异常,并发修改异常。集合、迭代器同时操作同一组数据}
此时要使用Interator的子类ListInterator。

六、泛型
1、jdk1.5之后出现的新特性,解决集合储存对象的安全隐患
2、利弊

利:(1)将运行时期出现的ClassCastException转移到编译时期;
(2)避免了强制转换的麻烦。

弊:不能使用特定类型中的方法。

3、使用

(1)将泛型定义在类上

class Demo<T>{        public void show(T t){}public <Q> void method(Q q){}}
(2)将泛型定义在方法上;

public <T> void show(T t){}
(3)将泛型定义在接口上

4、注意事项

<?>通配符、占位符
泛型限定:(上限)<? extends Person> //可以接受Person及其子类型
(下限)<? super Student> //可以接受Student及其父类

ArrayList<Person> al = new ArrayList<Student>();//错误,前后必须一致,继承也不行




--------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! -------------------
原创粉丝点击