java集合——List

集合——List

List接口

特点:有序且可重复(因为List接口中添加了许多针对下标操作的方法)

实现类:

  1. ArrayList
  2. LinkedList
  3. Vector
  4. Stack

1.ArrayList

1.1使用ArrayList方法+泛型

泛型:数据安全的作法,规定集合应该存储什么样的数据类型

1.1.1 代码实现:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Test01 {
	public static void main(String[] args) {
		
		ArrayList<String> list = new ArrayList<String>();
		
		list.add("小明");
		list.add("小白");
		list.add("小黑");
		list.add("小红");
		list.add("小强");
		
		int size = list.size();
		System.out.println("集合大小"+size);
		
		//设置指定下标
		list.set(2, "小刚");
		
		String element1 = list.get(0);
		System.out.println("获取指定下标0上的元素:"+element1);
		
		ArrayList<String> newList1 = new ArrayList<>();
		Collections.addAll(newList1, "aaa","bbb","ccc");//利用集合工具类进行批量添加
		list.addAll(newList1);//将新集合中所有的元素添加到指定集合的末尾
		
		ArrayList<String> newList2 = new ArrayList<>();
		Collections.addAll(newList2, "ddd","eee","fff");//利用集合工具类进行批量添加
		list.addAll(3, newList2);//将新集合中所有的元素添加到指定集合上指定下标的位置
		
		ArrayList<Object> newList3 = new ArrayList<>();
		Collections.addAll(newList3, "eee","ddd","fff","ggg");
		System.out.println("判断集合中是否包含某个集合中的所有元素:"+list.containsAll(newList3));
		
		//删除 - 去除交集
		
		ArrayList<String> newList4 = new ArrayList<String>();
		Collections.addAll(newList4,"fff","aaa","bbb","xxx");
		list.removeAll(newList4);
		
		//保留交集 
		ArrayList<String> newList5 = new ArrayList<String>();
		Collections.addAll(newList5, "小明","小黑","小刚","小强");
		list.retainAll(newList5);
		
		//获取开始下标(包含)到结束下标(不包含)的元素,返回新的集合	
		List<String> subList = list.subList(1, 3);
				
		//将集合转换为数组
		Object[] array = subList.toArray();
		System.out.println(Arrays.toString(array));
				
		System.out.println("-----------------");
		
		//for遍历
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		System.out.println("-----------------");
		
		//foreach遍历
		for (String element : list) {
			System.out.println(element);
		}
		
		System.out.println("-----------------");
		
		//Iterator迭代
		Iterator< String> iterator = list.iterator();
		while (iterator.hasNext()) {
			String e = iterator.next();
			System.out.println(e);
		}
		
		System.out.println("-----------------");
		
		//ListIterater迭代
		ListIterator< String> listIterator = list.listIterator();
		while (listIterator.hasNext()) {
			String e = listIterator.next();
			System.out.println(e);
		}
	}
}
1.1.2 泛型
含义:

数据安全的作用

代码实现:
package com.dream.generic;

public class A {

}

package com.dream.generic;

public class B extends A {

}

package com.dream.generic;

public class MyArrayList<E> {

	public boolean add(E e){
		return true;
	}
}

package com.dream.generic;

public class Test01 {
	
	public static void main(String[] args) {
		
		MyArrayList<String> list1 = new MyArrayList<>();
		list1.add("abc");
		
		MyArrayList<Integer> list2 = new MyArrayList<>();
		list2.add(123);
	}
}
1.1.3 泛型限定
代码实现:
package com.dream.generic;

public class A {

}

package com.dream.generic;

public class B extends A {

}

package com.dream.generic;

public class MyArrayList<E> {

	public boolean add(E e){
		return true;
	}
}

package com.dream.generic;

import java.util.ArrayList;

public class Test02 {
	
	public static void main(String[] args) {
	
	}
	
