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

----------------- 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>
ArrayListLinkedList总结
1    ArrayList是基于动态数组的数据结构,LinkedList基于链表的数据结构。
2    对于访问查询数据,ArrayList要优于LinkedList,因为LinkedList只能移动指向标(c中指针)一个一个的去查询
3    对于要对数据进行增删操作,那么LinkedList要优于ArrayList,因为ArrayList要移动数据而LinkedList只要断开或添加指向
      特殊条件时-----若只对单个数据插入或删除,ArrayList的速度反而优于LinkedList。
      添加删除数据越来,LinkedList的效果越明显




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值