Java学习基础部分【十六】List集合

时间:2019-02-19
本文章向大家介绍Java学习基础部分【十六】List集合,主要包括Java学习基础部分【十六】List集合使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

目录

 

一.去除ArrayList中重复字符串元素方式

1.案例演示

二.去除ArrayList中重复自定义对象元素

1.案例演示

2.注意事项

三.LinkedList

1.LinkedList的特有功能

2.案例演示

四.栈和队列数据结构

五.用LinkedList模拟栈数据结构的集合并测试

1.案例演示

六.泛型概述和基本使用

1.泛型概述

 2.泛型好处

3.泛型基本使用

4.泛型使用注意事项

5.案例演示

七.ArrayList存储字符串和自定义对象并遍历泛型版

1.案例演示

八.泛型的由来

1.泛型的由来

2.案例演示

九.泛型类的概述及使用

1.泛型类概述

2.定义格式

3.注意事项

4.案例演示

十.泛型方法的概述和使用

1.泛型方法概述

2.定义格式

3.案例演示

十一.泛型接口的概述和使用

1.泛型接口概述

2.定义格式

3.案例演示

十二.泛型高级之通配符

1.泛型通配符

2.? extends E

3.? super E

4.案例演示

十三.增强for的概述和使用

1.增强for概述

2.格式

3.案例演示

4.好处

十四.ArrayList存储字符串和自定义对象并遍历增强for版

1.案例演示

十五.三种迭代的能否删除

十六.静态导入的使用

1.格式

2.注意事项

3.案例演示

十七.可变参数的概述和使用

1.可变参数概述

2.格式

3.注意事项

4.案例演示

十八.Arrays工具类的asList()方法的使用

1.案例演示

十九.集合嵌套之ArrayList嵌套ArrayList

1.案例演示


一.去除ArrayList中重复字符串元素方式

1.案例演示

  • 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
  • 思路:创建新集合方式
public static void main(String[] args) {
				ArrayList list = new ArrayList();
				list.add("a");
				list.add("a");
				list.add("b");
				list.add("b");
				list.add("b");
				list.add("c");
				list.add("c");
				list.add("c");
				list.add("c");
				
				System.out.println(list);
				ArrayList newList = getSingle(list);
				System.out.println(newList);
			}
	/*
	 * 创建新集合将重复元素去掉
	 * 1,明确返回值类型,返回ArrayList
	 * 2,明确参数列表ArrayList
	 * 
	 * 分析:
	 * 1,创建新集合
	 * 2,根据传入的集合(老集合)获取迭代器
	 * 3,遍历老集合
	 * 4,通过新集合判断是否包含老集合中的元素,如果包含就不添加,如果不包含就添加
	 */
			public static ArrayList getSingle(ArrayList list) {
				ArrayList newList = new ArrayList();			//创建一个新集合
				Iterator it = list.iterator();					//获取迭代器
				while(it.hasNext()) {							//判断老集合中是否有元素
					String temp = (String)it.next();			//将每一个元素临时记录住
					if(!newList.contains(temp)) {				//如果新集合中不包含该元素
						newList.add(temp);						//将该元素添加到新集合中
					}
				}
				return newList;									//将新集合返回
			}

二.去除ArrayList中重复自定义对象元素

1.案例演示

 需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)

public class Demo2_ArrayList {

	/**
	 * * A:案例演示
			* 需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)
		* B:注意事项
			* 重写equals()方法的
		contains方法判断是否包含,底层依赖的是equals方法
		remove方法判断是否删除,底层依赖的是equals方法
	 */
	public static void main(String[] args) {
		ArrayList list = new ArrayList();				//创建集合对象
		list.add(new Person("张三", 23));
		list.add(new Person("张三", 23));
		list.add(new Person("李四", 24));
		list.add(new Person("李四", 24));
		list.add(new Person("李四", 24));
		list.add(new Person("李四", 24));
		
		//ArrayList newList = getSingle(list);			//调用方法去除重复
		//System.out.println(newList);
		list.remove(new Person("张三", 23));
		System.out.println(list);
	}

	/*
	 * 创建新集合将重复元素去掉
	 * 1,明确返回值类型,返回ArrayList
	 * 2,明确参数列表ArrayList
	 * 
	 * 分析:
	 * 1,创建新集合
	 * 2,根据传入的集合(老集合)获取迭代器
	 * 3,遍历老集合
	 * 4,通过新集合判断是否包含老集合中的元素,如果包含就不添加,如果不包含就添加
	 */
	public static ArrayList getSingle(ArrayList list) {
		ArrayList newList = new ArrayList<>();					//1,创建新集合
		Iterator it = list.iterator();							//2,根据传入的集合(老集合)获取迭代器
		
		while(it.hasNext()) {									//3,遍历老集合
			Object obj = it.next();								//记录住每一个元素
			if(!newList.contains(obj)) {						//如果新集合中不包含老集合中的元素
				newList.add(obj);								//将该元素添加
			}
		}
		
		return newList;
	}
}

