Java中Collection子接口(1)——List接口(传智播客毕老师视频讲解)

1、List特有方法:凡是可以操作角标的方法都是该体系特有方法

add(index,element);

addAll(index,Collection);

remove(index);

set(index,element);

get(index);

subList(from,to);

listIterator();

各个基本操作代码如下:

import java.util.ArrayList;
import java.util.Collection;
public class ListDemo 
{
	public static void sop(Object Obj)
	{
		System.out.println(Obj);
	}
	public static void main(String[] args) 
	{
		ArrayList L=new ArrayList();
		L.add(1);
		L.add("asd");
		L.add(false);
		L.add(100);  //增(<span style="color:#ff0000;">其实add(100)这步应称为自动装箱,因为集合类型中存放的是对象的应用,100是数值,不是对象,所以自动装箱为Integer对象</span>)
		sop(L);          //增加到表尾
		L.add(0,true);   //增
		sop(L);          //按角标增加
		sop(L.remove(4));//删:返回被删元素
		sop(L);          //删除了对应元素
		sop(L.set(2,50));//改:返回被替代元素
		sop(L);          //按角标改成对应元素
		sop(L.get(3)); 	 //查:返回去的元素
		sop(L);          //没有删除对应元素  
	}
}
运行结果如下:


可见,在一个ArrayList对象中,可以存放多种数据,有数值型,布尔型,字符串型,等等!
2、List中特有的迭代器listIterator()

2.1、普通的迭代器iterator()

(1)代码段1(普通的)

Iterator it=L.iterator();
while(it.hasNext())
{
	System.out.println("......"+it.next());
}

(2)代码段2(里面有两个next())

Iterator it=L.iterator();
while(it.hasNext())
{
<span style="white-space:pre">	</span>Object O=it.next();
	System.out.println("......"+it.next());
	System.out.println("Object"+"......"+O);
}

当ArrayList实例L中存有四个元素时


可以看出每次next在取完元素后,自动往后移动一位!

当ArrayList实例L中存有五个元素时


发现报错了,因为五个元素的话,则在第一个next取出第五个元素后,第二个next已经指向空了,因此会报错,所以next与hasNext应成对匹配!

(3)代码段3(在迭代器中进行增删改查操作)

Iterator it=L.iterator();
while(it.hasNext())
{
	Object O=it.next();
	if(O.equals((50)))
		L.remove(O);
	sop(L);
	System.out.println("......"+O);
	//System.out.println("Object"+"......"+O);
}

可以发现报错了,因为在对集合元素操作,有两种方式,一种为迭代器,一种为对对象的普通操作。在使用一般迭代器这种方法时,每次next的同时,又进行对对象操作的方式如:增加元素等操作,会造成它指向混乱的,因此其不允许在迭代过程中再对集合对象进行操作,而iterator所具有的方法只有三种,满足不了需要,针对此,Java为List集合实现了iterator的子接口listIterator!


2.2、List集合中特有的迭代器listIterator

具备了增删改查的功能,其方法定义如下:


代码如下:

ListIterator it=L.listIterator();
while(it.hasNext())
{
	Object O=it.next();
	if(O.equals((50)))
	{
		it.remove();	//删除元素
	}	
	it.add(50);             //增加元素
	sop(L);
	System.out.println("......"+O);
}

其中L的原数据为:[true, 1, 50, false, 123],结果迭代器中remove与add的操作后,结果如下:


这段程序的结果可以好好分析下,蛮有意思的,了解next、remove、add操作后的其迭代器”指针“的具体变化情况!


3、List中3个常见的子类对象:

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

ArrayList:是可变长度数组,初始化时容量为10,当存储元素超过10个时,从新new一个新的数组,并延长50%,即容量为15;

Vector:是固定长度数组,初始化时容量为10,当存储元素超过10个时,从新new一个新的数组,并延长100%,即容量为20;

3.1、Vecor

凡是Vector中带有Element的方法都是Vextor的特有方法,如addElement,elementAt……

重点:elements()方法


调用代码如下:

Vector v=new Vector();
v.add(123);
v.add(false);
v.addElement("djfkl");
Enumeration t=v.elements();
while(t.hasMoreElements())
	sop(t.nextElement());

可见,这种取出方式类似于迭代器,称之为 枚举,其实枚举和迭代是一样的,枚举是Vextor特有的取出方式,因为枚举的名称和方法名称都过长,因此被迭代器取代了,但是在之后IO流中还会遇到,故提前说一声!

3.2、LinkedList

addFirst();
addLast();

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

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

在JDK1.6出现了替代方法。

offerFirst();
offerLast();

peekFirst();
peekLast();

获取元素,但不删除元素。如果集合中没有元素,会返回null。

pollFirst();

pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。

练习1,用LinkedList实现队列或者堆栈功能,

代码如下;

import java.util.LinkedList;

public class LinkedListTest 
{
	private LinkedList link;
	LinkedListTest()
	{
		link=new LinkedList();
	}
	public void myAdd(Object Obj)
	{
		link.offerLast(Obj);
	}
	public Object myGet()
	{
		return link.pollFirst();
	}
	public boolean isNull()
	{
		return link.isEmpty();
	}
}
public class LinkedListDemo 
{
	public static void main(String[] args) 
	{
		LinkedListTest L=new LinkedListTest();
		L.myAdd("myDuilie01");
		L.myAdd("myDuilie02");
		L.myAdd("myDuilie03");
		L.myAdd("myDuilie04");
		sop(L.myGet());
		sop(L.myGet());
		sop(L.myGet());
		sop(L.myGet());
		sop(L.myGet());

	}
	public static void sop(Object Obj)
	{
		System.out.println("..."+Obj);
	}
}

编写的是队列的程序,由结果可以看出其实先见先出,满足要求!


练习2,将ArrayList中的重复元素删除

import java.util.*;
public class ArrayListDemo 
{
	public static void main(String[] arg)
	{
		ArrayList L=new ArrayList();
		L.add("MyList01");
		L.add("MyList02");
		L.add("MyList03");
		L.add("MyList04");
		L.add("MyList04");
		L.add("MyList03");
		L.add("MyList01");
		show(L);
		ArrayList newL=singleElement(L);
		show(newL);
	}
	public static ArrayList singleElement(ArrayList L)
	{
		ArrayList newL=new ArrayList();
		Iterator it=L.iterator();
		while(it.hasNext())
		{
			Object obj=it.next();
			if(!newL.contains(obj))
				newL.add(obj);
		}
		return newL;
	}
	public static void show(Object obj)
	{
		System.out.println(obj);
	}
}

结果如下:



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值