Day16_集合第二天

时间:2022-08-06 20:13:09

1、LinkedList类(掌握)

1、特点

底层数据结构是链表,查询慢,增删快
线程不安全,效率高。


LinkedList 成员方法
void addFirst(Object o)
添加
void addLast(Object o)
Objcet getFirst()
获取
Object getLast()
Object removeFirst()
删除
Object removeLast()
  

2、栈和队列数据结构(掌握)

1、栈
     特点:先进后出
2、队列
     特点:先进先出
3、数组
     特点:查询快,增删慢
4、链表
     特点:查询慢,增删快

数据结构面试题:模仿Stack

3、泛型(能看懂什么是泛型的声明,什么是泛型的使用即可)

1、概述

     泛型是一种把明确类型的工作放在了创建对象或者调用方法时候才去明确的特殊的类型
     泛型就相当于一个预定义类型

2、好处(掌握)
     B、把系统运行期间的异常提前到了编译期间,提高了安全性
     C、优化了程序设计,不需要做强制转换了

3、不足(掌握)
     泛型传入的只能是引用类型

4、泛型通配符
     <?>  任意类型
    <? extends E> E包括E的子类,也叫向下限定
    <? super E> E包括E的父类,也叫向上限定

3、泛型的定义
     A、在类上定义
          说明:
               T,S是名字,可以随意起,该处定义的泛型可以在本类的任意地方使用
               父类上定义的泛型不能被子类继承
  1. /**在类上定义一个泛型*/
  2. class Person1<T> {
  3. }
  4. /**在类上定义两个泛型*/
  5. class Person2<T,S>{
  6. }
  7. /**在类上定义两个泛型,且第二个类型S必须F或者F的子类*/
  8. class Person3<F, S extends F>{
  9. }

      B、在方法上定义
          因为返回值类型也可能会用到泛型类型,所以泛型的声明要在返回值之前
          说明:
               T,S是名字,可以随意起,该处定义的泛型可以在该方法的任意地方使用

  1. /**在方法上声明一个泛型*/
  2. public <T> void show(T t){
  3. }
  4. /**在方法上声明两个泛型*/
  5. public <T,S> void show(T t, S s){
  6. }
  7. /**在方法上声明两个泛型,切第二个类型S必须是F或者F的子类*/
  8. public <F,S extends F> void show(){
  9. }

     C、在接口上定义泛型
         和在类上定义一样

3、泛型的使用
     可以在继承关系,实现关系,创建对象时使用

4、易错题解析
  1. interface English<T> {
  2. void speakEnglish();
  3. }
  4. /**
  5. *
  6. * 问题:可以调用以下String中的substring方法吗
  7. * 第一个<String>是声明一个泛型,名字叫String
  8. * 第二个<String>是使用刚才声明好的泛型
  9. * 所以这两个String与java.lang包下的String没有任何关系
  10. */
  11. class Person<String> implements English<String>{
  12. @Override
  13. public void speakEnglish() {
  14. }
  15. }

4、静态导入(了解)

1、概述
    静态导入是导入类中静态方法

2、格式
    import static 包名….类名.方法名;

3、注意事项
    方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂。
    静态导入开发不用,但是需要能看懂

4、案例
  1. import static java.util.Arrays.sort; //静态导入
  2. public class Demo2_StaticImport {
  3. public static void main(String[] args) {
  4. int[] arr = {55,22,33,44,11};
  5. sort(arr);
  6. }
  7. }

5、增强for循环(掌握)

1、格式

     for(数组 或 Collection子类 的元素类型 变量名 :数组 或 Collection子类)
     {
          //使用变量
     }

2、好处
     方便数组和集合的遍历

3、注意事项
     增强for是用来代替Iterator的
     不要再遍历的时候用集合对集合本身进行修改

4、集合遍历的四种方式
     1、迭代
     2、将集合转换为数组(忘记吧)
     3、获取集合的长度,通过get()+for遍历
     4、使用for高级循环(常用)
               for(Object obj : list){
                    System.out.println(obj);
               }

6、可变参数(掌握)

1、概述
    定义方法的时候不知道该定义多少个参数

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

3、注意事项
    这里的变量其实是一个数组
    如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
  1. package com.heima.jdk5;
  2. public class Demo3_ChangeableArgs {
  3. public static void main(String[] args) {
  4. print(11,22,33,44,55);
  5. }
  6. public static void print(int ... arr) { //可变参数其实是一个数组
  7. for (int i = 0; i < arr.length; i++) {
  8. System.out.println(arr[i]);
  9. }
  10. }
  11. }

7、案例(掌握)

1、ArrayList去除集合中字符串的重复值(字符串的内容相同),创建新集合方式

2、ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同),因为contains方法比较对象的equals方法,所以自定义对象要重写equals方法

3、数据结构面试题:用LinkedList模拟栈结构(栈结构:先进后出)

4、ArrayList存储自定义对象和String类型数据,通过泛型实现

5、Arrays.asList练习

6、ArrayList   嵌套 ArrayList 练习

8、案例代码(掌握)

1、ArrayList去除集合中字符串的重复值(字符串的内容相同),创建新集合方式
  1. package com.heima.list;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. @SuppressWarnings({ "rawtypes", "unchecked" })
  5. public class Demo1_ArrayList {
  6. /**
  7. * * A:案例演示
  8. * 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
  9. * 思路:创建新集合方式
  10. */
  11. public static void main(String[] args) {
  12. ArrayList list = new ArrayList();
  13. list.add("a");
  14. list.add("a");
  15. list.add("b");
  16. list.add("b");
  17. list.add("c");
  18. list.add("c");
  19. list.add("c");
  20. list.add("c");
  21. ArrayList newList = getSingle(list);
  22. System.out.println(newList);
  23. }
  24. /*
  25. * 创建新集合将重复元素去掉
  26. * 1,明确返回值类型,返回ArrayList
  27. * 2,明确参数列表ArrayList
  28. *
  29. * 分析:
  30. * 1,创建新集合
  31. * 2,根据传入的集合(老集合)获取迭代器
  32. * 3,遍历老集合
  33. * 4,通过新集合判断是否包含老集合中的元素,如果包含就不添加,如果不包含就添加
  34. */
  35. public static ArrayList getSingle(ArrayList list) {
  36. ArrayList newList = new ArrayList<>(); //1,创建新集合
  37. Iterator it = list.iterator(); //2,根据传入的集合(老集合)获取迭代器
  38. while(it.hasNext()) { //3,遍历老集合
  39. Object obj = it.next(); //记录住每一个元素
  40. if(!newList.contains(obj)) { //如果新集合中不包含老集合中的元素
  41. newList.add(obj); //将该元素添加
  42. }
  43. }
  44. return newList;
  45. }
  46. }



2、ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同),因为contains方法比较对象的equals方法,所以自定义对象要重写equals方法
  1. package com.heima.list;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import com.heima.bean.Person;
  5. @SuppressWarnings({ "rawtypes", "unchecked" })
  6. public class Demo2_ArrayList {
  7. /**
  8. * * A:案例演示
  9. * 需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)
  10. * B:注意事项
  11. * 重写equals()方法的
  12. contains方法判断是否包含,底层依赖的是equals方法
  13. remove方法判断是否删除,底层依赖的是equals方法
  14. */
  15. public static void main(String[] args) {
  16. ArrayList list = new ArrayList(); //创建集合对象
  17. list.add(new Person("张三", 23));
  18. list.add(new Person("张三", 23));
  19. list.add(new Person("李四", 24));
  20. list.add(new Person("李四", 24));
  21. list.add(new Person("李四", 24));
  22. list.add(new Person("李四", 24));
  23. //ArrayList newList = getSingle(list); //调用方法去除重复
  24. //System.out.println(newList);
  25. list.remove(new Person("张三", 23));
  26. System.out.println(list);
  27. }
  28. /*
  29. * 创建新集合将重复元素去掉
  30. * 1,明确返回值类型,返回ArrayList
  31. * 2,明确参数列表ArrayList
  32. *
  33. * 分析:
  34. * 1,创建新集合
  35. * 2,根据传入的集合(老集合)获取迭代器
  36. * 3,遍历老集合
  37. * 4,通过新集合判断是否包含老集合中的元素,如果包含就不添加,如果不包含就添加
  38. */
  39. public static ArrayList getSingle(ArrayList list) {
  40. ArrayList newList = new ArrayList<>(); //1,创建新集合
  41. Iterator it = list.iterator(); //2,根据传入的集合(老集合)获取迭代器
  42. while(it.hasNext()) { //3,遍历老集合
  43. Object obj = it.next(); //记录住每一个元素
  44. if(!newList.contains(obj)) { //如果新集合中不包含老集合中的元素
  45. newList.add(obj); //将该元素添加
  46. }
  47. }
  48. return newList;
  49. }
  50. }


