黑马程序员----JAVASE之集合操作【上】






--------------  android培训 java培训 、期待与您交流! ---------------

1.集合体系

集合是用来存储和管理其他对象的对象,即对象的容器。集合可以扩容,长度可变,可以存储多种类型的数据而数组长度不可变,只能存储单一类型的元素。

Java平台提供了一个全新的集合框架。“集合框架”主要由一组用来操作对象的接口组成。不同接口描述一组不同数据类型。(如图)



从上图可以发现:

集合接口:6个接口,表示不同集合类型,是集合框架的基础。
抽象类:5个抽象类,对集合接口的部分实现。可扩展为自定义集合类。
实现类:8个实现类,对接口的具体实现。

其中我们可以根据图可以看出集合框架可以分为两个部分,一个是Collection集合体系部分,一个是Map体系部分。


2.Collection接口

用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。

Collection体系:

|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
|--Set:元素是无序,元素不可以重复。


3.List接口


* ArrayList

在实际开发中比较常用的,底层使用的是数组的数据结构,所有在查询速度上比较快,但是增删稍慢,在实际开发中如果

我们对数据的查询的时候我们可以选择这中List进行存储数据。

* List接口的特有方法。


add(index,element);
addAll(index,Collection);

remove(index);

set(index,element);

get(index):
subList(from,to);
listIterator();
int indexOf(obj):获取指定元素的位置。
ListIterator listIterator();

List集合特有的迭代器。ListIterator是Iterator的子接口。

ArrayList al = new ArrayList();
		al.add("java01");
		al.add("java02");
		al.add("java03");
		sop(al);
		ListIterator li = al.listIterator();
		while(li.hasNext())
		{
			Object obj = li.next();

			if(obj.equals("java02"))
				li.set("java006");
		}
		while(li.hasPrevious())
		{
			sop("pre::"+li.previous());
		}
一下为常见案例

1.去除ArrayList集合中的重复元素。

import java.util.*;
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("java02");
		al.add("java01");
		al.add("java02");
		al.add("java01");
		sop(al);	
		al = singleElement(al);
		sop(al);
		

	}

	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;
	}
}

其实我们在去除List集合的重复元素的的时候我们可以利用Set集合的构造方法去除即:

Set set = new HashSet(list);

然后在List list = new ArrayList(set);就OK了。

其实在去除重复元素的内部原理就是利用了equals方法。如果我们在一个去除重复元素时我们可以重写一下equals就OK了。

import java.util.*;
//封装人
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;
	}
	//contains原理为调用equals,这里实现equals的覆盖,比较对象中姓名及年龄是否全一样
	public boolean equals(Object obj)
	{
		if (!obj instanceof Person)
			return false;
		Person e = (Person)obj; //向下转型
		return this.name.equals(e.name) && this.age==e.age;
	}
}
class ArrayListTest
{
	public static void main(String[] args) 
	{
		ArrayList al = new ArrayList();
		al.add(new Person("zhangsan",12));
		al.add(new Person("lisi",13));
		al.add(new Person("wangwu",12));
		al.add(new Person("xiaomei",14));
		al.add(new Person("lisi",13));
		al = singleElements(al);
		for (Iterator it = al.iterator(); it.hasNext(); )
		{
			Person p = (Person)it.next(); //向下转型
			sop(p.getName()+"~~"+p.getAge());
		}
		
	}
	//去除重复方法
	public static ArrayList singleElements(ArrayList al)
	{
		ArrayList newal = new ArrayList();
		for (Iterator it = al.iterator(); it.hasNext(); )
		{
			Person p = (Person)it.next();
			if (!newal.contains(p))
			  	newal.add(p);
		}
		return newal;
	}


	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

* LinkList
底层使用的链表数据结构,所有增删速度很快,但查询稍慢。在实际开发中如果项目中涉及到比较多对数据的增删等操作时,我们可以优先考虑使用LinkList。
LinkedList特有方法:
1.增加元素:
addFirst();
addLast();
2.
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
getFirst();
getLast();
3.删除元素
removeFirst();
removeLast();
注意:在JDK1.6出现了替代方法:
offerFirst();
offerLast();
peekFirst();
peekLast();
pollFirst();
pollLast();
使用LinkedList模拟一个堆栈或者队列数据结构。
import java.util.*;
class DuiLie
{
	private LinkedList link;

	DuiLie()
	{
		link = new LinkedList();
	}
	
	public void myAdd(Object obj)
	{
		link.addFirst(obj);
	}
	public Object myGet()
	{
		return link.removeFirst();
	}
	public boolean isNull()
	{
		return link.isEmpty();
	}

}
class  LinkedListTest
{
	public static void main(String[] args) 
	{
		DuiLie dl = new DuiLie();
		dl.myAdd("java01");
		dl.myAdd("java02");
		dl.myAdd("java03");
		dl.myAdd("java04");

		while(!dl.isNull())
		{
			System.out.println(dl.myGet());
		}
	}
}

--------------  android培训 java培训 、期待与您交流! ---------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值