集合框架(三)——Collection 子集 ——————List 及其 小弟们!

【List子接口中的特有方法:】这些方法都是必须得会的。必须是不加思索

【特点】——对元素有索引标识,所以它的特有方法都是围绕索引展开的。

1.       添加:——会改变集合的长度。

void add (intindex , E element)插入任意位置。

boolean add(E o) 向列表的尾部追加指定的元素

 

boolean addAll(Collection<? extends E> c)

追加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序

2. 删除:

Object remove(intindex); (获取并删除)——会改变集合的长度。

3. 获取:

 

Object get(int index);  获取元素:

int indexOf(object); 获取元素索引:

intlastIndexOf(object); 获取元素索引:

List subList(fromIndex, toIndex); 获取子列表:

获取列表中的一部分,包含fromIndex位置,不包含toIndex位置。

4. 修改。

Object set(index ,element):替换指定位置的元素,并返回被替代的元素。

【List接口是可以对元素进行增删改查的操作的。注意:只有这个集合具备增删改查。

具备原因:因为有索引。】

【增加,删除】——会改变集合的长度。

——————————————————————————————————————————————————————————————————————

【ListIterator 的应用】

           当对集合进行迭代时,在迭代的过程中,如果用集合对象对元素进行了修改,

而迭代器是不知道的,所以在迭代的过程中就会发生不确定性。

可能会抛出ConcurrentModificationException: 并发修改异常。

为了避免这种情况的发生,在迭代时,不要使用集合对象对迭代中的元素进行操作。

 

但是:还想在迭代过程中对被迭代的元素进行更多的操作。该怎么办呢?

如何解决这个问题——list接口中提供了一个特有的迭代器。

这个迭代器就是ListIterator列表迭代器。可以再迭代过程中 实现:增删改查;

而且这个迭代器只能在list集合中使用

——————————————————————————————————————————————————————————————————————————

常见子类对象:具体的子类对象,学习该对象的特有数据结构,以及相关特点。

List接口的三个常用小弟:

Vector—— 底层是数组结构。可变长度数组,是同步的。

         【可变数组原理】:一旦数组长度不够,会创建新数组,长度为原来的一倍,将原数组的元素复制到新数组中,并将新元素添加到新数组中。     

ArrayList—— 底层也是数组结构,也是支持长度可变数组的。是不同步的,不用进行很多次判断锁!替代了Vector。

查询效率很高。但是增删的效率很低。

LinkedList——底层是连接列表结构。简称链表结构。是不同步的。

       这种结构的好处:对元素的增删效率非常高。查询效率低。
—————————————————————————————————————————————————————————————————————————————

【对应代码演示】

【Vector 演示】

Vector v = new Vector();
枚举接口也是用来取出集合中的元素,但是枚举接口只能取出Vector集合中的元素。
枚举最后被迭代器取代!
package day0915;

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.addElement("abc1");
		v.addElement("abc2");
		v.addElement("abc3");
		v.addElement("abc4");
		
		//枚举接口也是用来去除集合中的元素,但是枚举接口只能取出
		//Vector集合中的对象
		Enumeration en = v.elements();
		while(en.hasMoreElements()){
			System.out.println(en.nextElement());
		}
	}
}


【代码演示——面试题   ——用LinkedList模拟一个堆栈或者队列数据结构。】

package day0915;
/**
 * 需求:用LinkedList模拟一个堆栈或者队列的数据结构
 * @author Administrator
 */

public class LinkedListTest {

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Myqueue my = new Myqueue();
		my.myAdd("abc1");
		my.myAdd("abc2");
		my.myAdd("abc3");
		my.myAdd("abc4");
		
		while(!my.isNull()){
			System.out.println(my.myGet());
		}
	}
}

package day0915;

import java.util.LinkedList;

public class Myqueue {
	private LinkedList list = null;
	public Myqueue(){
		list = new LinkedList();
	}
	/*
	 * 往链表中添加元素
	 */
	public void myAdd(Object obj){
		list.addLast(obj);
	}
	
	/*
	 * 从链表中删除元素
	 */
	public Object myGet(){
		return list.removeFirst();
	}
	/**
	 * 判断是否为空
	 */
	public boolean  isNull(){
		return list.isEmpty();
	}
}


【ArryList 代码演示】

package day0915;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 需求:定义一个功能,取出ArrayList 中大的重复元素
 * 思路:
 * 1. 定义一个集合,用于存储唯一性的元素
 * 2. 迭代已有的集合,将每一个迭代到的元素都与新集合中判断是否包含。
 * 如果包含就不存储,如果不包含就存储到新集合中。
 * 3. 迭代结束,新集合中存储的都是不重复的元素。
 * @author Administrator
 *
 */
public class ArrayListDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList a1 = new ArrayList();
		a1.add("abc1");
		a1.add("abc2");
		a1.add("abc1");
		a1.add("abc2");
		a1.add("abc3");
		
		System.out.println(a1);
		a1 = getSingleElements(a1);
		System.out.println(a1);
				
	}

	public static ArrayList getSingleElements(ArrayList a1) {
		// TODO Auto-generated method stub
		ArrayList temp = new ArrayList();
		Iterator it = a1.iterator();
		while(it.hasNext()){
			Object obj = it.next();//这块儿为什么这样写,如果不这样写的后果就是异常,因为it.next() 始终在往后推移!
			if(!temp.contains(obj)){ 
				temp.add(obj);
			}
		}
		return temp;
	}


}

注意:ArrayList判断元素是否相同使用的equals方法。

比如contains 中就是依赖于equals方法。

或者remove方法都是依赖于equals方法。

尤其是存储自定义对象时,该对象一定要覆盖equals方法,建立根据对象自身特点的判断相同的依据。

equals就是用于比较对象的内容的。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值