3、数据结构面试题:用LinkedList模拟栈结构(栈结构:先进后出)
  1. package com.heima.list;
  2. import java.util.LinkedList;
  3. public class Stack {
  4. private LinkedList list = new LinkedList();
  5. /*
  6. * 模拟进栈方法
  7. */
  8. public void in(Object obj) {
  9. list.addLast(obj);
  10. }
  11. /*
  12. * 模拟出栈
  13. */
  14. public Object out() {
  15. return list.removeLast();
  16. }
  17. /*
  18. * 模拟栈结构是否为空
  19. */
  20. public boolean isEmpty() {
  21. return list.isEmpty();
  22. }
  23. }



4、ArrayList存储自定义对象和String类型数据,通过泛型实现
  1. package com.heima.generic;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import com.heima.bean.Person;
  5. public class Demo2_Generic {
  6. /**
  7. * * A:案例演示
  8. * ArrayList存储字符串并遍历泛型版
  9. */
  10. public static void main(String[] args) {
  11. //demo1();
  12. ArrayList<Person> list = new ArrayList<>();
  13. list.add(new Person("张三", 23));
  14. list.add(new Person("李四", 24));
  15. list.add(new Person("王五", 25));
  16. list.add(new Person("赵六", 26));
  17. Iterator<Person> it = list.iterator();
  18. while(it.hasNext()) {
  19. Person p = it.next(); //将集合中的每一个元素用Person记录
  20. System.out.println(p.getName() + "..." + p.getAge());
  21. }
  22. }
  23. public static void demo1() {
  24. ArrayList<String> list = new ArrayList<>(); //创建集合对象
  25. list.add("a");
  26. list.add("b");
  27. list.add("c");
  28. list.add("d");
  29. Iterator<String> it = list.iterator();
  30. while(it.hasNext()) {
  31. System.out.println(it.next());
  32. }
  33. }
  34. }


5、Arrays.asList练习
  1. package com.heima.jdk5;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. public class Demo4_AsList {
  6. /**
  7. * 数组转换成集合
  8. * 数组转换成集合虽然不能增加或减少元素,但是可以用集合的思想操作数组,也就是说可以使用其他集合中的方法
  9. */
  10. public static void main(String[] args) {
  11. //demo1();
  12. //demo2();
  13. //集合转数组,加泛型的
  14. ArrayList<String> list = new ArrayList<>();
  15. list.add("a");
  16. list.add("b");
  17. list.add("c");
  18. list.add("d");
  19. String[] arr = list.toArray(new String[10]); //当集合转换数组时,数组长度如果是小于等于集合的size时,转换后的数组长度等于集合的size
  20. //如果数组的长度大于了size,分配的数组长度就和你指定的长度一样
  21. for (String string : arr) {
  22. System.out.println(string);
  23. }
  24. }
  25. public static void demo2() {
  26. //int[] arr = {11,22,33,44,55};
  27. //List<int[]> list = Arrays.asList(arr); 基本数据类型的数组转换成集合,会将整个数组当作一个对象转换
  28. //System.out.println(list);
  29. Integer[] arr = {11,22,33,44,55}; //将数组转换成集合,数组必须是引用数据类型
  30. List<Integer> list = Arrays.asList(arr);
  31. System.out.println(list);
  32. }
  33. public static void demo1() {
  34. String[] arr = {"a","b","c"};
  35. List<String> list = Arrays.asList(arr); //将数组转换成集合
  36. //list.add("d"); //不能添加
  37. System.out.println(list);
  38. }
  39. }


6、ArrayList   嵌套 ArrayList 练习
  1. package com.heima.list;
  2. import java.util.ArrayList;
  3. import com.heima.bean.Person;
  4. public class Demo5_ArrayListArrayList {
  5. /**
  6. * * A:案例演示
  7. * 集合嵌套之ArrayList嵌套ArrayList
  8. * 案例:
  9. * 我们学科,学科又分为若个班级
  10. * 整个学科一个大集合
  11. * 若干个班级分为每一个小集合
  12. */
  13. public static void main(String[] args) {
  14. ArrayList<ArrayList<Person>> list = new ArrayList<>();
  15. ArrayList<Person> first = new ArrayList<>(); //创建第一个班级
  16. first.add(new Person("杨幂", 30));
  17. first.add(new Person("李冰冰", 33));
  18. first.add(new Person("范冰冰", 20));
  19. ArrayList<Person> second = new ArrayList<>();
  20. second.add(new Person("黄晓明", 31));
  21. second.add(new Person("赵薇", 33));
  22. second.add(new Person("陈坤", 32));
  23. //将班级添加到学科集合中
  24. list.add(first);
  25. list.add(second);
  26. //遍历学科集合
  27. for(ArrayList<Person> a : list) {
  28. for(Person p : a) {
  29. System.out.println(p);
  30. }
  31. }
  32. }
  33. }