2.注意事项

重写equals()方法的

三.LinkedList

1.LinkedList的特有功能

  • public void addFirst(E e)及addLast(E e)
  •  public E getFirst()及getLast()
  •  public E removeFirst()及public E removeLast()
  • public E get(int index);

2.案例演示

public class Demo4_LinkedList {
	public static void main(String[] args) {	
		LinkedList list = new LinkedList();					//创建集合对象
		list.addLast("a");
		list.addLast("b");
		list.addLast("c");
		list.addLast("d");
		
		/*System.out.println(list.removeLast());

		System.out.println(list.removeLast());
		System.out.println(list.removeLast());
		System.out.println(list.removeLast());*/
		
		while(!list.isEmpty()) {
			System.out.println(list.removeLast());
		}
}

四.栈和队列数据结构

  •  栈

         先进后出 

  •  队列

         先进先出

五.用LinkedList模拟栈数据结构的集合并测试

1.案例演示

 需求:请用LinkedList模拟栈数据结构的集合,并测试

创建一个类将Linked中的方法封装

		public class Stack {
				private LinkedList list = new LinkedList();		//创建LinkedList对象
				
				public void in(Object obj) {
					list.addLast(obj);							//封装addLast()方法
				}
				
				public Object out() {
					return list.removeLast();					//封装removeLast()方法
				}
				
				public boolean isEmpty() {
					return list.isEmpty();						//封装isEmpty()方法
				}
			}
	
public class Demo4_LinkedList {
	public static void main(String[] args) {
		Stack s = new Stack();
		s.in("a");								//进栈
		s.in("b");
		s.in("c");
		s.in("d");
		
		while(!s.isEmpty()) {					//判断栈结构是否为空
			System.out.println(s.out());		//弹栈
		}
}

六.泛型概述和基本使用

1.泛型概述

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现?

答案是可以使用 Java 泛型

使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。

 2.泛型好处

  •     提高安全性(将运行期的错误转换到编译期) 
  •     省去强转的麻烦

3.泛型基本使用

  • <>中放的必须是引用数据类型 

4.泛型使用注意事项

  • 前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型) 

5.案例演示

public class Demo1_Generic {
	public static void main(String[] args) {
		//demo1();
		//int[] arr = new byte[5];					//数组要保证前后的数据类型一致
		//ArrayList<Object> list = new ArrayList<Person>();	//集合的泛型要保证前后的数据类型一致
		//ArrayList<Object> list = new ArrayList<>();		//1.7版本的新特性,菱形泛型
		ArrayList<Object> list = new ArrayList<>();			//泛型最好不要定义成Object,没有意义
		list.add("aaa");
		list.add(true);
	}

	public static void demo1() {
		ArrayList<Person> list = new ArrayList<Person>();
	//	list.add(110);
	//	list.add(true);
		list.add(new Person("张三", 23));
		list.add(new Person("李四", 24));
		
		Iterator<Person> it = list.iterator();
		while(it.hasNext()) {
			//System.out.println(it.next());
			
			//System.out.println(it.next().getName() + "..." + it.next().getAge());
            //next方法只能调用一次,如果调用多次会将指针向后移动多次
			Person p = it.next();			
			System.out.println(p.getName() + "..." + p.getAge());
		}
	}

}

七.ArrayList存储字符串和自定义对象并遍历泛型版

1.案例演示

ArrayList存储字符串并遍历泛型版

public class Demo2_Generic {
	public static void main(String[] args) {
		//demo1();
		ArrayList<Person> list = new ArrayList<>();
		list.add(new Person("张三", 23));
		list.add(new Person("李四", 24));
		list.add(new Person("王五", 25));
		list.add(new Person("赵六", 26));
		
		Iterator<Person> it = list.iterator();
		while(it.hasNext()) {
			Person p = it.next();							//将集合中的每一个元素用Person记录
			System.out.println(p.getName() + "..." + p.getAge());
		}
	}

	public static void demo1() {
		ArrayList<String> list = new ArrayList<>();			//创建集合对象
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		
		Iterator<String> it = list.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}

}

八.泛型的由来

1.泛型的由来