	//?:任何类型
	public ArrayList<?> method01(){
		ArrayList<String> list = new ArrayList<>();
		return list;
	}
	
	//? extends A
	//?:表示A的子类或者A类
	public ArrayList<? extends A> method02(){
//		ArrayList<B> list = new ArrayList<>();
		ArrayList<A> list = new ArrayList<>();
		return list;
	}
	
	//? super A
	//?:表示A的父类或A类
	public ArrayList<? super A> method03(){
//		ArrayList<Object> list = new ArrayList<>();
		ArrayList<A> list = new ArrayList<>();
		return list;
	}

}

2.迭代器

2.1 foreach底层原理

注意:

foreach底层由迭代器实现

代码实现:
package com.study.iterater;

import java.util.ArrayList;
import java.util.ListIterator;

public class Test01 {
	public static void main(String[] args) {
		
		//foreach 底层由迭代器实现
		
		ArrayList<String> list = new ArrayList<String>();
		
		list.add("小明1");
		list.add("小明2");
		list.add("小明3");
		list.add("小明4");
		list.add("小明5");
		
		for (String e : list) {
			System.out.println(e);
		}
		
		//底层实现
//		String e;
//		for(Iterator<String> it = list.iterator();it.hasNext();System.out.println(e)){
//			e = it.next();
//		}
	}
}

2.2 Iterator迭代器

需求:
package com.study.iterater;

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

public class Test02 {

	public static void main(String[] args) {
		
ArrayList<String> list = new ArrayList<String>();
		
		list.add("小明1");
		list.add("小明2");
		list.add("小明3");
		list.add("小明4");
		list.add("小明5");
		
		Iterator<String> iterator = list.iterator();
		//遍历到“小明2”删除元素
		while(iterator.hasNext()) {
			
			String element1 = iterator.next();
			if(element1.equals("小明2")) {
				//list.remove(element1);
				/**
				 * java.util.ConcurrentModificationException
				 原因: ArrayList继承自AbstractList的
				 操作数ModCount会每次执行remove等方法后自增;同时,Iterator迭代器是
				 ArrayList内部中的一个接口,它有一个内部实现类Itr,初始expectedModCount = modCount
				 因此,list.remove(element1)执行过后,ModCount+1,expectedModCount不变
				 两者不相等,经判断后报异常
				 为什么要这样设计?
				 遍历是浏览数据,删除是改变数据,在浏览数据时不能删除数据,保证数据的一致性不会有脏数据的出现
				 */
				iterator.remove();
				/**
				 * iterator.remove()可以删除成功的原因是:
				 * 利用外部类对象调用remove方法(调用的ArrayList的remove方法)
                	ArrayList.this.remove(lastRet);
                	cursor游标初始为0,自增往下 lastRet 迭代元素下标,即先判断cursor对应拥有元素
                	lastRet才自增
                	cursor = lastRet;
                	lastRet = -1;
                    保证操作数和内部操作数一致
                	expectedModCount = modCount;
				 */
			
			}
		}
		for (String element : list) {
			System.out.println(element);
		}
    }
}
运行结果:
小明1
小明3
小明4
小明5

2.3 ListIterator迭代器

ListIterator迭代器区别于Iterator 它可以使用add()等方法

代码实现:
package com.study.iterater;

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

public class Test02 {

	public static void main(String[] args) {
		
ArrayList<String> list = new ArrayList<String>();
		
		list.add("小明1");
		list.add("小明2");
		list.add("小明3");
		list.add("小明4");
		list.add("小明5");
		
		ListIterator<String> listIterator = list.listIterator();
		//ListIterator指定遍历到位置添加元素
		while(listIterator.hasNext()) {
			String element2 = listIterator.next();
			if(element2.equals("小明3")){
				listIterator.add("小白");
			}
		}
		for (String element2 : list) {
			System.out.println(element2);
		}
		System.out.println("---------------");
		
		//使用ListIterator 倒叙
		ListIterator<String> listIterator2 = list.listIterator(list.size());
		while(listIterator2.hasPrevious()) {
			
			String element3 = listIterator2.previous();
			System.out.println(element3);
		}
        //指定替换元素
		ListIterator<String> listIterator3 = list.listIterator();
		while(listIterator3.hasNext()) {
			String element4 = listIterator3.next();
			if(element4.equals("小白")) {
				listIterator3.set("小黑");
			}
		}
		for (String element : list) {
			System.out.println(element);
		}
        //指定下标开始遍历
        ListIterator<String> listIterator4 = list.listIterator(1);
		while(listIterator4.hasNext()){
			String element = listIterator4.next();
			System.out.println(element);
		}
	}
}
运行结果:
小明1
小明3
小白
小明4
小明5
---------------
小明5
小明4
小白
小明3
小明1
---------------
小明1
小明3
小黑
小明4
小明5
---------------
小明3
小黑
小明4
小明5

3.LinkedList

LinkedList与ArrayList使用方法基本一致(插入,删除等)

3.1 LinkedList 队列模式

代码实现:
package com.study.linkedlist;

import java.util.LinkedList;

public class Test01 {
	public static void main(String[] args) {
		
		LinkedList<String > list = new LinkedList<String>();
		
		list.add("小明1");
		list.add("小明2");
		list.add("小明3");
		list.add("小明4");
		list.add("小明5");
		
		while(!list.isEmpty()) {
			
			//队列模式,先进先出
			// 删除第一个元素,并返回
			String element1 = list.removeFirst();
			System.out.println(element1);
			//小明1 小明2 小明3 小明4 小明5
			
		}
    }
}

3.2 LinkedList栈模式

代码实现:
package com.study.linkedlist;

import java.util.LinkedList;

public class Test01 {
	public static void main(String[] args) {
		
		LinkedList<String > list = new LinkedList<String>();
		
		list.add("小明1");
		list.add("小明2");
		list.add("小明3");
		list.add("小明4");
		list.add("小明5");
		
		while(!list.isEmpty()) {
			
			//栈模式,先进先出
			//删除最后一个元素,并返回
			String element2 = list.removeLast();
			System.out.println(element2);
			//小明5 小明4 小明3 小明2 小明1
			
		}
	}
}

4.Vector

Vector实现List接口,可以使用List中的方法(插入,删除等)

4.1 了解Vector中的老方法

package com.dream.vector_class;

import java.util.Enumeration;
import java.util.Vector;

public class Test02 {
	
	public static void main(String[] args) {
	
		Vector<String> v = new Vector<>();
		
		//添加元素
		v.addElement("小白1");
		v.addElement("小白2");
		v.addElement("小白3");
		v.addElement("小白4");
		v.addElement("小白5");
		v.addElement("小白6");
		
		//删除
		v.removeElement("小白2");//依据元素删除元素
		v.removeElementAt(2);//依据下标山存储元素
		
		//遍历
		Enumeration<String> elements = v.elements();
		while(elements.hasMoreElements()){
			String nextElement = elements.nextElement();
			System.out.println(nextElement);
		}	
	}
}

5.Stack

特点:

栈模式 - 先进后出

代码实现:

package com.dream.stack_class;

import java.util.Stack;

public class Test01 {
	
	public static void main(String[] args) {

		Stack<String> stack = new Stack<>();
		
		//添加元素 - 将元素压入栈顶
		v.addElement("小白1");
		v.addElement("小白2");
		v.addElement("小白3");
		v.addElement("小白4");
		v.addElement("小白5");
		v.addElement("小白6");
		
		System.out.println("距离栈顶的位置(从1开始):" + stack.search("小白2"));
		
		while(!stack.empty()){
			//获取栈顶第一个元素,并返回
			//String element = stack.peek();
			
			//删除栈顶第一个元素,并返回
			String element = stack.pop();
			System.out.println(element);
		}
		
		System.out.println(stack.size());
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值