7、在遍历的时候删除集合中的元素
  1. /**
  2. * 在遍历的时候删除集合中的元素
  3. */
  4. public class Test3 {
  5. public static void main(String[] args) {
  6. ArrayList<String> al = new ArrayList<String>();
  7. al.add("a");
  8. al.add("a");
  9. al.add("a");
  10. al.add("b");
  11. //删除所有的a
  12. for(int i=0; i<al.size(); i++){
  13. String string = al.get(i);
  14. if(string.equals("a")){
  15. al.remove(i--);
  16. }
  17. }
  18. }
  19. }

9、今天必须掌握的内容,面试题,笔试题

1、ArrayList去除集合中字符串的重复值(字符串的内容相同),创建新集合方式
2、ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同),因为contains方法比较对象的equals方法,所以自定义对象要重写equals方法
3、用LinkedList模拟栈结构
4、练习泛型:ArrayList<Student>集合的遍历
5、说说栈和队列的数据结构
6、代码题:练习泛型的使用。定义一个方法swap()传入集合和两个角标使集合中元素交换位置
  1. package com.heima.test;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import com.heima.bean.Person;
  5. /*
  6. * 1,定义一个方法swap()传入集合和两个角标使集合中元素交换位置
  7. a,定义一个临时变量, 记住其中一个元素
  8. b,用第一个位置存放第二个位置上的元素
  9. c, 用第二个位置存放临时变量记住的元素
  10. */
  11. public class Test1 {
  12. public static void main(String[] args) {
  13. //测试集合中存入字符串
  14. ArrayList<String> al = new ArrayList<>();
  15. al.add("a");
  16. al.add("b");
  17. al.add("c");
  18. al.add("d");
  19. System.out.println(al);
  20. swap(al,0,3);
  21. System.out.println(al);
  22. //测试集合中存入自定义对象
  23. ArrayList<Person> al2 = new ArrayList<>();
  24. al2.add(new Person("zs", 20));
  25. al2.add(new Person("ls", 30));
  26. al2.add(new Person("ww", 10));
  27. al2.add(new Person("zl", 40));
  28. al2.add(new Person("kw", 22));
  29. System.out.println("------------------");
  30. System.out.println(al2);
  31. swap(al2,0,4);
  32. System.out.println(al2);
  33. }
  34. //定义一个带泛型的方法
  35. public static <T> void swap(List<T> list,int index1,int index2) {
  36. //1.获取list集合中索引为index1的值
  37. T t = list.get(index1);
  38. //2.将集合中索引index1位置设置为索引index2的值
  39. list.set(index1, list.get(index2));
  40. //3.将集合index2位置设置为t
  41. list.set(index2, t);
  42. }
  43. }

7、代码题:练习集合中元素的删除和正则。编写一个方法删除集合List<String>中所有包含数字的元素
  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;
  4. import java.util.regex.Matcher;
  5. import java.util.regex.Pattern;
  6. /**
  7. * 编写一个方法删除集合List<String>中所有包含数字的元素
  8. *
  9. * @author haoyongliang
  10. *
  11. */
  12. public class ArrayListTest {
  13. public static void main(String[] args) {
  14. ArrayList<String> list = new ArrayList<>();
  15. list.add("abce0fgh");
  16. list.add("ab2e0fgh");
  17. list.add("a");
  18. list.add("ab3e0fgh");
  19. list.add("ab5e0fgh");
  20. list.add("ab6e0fgh");
  21. list.add("ab5e0f8gh");
  22. list.add("ab5e0f8gh");
  23. delete(list);
  24. System.out.println(list);
  25. }
  26. private static void delete(List<String> list) {
  27. for (int i = 0; i < list.size(); i++) {
  28. String string = list.get(i);
  29. if (string.matches(".*\\d+.*")) {
  30. list.remove(i);
  31. i--;
  32. }
  33. }
  34. }
  35. }

8、向ArrayList中存入一堆学生对象,并且找出年龄最大的那个人
9、集合ArrayList<String>存储了一堆元素,将集合中的所有出现"aa"的元素全部替换成"bb"
10、把集合中的元素反转