`
Luob.
  • 浏览: 1571488 次
  • 来自: 上海
社区版块
存档分类
最新评论

java之14天 Collection,Vectory,ArrayList集合 (一)

    博客分类:
  • Java
阅读更多
Collection集合框架

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/***
 *Cellection
 *    |--List:元素是有序的,元素可以重复,因为该集合体系有索引.
 *        |--ArrayList   :底层的数据结构使用的是数组结构,特点: (查询,修改)速度很快,但是(插入删除)很慢 ,线程不同步
 *        |--LinkedList  :底层使用的是链表数据结构,特点: (查询,修改)慢,(插入,删除)快! 线程不同步
 *        |--Vector      :元老级干部 1.0的时候 就是Vector天下,1.2后 集合框架才出来. 
 *        					特点 :线程同步,
 *                              底层是数据结构是数组结构.被ArrayList替代了.
 *                              如果后期要用到同步的,那么也不使用vector,需要自己加锁.
 *                              
 *        数组结构 的 	ArrayList  和   Vector 一般数组长度是不变的  
 *           ArrayList:默认长度为10,以后使用 50%的增加,超过后,将原来的10个元素复制到 长度为15的数组中,然后再在后面添加新的元素(可变长度数组,就是不断new数组完成的)
 *           Vector:默认长度为 10,超过后100%延长,这样就变成了20,比较浪费空间
 *        
 *        
 *    |--Set : 元素是无序,元素不可以重复,该集合中没有索引.
 *   
 * List:
 *    特有方法: 凡是可以操作角标的方法都是该体系中特有的方法.
 *    
 * 增
 *   add(index,element)
 *   addAll(index,Collection);
 * 删
 *   remover(index);
 * 改
 *   set(index,element);
 * 查
 *   get(index)
 *   subList(from,to);
 *   listIterator();
 *   
 * list集合特有的迭代器 叫做 listIterator 是Iterator的子接口.
 * 
 * 在迭代时,不可以通过集合对象的方法操作集合中的呀un苏.因为会发生ConcurrentModificationException
 * 
 * 所以,在迭代时,只能使用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作.
 * 如果想要其他的操作如,添加  修改 等就需要使用  listIterator 子接口
 * 
 * 该接口只能通过list集合的listIterator 获取
 * 
 * 
 * 
 */


public class ListDemo {
	public static void sop(Object obj){
		System.out.println(obj);
	}
	
	public static void main(String[] args) {
		method_1();
		method_2();
	}
	
	public static void method_2(){
		//演示列表迭代器
		ArrayList al=new ArrayList();
		al.add("java01");
		al.add("java02");
		al.add("java03");
		sop("原集合:"+al);
		
		//跌带动的时候  找到后想删除 发现 使用普通的 Iterator 不能做到  
		/*Iterator it=al.iterator();
		while(it.hasNext()){
			Object obj=it.next();
			if(obj.equals("java02")){
				//发现 有问题  .因为在使用it时候,同时对集合al进行了操作,这样就有可能出现安全问题
				al.add("java08");
				//it.remove(); //在使用 Iterator 的只能使用  Iterator的方法.
			}
			sop("obj="+obj);
		}*/
		
		//正向遍历
		ListIterator li=al.listIterator();
		while(li.hasNext()){
			Object obj=li.next();
			if(obj.equals("java02")){
				li.add("java007");
			}
		}
		sop("obj="+al);
		
		//逆向遍历
		while(li.hasPrevious()){
			sop("previous:"+li.previous());//是否有前一个 
		}
	}
	public static void method_1(){
		ArrayList al=new ArrayList();
		al.add("java01");
		al.add("java02");
		al.add("java03");
		sop("原集合:"+al);
		
		//在制定的位置添加元素
		al.add(1,"java09");
		sop("添加:"+al);
		
		//删除指定位置上的元素
		al.remove(2);
		sop("删除:"+al);
		
		
		//修改元素
		al.set(2, "java007");
		sop("修改:"+al);
		
		//通过角标获取元素
		sop("get(1):"+al.get(1));
		
		//获取所有元素
		for(int x=0;x<al.size();x++){
			System.out.println("al("+x+")="+al.get(x));
		}
		
		Iterator it=al.iterator();
		while(it.hasNext())
			it.next();
		
		//通过indexOf获取对象的位置
		sop("indexOf="+al.indexOf("java09"));
		
		List sub=al.subList(1, 2);
		sop("sub"+sub);
		
	}

}



Collection的操作

/**
 *集合类
 * 1.add方法 的参数类型是Object,以便于接受任意类型对象
 * 2.集合中存储的都是对象的引用  (地址)
 * 
 * 什么是迭代器呢 ?
 *   其实就是  集合的取出元素的方式.
 *  
 *
 */
public class CollectionDemo {

	public static void main(String[] args) {
		
		base_method2();
		method_get();
	}
	
	//取出元素
	public static void method_get(){
		ArrayList al=new ArrayList();
		al.add("java01");
		al.add("java02");
		al.add("java03");
		al.add("java04");
		al.add("java05");
		
		/*
		 * 
		Iterator it=al.iterator(); //获取迭代器 用于取出集合中的元素
		while(it.hasNext())
			sop(it.next());
		 */
		
		//这种有优势, 增加了 内存优化,使用完后  it就会被回收.
		for(Iterator it=al.iterator();it.hasNext();){
			sop(it.next());
		}
		
	}
	
	//取交集 批量删除
	public static void base_method2(){
		
		ArrayList al=new ArrayList();
		al.add("java01");
		al.add("java02");
		al.add("java03");
		al.add("java04");
		al.add("java05");
		
		ArrayList al2=new ArrayList();
		al2.add("java01");
		al2.add("java02");
		al2.add("java05");
		al2.add("java06");
		
		//al.retainAll(al2); //取交集,al中只会保留和 al2中相同的元素
		al.removeAll(al2);// 一次删除一堆元素
		sop("al1"+al);
		sop("al2"+al2);
		
		
		
	}
	public static void base_method(){
		//创建一个集合容器,使用Collection接口的子类.ArrayList
		ArrayList al=new ArrayList();
		al.add("java01");
		al.add("java02");
		al.add("java03");
		al.add("java04");
		al.add("java05");

		//1.获取集合的长度
		sop("size:"+al.size());
	
		//2.打印集合
		sop("原集合:"+al);
		
		//3.删除元素
		al.remove("java02");
		sop("现集合:"+al);
		//判断元素
		sop("java03是否存在:"+al.contains("java03"));
		sop("集合是否为空:"+al.isEmpty());
		
		//清空集合
		al.clear();
		sop("现集合:"+al);
	}
	
	public static void sop(Object obj){
		System.out.println(obj);
	}
	

}


Vector

/**
 * 元老级 
 * Vector类中 带有Element的就是 Vector的特有方法
 * 
 * Enumeration 枚举 就是早起Vector特有的取出方式.
 * 发现 枚举和 迭代器很像
 * 
 * 其实枚举和 迭代器是一样的.
 * 因为枚举的名称以及方法的名称都过长,所以被迭代器取代了 枚举郁郁而终了
 *
 */
public class VectorDemo {
	//Vector中 带有Element的就是 Vector的特有方法
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Vector v=new Vector();
		v.add("java01");
		v.add("java02");
		v.add("java03");
		v.add("java04");
		
		Enumeration en=v.elements();
		while(en.hasMoreElements()){
			System.out.println(en.nextElement());
		}
			
	}

}


ArrayList的使用
/**
 * 将自定义对象最为元素存储到ArrayList集合中,并除去重复元素
 * 比如 :存人对象, 同姓名 同年龄,视为同一个人,为重复元素
 * 
 * 思路:
 *	 1.对人描述,将数据封装进人对象
 *   2.定义容器,将人存如
 *   3.取出 
 *   
 * List判断元素是否相同,依据的是元素的equals
 *
 */
class Person{
	private String name;
	private int age;
	
	Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	public String getName(){
		return name;
	}
	public int getAge(){
		return age;
	}
	@Override
	public boolean equals(Object obj) {
		
		if(!(obj instanceof Person))
			return false;
		Person p=(Person)obj;
		
		return this.getName().equals(p.getName()) && this.getAge()==p.age;
	}
	
	
}


public class ArrayListDemo {
	public static void main(String[] args) {
		ArrayList al=new ArrayList();
		al.add(new Person("admin",12));
		al.add(new Person("BBBBB",12));
		al.add(new Person("CCCCC",12));
		al.add(new Person("admin",12));
		
		al=singleElement(al);
		Iterator it=al.iterator();
		while(it.hasNext()){
			//sop(it.next().getName()+"::"+it.next().getAge());//编译失败 父类引用指子类对象
			Person p=(Person)it.next();
			sop(p.getName()+":::"+p.getAge());
		}
		
		sop("remove 03:"+al.remove(new Person("BBBBB",12)));
		sop(al);
	}
	

	public static void sop(Object obj){
		System.out.println(obj);
	}
	
	public static ArrayList singleElement(ArrayList al){
		//定一个容器
		ArrayList newAl=new ArrayList();
		
		Iterator it=al.iterator();
		while(it.hasNext()){
			Object obj=it.next();
			
			if(!newAl.contains(obj))  //判断的是对象是否相同
				newAl.add(obj);
		}
		return newAl;
	}

}


ArrayList的练习

/**
 * 去除ArrayList中的重复元素
 */
public class ArrayListTest {

	
	public static void sop(Object obj){
		System.out.println(obj);
	}
	
	public static void main(String[] args) {
		ArrayList al=new ArrayList();
		al.add("java01");
		al.add("java01");
		al.add("java02");
		al.add("java01");
		al.add("java02");
		al.add("java03");
		
		sop("原集合:"+al);
		sop(al=singleElement(al));
			
		/*在迭代时循环中next调用一次,就要使用hasNext判断一次
		Iterator it=al.iterator();
		while(it.hasNext()){
			System.out.println(it.next()+"..."+it.next());
		}
		*/
	}
	
	public static ArrayList singleElement(ArrayList al){
		//定一个容器
		ArrayList newAl=new ArrayList();
		
		Iterator it=al.iterator();
		while(it.hasNext()){
			Object obj=it.next();
			
			if(!newAl.contains(obj))
				newAl.add(obj);
		}
		return newAl;
	}

}
2
5
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics