16.01_集合框架(去除ArrayList中重复字符串元素方式)

###16.01_集合框架(去除ArrayList中重复字符串元素方式)

  • A:案例演示
    • 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)

    • 思路:创建新集合方式

        /**
         *  A:案例演示
         * 需求: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
         */
        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;							 //将新集合返回
        }
      

###16.02_集合框架(去除ArrayList中重复自定义对象元素)(掌握)

  • A:案例演示
    • 需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)
  • B:注意事项
    • 重写equals()方法的

list中的contains方法和remove方法依赖于Equal()方法,所有如果是自定义对象的调用,必须重写equal()方法

###16.03_集合框架(LinkedList的特有功能)(掌握)

  • A:LinkedList类概述
  • B:LinkedList类特有功能
    • public void addFirst(E e)及addLast(E e)
    • public E getFirst()及getLast()
    • public E removeFirst()及public E removeLast()
    • public E get(int index);

###16.04_集合框架(栈和队列数据结构)(掌握)

    • 先进后出
  • 队列
    • 先进先出

###16.05_集合框架(用LinkedList模拟栈数据结构的集合并测试)(掌握)

  • A:案例演示
    • 需求:请用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()方法
        	}
        }
      

###16.06_集合框架(泛型概述和基本使用)(掌握)

  • A:泛型概述
  • B:泛型好处
    • 提高安全性(将运行期的错误转换到编译期)
    • 省去强转的麻烦
  • C:泛型基本使用
    • <>中放的必须是引用数据类型
  • D:泛型使用注意事项
    • 前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)

可以插入泛型设置的数据类型的子类

###16.07_集合框架(ArrayList存储字符串和自定义对象并遍历泛型版)(掌握)

  • A:案例演示
    • ArrayList存储字符串并遍历泛型版

###16.08_集合框架(泛型的由来)(了解)

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

###16.09_集合框架(泛型类的概述及使用)(了解)

  • A:泛型类概述
    • 把泛型定义在类上
  • B:定义格式
    • public class 类名<泛型类型1,…>
  • C:注意事项
    • 泛型类型必须是引用类型
  • D:案例演示
    • 泛型类的使用

Eg:
如果用object对象引用数组存取了Worker,就将Wokrer向下转成了Object,然后又提取Object这个引用对象,把他向上转成Student并且赋值给了一共Student的对象,最后调用这个对象或者方法就会出错! 用了泛型后就会使这个数组对象引用只能指向本类型或者子类型。(不是数组,即使是类对象但是返回和参数是基本类型也是一样的意思)

###16.10_集合框架(泛型方法的概述和使用)(了解)

  • A:泛型方法概述
    • 把泛型定义在方法上
  • B:定义格式
    • public <泛型类型> 返回类型 方法名(泛型类型 变量名)
  • C:案例演示
    • 泛型方法的使用

###16.11_集合框架(泛型接口的概述和使用)(了解)

  • A:泛型接口概述
    • 把泛型定义在接口上
  • B:定义格式
    • public interface 接口名<泛型类型>
  • C:案例演示
    • 泛型接口的使用
      Interface inter
      {

}

//推荐
Class Demo implements inter<String 或则其他引用数据类型>
{

}

//不推荐,没有必要在实现接口的时候给自己类加泛型
Class Demo implements inter
{

}

静态方法必须用泛型方法定义,因为静态方法随着类的加载而加载,不能在建立对象时给泛型赋值

###16.12_集合框架(泛型高级之通配符)(了解)

  • A:泛型通配符<?>
    • 任意类型,如果没有明确,那么就是Object以及任意的Java类了
  • B:? extends E
    • 向下限定,E及其子类
  • C:? super E
    • 向上限定,E及其父类

//一般来讲左右泛型要一致,写的时候前面泛型要写明,后面可以省略
//但是如果左边泛型不确定,就可以输入?
Eg:
List<?> list = new ArrayList();

Arraylist类有一个方法addAll用来添加另一个集合的全部元素,程序员想将Array中的所有元素添加到ArrayList中去,然而,反过来就不行了,所有可以用通配符类型解决这个问题

###16.13_集合框架(增强for的概述和使用)(掌握)

  • A:增强for概述

    • 简化数组和Collection集合的遍历
  • B:格式:

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

    • 数组,集合存储元素用增强for遍历
  • D:好处

    • 简化遍历

Eg:

  • Alt + / 辅助内容写入
    增强for循环底层依赖得是迭代器

###16.14_集合框架(ArrayList存储字符串和自定义对象并遍历增强for版)(掌握)

  • A:案例演示
    • ArrayList存储字符串并遍历增强for版
    •   ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        for(String s : list) {
        	System.out.println(s);
        }
      

###16.15_集合框架(三种迭代的能否删除)(掌握)

  • 普通for循环,可以删除,但是索引要–

  • 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常

  • 增强for循环不能删除
    Eg:
    public static void main(String[] args)
    {
    //去除list中有b的元素
    List list = new ArrayList<>();
    list.add(“a”);
    list.add(“b”);
    list.add(“b”);
    list.add(“c”);
    list.add(“d”);
    list.add(“b”);

      //普通循环
      for(int i = 0; i < list.size(); i++)
      {
      	if("b".equals(list.get(i)))
      	{
      		/*list.remove(i);   错误,因为remove后,后面的元素会前移,所以要将指针退回一个*/
      		list.remove(i);
      		i--;
      	}
      }
    
      //迭代器循环
      Iterator i  = list.iterator();
      while(i.hasNext())
      {
      	if(i.next().equals("b"))
      		/*list.remove("b"); 有错误,因为迭代器已经对集合进行了迭代,但是未迭代完就改变集合,导致出错*/
      		i.remove();
      }
      
      //for each
      /*for (String string : list) 
      {
      	if(string.equals("b"))
      		list.remove("b");
      } 不行,因为for each 原理也是迭代器,所以会出现上个会出现的错误,其意义是一样的*/
    

    }

###16.16_集合框架(静态导入的概述和使用)(了解)

  • A:静态导入概述
  • B:格式:
    • import static 包名….类名.方法名;
    • 可以直接导入到方法的级别
  • C:注意事项
    • 方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?
      这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂。

没什么用处,直接导入类,调用类的静态方法就行了

###16.17_集合框架(可变参数的概述和使用)(掌握)

  • A:可变参数概述
    • 定义方法的时候不知道该定义多少个参数
  • B:格式
    • 修饰符 返回值类型 方法名(数据类型… 变量名){}
  • C:注意事项:
    • 这里的变量其实是一个数组
    • 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
      可变参数其实是一个数组

可变参数要放到最后一个,可以把可变参数看成一个数组

###16.18_集合框架(Arrays工具类的asList()方法的使用)(掌握)

  • A:案例演示
    • Arrays工具类的asList()方法的使用
    • Collection中toArray(T[] a)泛型版的集合转数组

Arrays.asList()可以将数组转换成list类型,但是只能是引用类型数组,基本数据类型不行,如果一定要,那么先将基本数据类型数组转换成对应包装类型的数组

Eg:
String[] arr1 = {“a”, “b”, “d”, “e”, “l”};
List list1 = Arrays.asList(arr1);
System.out.println(list1); //[a, b, d, e, l]

	int[] arr = {34, 21, 12, 50, 64, 10};
	Arrays.sort(arr);
	
	//List<int> list = Arrays.asList(arr); //不行
	List<int[]> list = Arrays.asList(arr); 
	
	System.out.println(list); //[[I@7852e922] 输出的是地址值
	//这是因为将int[] arr 的arr看成一个对象,一个数组对象 而不是将数组每个元素看成一个对象
	
	Integer[] arr2 = {34, 21, 12, 50, 64, 10};
	Arrays.sort(arr2);
	List<Integer> list2 = Arrays.asList(arr2);
	System.out.println(list2); //[10, 12, 21, 34, 50, 64]

集合转数组得用法:
List(对象).toArray()
List(对象).toArray()
如果不调用有参,给定泛值,那么会返回Objext类型的数组

###16.19_集合框架(集合嵌套之ArrayList嵌套ArrayList)(掌握)

  • A:案例演示
    • 集合嵌套之ArrayList嵌套ArrayList
      Eg:
      ArrayList <ArrayList> l = new ArrayList<>();

      ArrayList l1 = new ArrayList<>();
      l1.add(“a1”);
      l1.add(“b1”);
      l1.add(“c1”);

      ArrayList l2 = new ArrayList<>();
      l2.add(“a2”);
      l2.add(“b2”);
      l2.add(“c2”);

      l.add(l1);
      l.add(l2);

      for(ArrayList a : l)
      {
      for(String s : a)
      System.out.println(s);
      System.out.println("-----------");
      }
      ###16.20_day16总结

  • 把今天的知识点总结一遍。

猜你喜欢

转载自blog.csdn.net/qq_40940540/article/details/85221844