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

--------------------- 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培训、期待与您交流! -------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值