您的位置:首页 > 职场人生

黑马程序员--集合框架(一)

2014-06-16 19:24 239 查看
----------------- android培训java培训、期待与您交流!-----------------

集合框架--

java集合(Collection)就是用来存储对象的容器,不同的对象具有不同的数据结构,java中提供了几种常见的结构用来存储对象

Collection <E> 是所有collection层次结构中的根接口,

1 --List 有序的集合,允许重复元素,允许元素为null。凡有操作角标方法都是该集合体系下的方法,

因为该集合体系有索引。判断集合元素是否相同是使用equals()方法。

a -- Vector 底层是数组结构,线程同步,效率低,已被ArrayList取代。

b -- ArrayList 底层结构与Vector相同,但线程不同步,更安全。查询速度快,增删速度慢。

c -- LinkedList 底册是链表结构,增删速度快,查询速度慢,线程不同步。

2 --Set 无序的集合,不允许重复元素,最多允许一个null元素。Set实现的基础是hashMap结构。

a-- HashSet 底层结构是哈希表,线程不同步。

b-- TreeSet 底层结构是二叉树,特点有序集合(有默认的自然排序,也可自定义比较器排序)。

Map<k,v> 一个不是Collection体系的接口,map提供key到value的映射关系。一个map不能包含相同的key,每个key与value相对应。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。

1 -- HashTable 底层基于哈希表
,键,值 不能为空。线程同步,jdk1.0出现,效率低。已被1.2的HashMap取代。

2 -- HashMap 底层基于哈希表,允许键值为空(只有一个),线程不同步。

3 -- TreeMap 底层基于二叉树,线程不同步。可对集合中对象进行排序。

这就是java集合的一个大致常用的使用集合容器,这些多个容器的出现,不同的数据有着不同的数据结构,他们有着不同的存储方式。

在看看Collection定义了集合框架的共性方法:

1,添加add(e);addAll(collection);

2,删除 remove(e);removeAll(collection);clear();

3,判断。contains(e); isEmpty();

4,获取 iterator();size();

5,获取交集。retainAll();

6,集合变数组。toArray();

下面来来具体看看List集合的使用方式与应用

1 ArrayList ArrayList实现了可变大小的数组。每个ArrayList实例都有一个容量,即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加。

<span style="font-size:14px;">	/**
* ArrayList  基本使用方式
*/
public static void arraylistD(){
ArrayList<String>  al  =new ArrayList<String>();
al.add(0,"a1"); al.add("a2");al.add("a3");al.add("a4");		//添加数据--可在指定位置添加
al.remove(0);			//删除指定位置数据
al.set(1, "new a1");		//修改数据
al.get(2);   			//获取指定位置数据
al.indexOf("a3");    		//获取数据的位置
System.out.println(al);
//		al.clear();	               //清除集合元素

//		迭代器---就是集合元素的  取出方式
for (Iterator<String> it = al.iterator(); it.hasNext();) {
//迭代器的使用,用于便利元素----迭代时,只能使用迭代器中的方法,是不能使用集合对象中的方法来操作元素的
String s=it.next();
//			 it.remove();
System.out.println(s);
}

//		Iterator<>迭代器中的方法有限,hasNext()、next()、remove()只能对元素进行判断,取出,删除。不能进行添加,修改的操作
//		这时如果要进行添加修改那么就要使用List集合体系特有的迭代器
for (ListIterator<String> it = al.listIterator(); it.hasNext();) {
String s = it.next();
if (s.equals("a2")) {
it.set("set   aa");
//				it.add("00000");
}
System.out.println(s);
}
}</span>


2 LinkedList

LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的 获取,删除,添加方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

下面看看具体代码

/**
* LinkedList  特有方法演示
*/
public static void linkedlistD(){
LinkedList< String> link =new LinkedList<String>();
link.addFirst("addFirst  1");   //在前|后添加元素
link.addLast("addLast  2");
link.offerFirst("offerFirst  3");  //jdk1.6新方法
link.offerLast("offerLast  4");
System.out.println(link);
//获取元素方法,但不删除元素,无元素则报异常NoSuchElementException
System.out.println(link.getFirst()  +"--get--"+ link.getLast());
//jdk1,6-获取元素,不删除元素,无元素则返回null
System.out.println(link.peekFirst() +"--peek--"+link.peekLast());
//获取元素,不删除元素,若无元素则报异常NoSuchElementException
System.out.println(link.removeFirst() +"--remove--"+link.removeLast());
//jdk1.6-获取元素,但元素会被删除,若无元素则返回null
System.out.println(link.pollFirst()+"--poll--"+link.pollLast());
}
再来看看一个用链表进行简单的堆栈和队列模拟

<span style="font-family:Arial;font-size:12px;">/**
* 使用LinkedList模拟队列结构
*/
class Duilie{
private  LinkedList<Object> linkedList;
Duilie(){
linkedList = new LinkedList<Object>();
}
public  void rudui(Object o){
linkedList.addLast(o);
}
public Object chudui(){
return linkedList.removeFirst();
}
public boolean isNull(){
return linkedList.isEmpty();
}
}

/**
* 使用LinkedList模拟堆栈结构
*/
class Duizhan{
private  LinkedList<Object> linkedList;
Duizhan(){
linkedList = new LinkedList<Object>();
}
public  void jinzhan(Object o){
linkedList.addLast(o);
}
public Object chuzhan(){
return linkedList.removeLast();
}
public boolean isNull(){
return linkedList.isEmpty();
}
}

public class LinklistTest {

public static void main(String[] args) {
Duilie d =new Duilie();
d.rudui("zhy 0");    d.rudui("zhy 1");
d.rudui("zhy 2");    d.rudui("zhy 3");
System.out.println("队列--");
while (!d.isNull()) {
print(d.chudui());
}

print("堆栈--");
Duizhan dz = new Duizhan();
dz.jinzhan("zhy 0");    dz.jinzhan("zhy 1");
dz.jinzhan("zhy 2");    dz.jinzhan("zhy 3");
while (!dz.isNull()) {
System.out.println(dz.chuzhan());
}
}
}</span>
ArrayList和LinkedList总结

1 ArrayList是基于动态数组的数据结构,LinkedList基于链表的数据结构。

2 对于访问查询数据,ArrayList要优于LinkedList,因为LinkedList只能移动指向标(c中指针)一个一个的去查询

3 对于要对数据进行增删操作,那么LinkedList要优于ArrayList,因为ArrayList要移动数据而LinkedList只要断开或添加指向

特殊条件时-----若只对单个数据插入或删除,ArrayList的速度反而优于LinkedList。

添加删除数据越来,LinkedList的效果越明显
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: