3_List和Set集合(上)

本文详细介绍了Java集合类的基本概念,包括List和Set的区别,ArrayList、LinkedList、Vector的特点及使用场景,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


为什么会出现集合类:
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
集合只用于存储对象,集合的长度可变的,集合可以存储不同类型的对象,数组虽然也可以存储对象,但是长度固定。数组中可以存储基本数据类型,集合只能存储对象。

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

List:
特有的方法。凡是可以操作角标的方法都是该体系特有的方法。
(List集合判断元素是否相同,依据是元素的equals方法)
增:
add(index,element);
addAll(index,Collection);
删:
remove(index);
改:
set(index,element);
查:
get(index);
subList(from,to);
int indexOf(obj);获取指定元素的位置
listIterator();
举例:ArrayList类的使用
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();
	}
	
}


接下篇




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值