为什么会出现集合类:
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
集合只用于存储对象,集合的长度可变的,集合可以存储不同类型的对象,数组虽然也可以存储对象,但是长度固定。数组中可以存储基本数据类型,集合只能存储对象。
集合只用于存储对象,集合的长度可变的,集合可以存储不同类型的对象,数组虽然也可以存储对象,但是长度固定。数组中可以存储基本数据类型,集合只能存储对象。
List和set集合的构成和分类:
Collection
|--List:元素是有序的,元素可以重复,因为该集合体系有索引
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢,线程不同步
|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。
|--Set:元素是无序的,元素不可以重复。
List:
特有的方法。凡是可以操作角标的方法都是该体系特有的方法。
(List集合判断元素是否相同,依据是元素的equals方法)
增:
add(index,element);
addAll(index,Collection);
删:
remove(index);
改:
set(index,element);
查:
举例:ArrayList类的使用get(index);int indexOf(obj);获取指定元素的位置subList(from,to);
listIterator();
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class ListDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
listIter();
}
public static void sop(Object obj){
System.out.println(obj);
}
public static void listIter(){
//演示listIterator()方法
ArrayList<String> al=new ArrayList<String>();
//添加元素
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
al.add("java05");
//在迭代过程中,准备添加或删除元素。这回出现异常
/*Iterator<String> it=al.iterator();
sop(al);
while(it.hasNext())
{
String str=it.next();
if(str.equals("java02"))
// al.add("java008");//这样会产生并发访问,不能在迭代中执行AyyayList增删方法
it.remove();
}
sop(al);*/
/*List集合特有的迭代器。ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。
所以,在迭代时,只能用迭代器的方法操作元素,可以Iterator方法是有限的,
如果想要其他的操作如添加,修改等就需要使用其子接口,ListIterator
该接口只能通过List集合的ListIterator方法获取*/
ListIterator<String> li=al.listIterator();
while(li.hasNext())
{
String str=li.next();
if(str.equals("java02"))
// li.add("0009");
li.set("java008");
}
//是否有下一个元素
sop("hasNext():"+li.hasNext());
//是否有前一个元素,这可以用于查找其前一个元素
sop("hasPrevious:"+li.hasPrevious());
//这个较少用
while(li.hasPrevious()){
sop("privious:"+li.previous());
}
sop(al);
}
//此方法演示ArrayList的常用方法
public static void method(){
ArrayList<String> al=new ArrayList<String>();
//添加元素
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
al.add("java05");
sop("元集合:"+al);
sop("-------------------------------------------");
//在指定位置添加元素
al.add(1,"java09");
//删除指定位置上的元素
al.remove(2);
//修改元素
al.set(2, "java007");
sop("-------------------------------------------");
//通过角标获取元素
sop("get(1):"+al.get(1));
sop("-------------------------------------------");
sop(al);
sop("-------------------------------------------");
//获取所有元素
for(int x=0;x<al.size();x++)
{
System.out.println("al("+x+")="+al.get(x));
}
sop("-------------------------------------------");
//用迭代的方法遍历
Iterator<String> it=al.iterator();
while(it.hasNext())
{
sop("next:"+it.next());
}
sop("-------------------------------------------");
//通过indexOf获取对象的位置
sop("index="+al.indexOf("java03"));
List<String> sub=al.subList(1, 3);
sop("sub="+sub);
}
}
Vector的枚举方法
import java.util.Enumeration;
import java.util.Vector;
public class VectorDemo {
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");
v.add("java05");
/*枚举就是Vector的特有方法。
发现枚举和迭代器很像。
其实枚举和迭代器是一样的。
因为枚举的名称以及方法的名称过长。
所以枚举被迭代器取代了。
*/
Enumeration en=v.elements();
while(en.hasMoreElements())
{
System.out.println(en.nextElement());
}
}
}
LinkedList类方法演示:
import java.util.LinkedList;
/*LinkedList:特有方法:
addFist();
addLast();
getFirst();
getLast();
获取元素,但不删除元素.如果集合中没有元素,会出现NoSuchElementException
removeFirst();
removeLast();
获取元素,但元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法
offerFirst();
offerLast();
peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素,返回null
pollFirst();
pollLast();
获取元素,但元素被删除。如果集合中没有元素,返回null.
*/
public class LinkedListDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList link=new LinkedList();
link.addFirst("java01");
link.addFirst("java02");
link.addFirst("java03");
link.addFirst("java04");
link.addFirst("java05");
link.addFirst("java06");
link.addFirst("java07");
// sop(link);
//获取第一个和最后一个
sop(link.getFirst());
sop(link.getLast());
sop("--------------------");
//删除第一个
sop(link.removeFirst());
sop("--------------------");
sop("size:"+link.size());
sop("--------------------");
//不用迭代器,也可以遍历其元素
while(!link.isEmpty())
{
sop(link.removeLast());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
ArrayList去除集合中包含的相同元素
<pre name="code" class="java">import java.util.ArrayList;
import java.util.Iterator;
//List集合判断元素是否相同,依据是元素的equals方法
public class ArrayListDemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Person> al=new ArrayList<Person>();
al.add(new Person("lisi01",31));
al.add(new Person("lisi01",31));
al.add(new Person("lisi02",32));
al.add(new Person("lisi03",33));
al.add(new Person("lisi03",33));
Iterator<Person> it=al.iterator();
while(it.hasNext())
{
Person p=it.next();
System.out.println(p.getName()+"..."+p.getAge());
}
al=singleElement(al);
System.out.println("-----------------------");
Iterator<Person> it1=al.iterator();
while(it1.hasNext())
{
Person p=it1.next();
System.out.println(p.getName()+"..."+p.getAge());
}
}
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))//contains方法调用元素的equals方法,看是否是相同元素
{
newAl.add(obj);
}
}
return newAl;
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if(!(obj instanceof Person))
return false;
Person p=(Person)obj;
return this.name.equals(p.getName())&&this.age==p.getAge();
}
}
接下篇