  • 通过Object转型问题引入
  • 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。

2.案例演示

public class Demo3_Generic {
	public static void main(String[] args) {
		//demo1();
		Tool<String> t = new Tool<>();
		//t.show("abc");
		t.show(true);
	}

	public static void demo1() {
		Tool<Student> t = new Tool<>();					//创建工具类对象
		t.setObj(new Student("张三",23));
		
		//Worker w = (Worker) t.getObj();			//向下转型
		//System.out.println(w);
	}

}

九.泛型类的概述及使用

1.泛型类概述

  • 把泛型定义在类上

2.定义格式

public class 类名<泛型类型1,…>

3.注意事项

  • 泛型类型必须是引用类型

4.案例演示

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

	}
}

interface Inter<T> {
	public void show(T t);
}

/*class Demo implements Inter<String> {		//推荐用这种

	@Override
	public void show(String t) {
		System.out.println(t);
	}
	
}*/

class Demo<T> implements Inter<T> {			//没有必要在实现接口的时候给自己类加泛型

	@Override
	public void show(T t) {
		System.out.println(t);
	}
	
}

十.泛型方法的概述和使用

1.泛型方法概述

  • 把泛型定义在方法上

2.定义格式

public <泛型类型> 返回类型 方法名(泛型类型 变量名)

3.案例演示

package com.heima.bean;

public class Tool<Q> {
	private Q q;

	public Q getObj() {
		return q;
	}

	public void setObj(Q q) {
		this.q = q;
	}
	
	public<T> void show(T t) {				//方法泛型最好与类的泛型一致
		System.out.println(t);				//如果不一致,需要在方法上声明该泛型
	}
	
	public static<W> void print(W w) {		//静态方法必须声明自己的泛型
		System.out.println(w);
	}
	
}

十一.泛型接口的概述和使用

1.泛型接口概述

  • 把泛型定义在接口上

2.定义格式

public interface 接口名<泛型类型>

3.案例演示

泛型接口的使用

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

	}
}

interface Inter<T> {
	public void show(T t);
}

/*class Demo implements Inter<String> {		//推荐用这种

	@Override
	public void show(String t) {
		System.out.println(t);
	}
	
}*/

class Demo<T> implements Inter<T> {			//没有必要在实现接口的时候给自己类加泛型

	@Override
	public void show(T t) {
		System.out.println(t);
	}
	
}

十二.泛型高级之通配符

1.泛型通配符<?>

  • 任意类型,如果没有明确,那么就是Object以及任意的Java类了

2.? extends E

  • 向下限定,E及其子类

3.? super E

向上限定,E及其父类

4.案例演示

public class Demo5_Generic {
	public static void main(String[] args) {
		//List<?> list = new ArrayList<Integer>();	//当右边的泛型是不确定时,左边可以指定为?
		ArrayList<Person> list1 = new ArrayList<>();
		list1.add(new Person("张三", 23));
		list1.add(new Person("李四", 24));
		list1.add(new Person("王五", 25));
		
		ArrayList<Student> list2 = new ArrayList<>();
		list2.add(new Student("赵六", 26));
		list2.add(new Student("周七", 27));
		
		list1.addAll(list2);
		System.out.println(list1);
		
	}

}

十三.增强for的概述和使用

1.增强for概述

  • 简化数组和Collection集合的遍历

2.格式

for(元素数据类型 变量 : 数组或者Collection集合) {
			使用变量即可,该变量就是元素
		}

3.案例演示

public class Demo1_Foreach {
	public static void main(String[] args) {
		int[] arr = {11,22,33,44,55};
		for (int i : arr) {
			System.out.println(i);
		}
		
		ArrayList<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		
		for (String string : list) {
			System.out.println(string);
		}
	}
		

}

4.好处

  • 简化遍历

十四.ArrayList存储字符串和自定义对象并遍历增强for版

1.案例演示

ArrayList存储字符串并遍历增强for版

public class Demo1_Foreach {
	public static void main(String[] args) {
		//demo2();
		ArrayList<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("b");
		list.add("c");
		list.add("d");
		
		//1,普通for循环删除,索引要--
		/*for(int i = 0; i < list.size(); i++) {
			if("b".equals(list.get(i))) {
				list.remove(i--);							//通过索引删除元素
			}
		}*/
		
		//2,迭代器删除
		/*Iterator<String> it = list.iterator();
		while(it.hasNext()) {
			if("b".equals(it.next())) {
				//list.remove("b");	
        //不能用集合的删除方法,因为迭代过程中如果集合修改会出现并发修改异常
				it.remove();
			}
		}*/
		
		/*for(Iterator<String> it2 = list.iterator(); it2.hasNext();) {
			if("b".equals(it2.next())) {
				//list.remove("b");							
        //不能用集合的删除方法,因为迭代过程中如果集合修改会出现并发修改异常
				it2.remove();
			}
		}*/
		//3,增强for循环,增强for循环不能删除,只能遍历
		for (String string : list) {
			if("b".equals(string)) {
				list.remove("b");
			}
		}
		System.out.println(list);
	}

