java毕向东听课笔记23(集合框架-List集合具体对象)

Collection

|-List:元素是有序的,元素可以重复,因为该集合体系有索引

        |-ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删稍慢

        |-LinkedList:底层使用的是链表数据结构。特点:增删的速度很快,查询稍慢

        |-Vector:底层是数组数据结构。功能和ArrayList一模一样,比ArrayList早出。但是和ArrayList有区别:Vector是线程同步,ArrayLis线程t不同步(所以ArrayList更快)

-----------------------------------------------------

演示Vector的特点:

import java.util.*;
/*
枚举就是Vector特有的取出方式
发现枚举和迭代器很相似

其实枚举和迭代是一样的,因为枚举的名称以及方法的名称都过长,所以被迭代器取代了
*/
class VectorDemo{
	public static void main(String[] args){
		Vector v = new Vector();
		
		v.add("java1");
		v.add("java2");
		v.add("java3");
		v.add("java4");
		//elements方法
		Enumeration en = v.elements();
		while(en.hasMoreElements())
			System.out.println(en.nextElement());
	}
}


---------------------------------------------------------------------------

LinkedList:

                    特有方法:

import java.util.*;
/*
LinkedList特有方法:
addFirst();
addLast();

getFirst();获取元素,元素不被删除。如果集合中没有元素,会抛出异常(NoSuchElementException)
getLast();

removeFirst();
removeLast();获取元素,但是元素被删除。如果集合中没有元素,会抛出异常(NoSuchElementException)

在JDK1.6出现了替代方法

offerFirst();
offerLast();

peekFirst();获取元素,元素不被删除。如果集合中没有元素,会返回null
peekLast();

pollFirst();获取元素,元素被删除。如果集合中没有元素,会返回null
pollLast()
*/
class LinkedListDemo{
	public static void main(String[] args){
		LinkedList link = new LinkedList();
		
		link.addFirst("java1");
		link.addFirst("java2");
		link.addFirst("java3");
		link.addFirst("java4");
		
		sop(link);//打印结果为[java4,java3,java2,java1]
	}
	
	public static void sop(Object obj){
		System.out.println(obj);
	}
}

-----------------------------------------------------

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("java1");
		al.add("java2");
		al.add("java1");
		al.add("java2");
		al.add("java1");
		al.add("java3");
		
		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;
	}
}


--------------------------------------------------

ArrayList练习2(升级):

                                         将自定义对象作为元素存放到ArrayList集合中,并去除重复元素

值得注意的第一点是关于向下转型:Object类转化为示例中的Person类;第二点是用ArrayListTest1中的去除相同元素的方法在这一题中并不适用

import java.util.*;

class ArrayListTest2{
	public static void sop(Object obj){
		System.out.println(obj);
	}
	
	public static void main(String[] args){
		ArrayList al = new ArrayList();
		al.add(new Person("lisi01",30));//al.add(Object obj);//Object obj = new Person("lisi01",30);
		al.add(new Person("lisi02",32));
		al.add(new Person("lisi02",32));
		al.add(new Person("lisi03",33));
		al.add(new Person("lisi04",35));
		al.add(new Person("lisi04",35));
		
		al = singleElement(al);
		
		Iterator it = al.iterator();
		
		while(it.hasNext()){
			
			Object obj = it.next();
			Person p = (Person)obj;//简化成Person p =(Person)it.next();
			sop(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))
				newAl.add(obj);
		}
		return newAl;
	}
	
}
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;
	}
}


这是应为ArrayList不知道你判断对象是否相同的标准,它自己是根据equals方法判断,所以要重写equals

import java.util.*;

class ArrayListTest2{
	public static void sop(Object obj){
		System.out.println(obj);
	}
	
	public static void main(String[] args){
		ArrayList al = new ArrayList();
		al.add(new Person("lisi01",30));//al.add(Object obj);//Object obj = new Person("lisi01",30);
		al.add(new Person("lisi02",32));
		al.add(new Person("lisi02",32));
		al.add(new Person("lisi03",33));
		al.add(new Person("lisi04",35));
		al.add(new Person("lisi04",35));
		
		al = singleElement(al);
		
		Iterator it = al.iterator();
		
		while(it.hasNext()){
			
			Object obj = it.next();
			Person p = (Person)obj;//简化成Person p =(Person)it.next();
			sop(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))
				newAl.add(obj);
		}
		return newAl;
	}
	
}
class Person{
	private String name;
	private int age;
	Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	//重写equals方法
	public boolean equals(Object obj){
		
		if(!(obj instanceof Person))
			return false;
		Person p =(Person)obj;
		
		return this.name.equals(p.name)&&this.age == p.age;//这里的equals是字符串中的equals
	}
	public String getName(){
		return name;
	}
	public int getAge(){
		return age;
	}
}


解决了。疑问:singleElement方法中并没有调用equals方法啊?其实equals方法是在底层自动被调用的,可以理解为在调用contains方法的时候调用看equals方法

结论:List集合判断元素是否相同,依据 的是元素的equals方法。其实remove方法底层调用的也是equals方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值