	public static void demo2() {
		ArrayList<Person> list = new ArrayList<>();
		list.add(new Person("张三", 23));
		list.add(new Person("李四", 24));
		list.add(new Person("王五", 25));
		list.add(new Person("赵六", 26));
		
		for (Person person : list) {
			System.out.println(person);
		}
	}

		
		ArrayList<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		
		for (String string : list) {
			System.out.println(string);
		}
	}

}

十五.三种迭代的能否删除

  • 普通for循环,可以删除,但是索引要--
  • 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
  • 增强for循环不能删除

十六.静态导入的使用

1.格式

import static 包名….类名.方法名;

可以直接导入到方法的级别

2.注意事项

  • 方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?
  • 这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用

3.案例演示

public class Demo2_StaticImport {
	public static void main(String[] args) {
		int[] arr = {55,22,33,44,11};
		sort(arr);							//排序
		//System.out.println(toString(arr));
	}
}

十七.可变参数的概述和使用

1.可变参数概述

  • 定义方法的时候不知道该定义多少个参数

2.格式

修饰符 返回值类型 方法名(数据类型…  变量名){}

3.注意事项

  • 这里的变量其实是一个数组
  • 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个

4.案例演示

public class Demo3_ChangeableArgs {
	public static void main(String[] args) {
		int[] arr = {11,22,33,44,55};
		//print(arr);
		print(11,22,33,44,55);
		System.out.println("---------------");
		//print();
	}
	
	/*public static void print(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}*/
	
	
	public static void print(int ... arr) {			//可变参数其实是一个数组
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
}

十八.Arrays工具类的asList()方法的使用

1.案例演示

 Arrays工具类的asList()方法的使用
Collection中toArray(T[] a)泛型版的集合转数组

public class Demo4_AsList {

	/**
	 * 数组转换成集合
	 * 数组转换成集合虽然不能增加或减少元素,但是可以用集合的思想操作数组,也就是说可以使用其他集合中的方法
	 */
	public static void main(String[] args) {
		//demo1();
		//demo2();
		//集合转数组,加泛型的
		ArrayList<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		
		String[] arr = list.toArray(new String[10]);		//当集合转换数组时,数组长度如果是小于等于集合的size时,转换后的数组长度等于集合的size
															//如果数组的长度大于了size,分配的数组长度就和你指定的长度一样
		for (String string : arr) {
			System.out.println(string);
		}
	}

	public static void demo2() {
		//int[] arr = {11,22,33,44,55};			
		//List<int[]> list = Arrays.asList(arr);			基本数据类型的数组转换成集合,会将整个数组当作一个对象转换
		//System.out.println(list);
		Integer[] arr = {11,22,33,44,55};					//将数组转换成集合,数组必须是引用数据类型
		List<Integer> list = Arrays.asList(arr);
		System.out.println(list);
	}

	public static void demo1() {
		String[] arr = {"a","b","c"};
		List<String> list = Arrays.asList(arr);				//将数组转换成集合
		//list.add("d");									//不能添加
		System.out.println(list);
	}

}

十九.集合嵌套之ArrayList嵌套ArrayList

1.案例演示

集合嵌套之ArrayList嵌套ArrayList

public class Demo5_ArrayListArrayList {

	/**
	 * * A:案例演示
	 * 集合嵌套之ArrayList嵌套ArrayList
	 * 案例:
	 * 我们学科,学科又分为若个班级
	 * 整个学科一个大集合
	 * 若干个班级分为每一个小集合
	 */
	public static void main(String[] args) {
		ArrayList<ArrayList<Person>> list = new ArrayList<>();
		
		ArrayList<Person> first = new ArrayList<>();				//创建第一个班级
		first.add(new Person("杨幂", 30));
		first.add(new Person("李冰冰", 33));
		first.add(new Person("范冰冰", 20));
		
		ArrayList<Person> second = new ArrayList<>();
		second.add(new Person("黄晓明", 31));
		second.add(new Person("赵薇", 33));
		second.add(new Person("陈坤", 32));
		
		//将班级添加到学科集合中
		list.add(first);
		list.add(second);
		
		//遍历学科集合
		for(ArrayList<Person> a : list) {
			for(Person p : a) {
				System.out.println(p);
			}
		}
	}

}