资讯专栏INFORMATION COLUMN

Java编程基础17——集合(List集合)

scola666 / 2670人阅读

1_(去除ArrayList中重复字符串元素方式)*

A:案例演示

需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)

思路:创建新集合方式

import java.util.ArrayList;
import java.util.Iterator;
public class ArrayList_1_demo {
    /* 创建新集合将重复元素去掉
    * 1.明确返回值类型,返回ArrayList
    * 2.明确参数列表ArrayList
    * */
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("a");
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("c");
        list.add("b");
        
        ArrayList newList = getSingle(list);
        System.out.println(newList);
    }
    
    public static ArrayList getSingle(ArrayList list) {
        ArrayList newList = new ArrayList();            //1.创建新集合
        Iterator it = list.iterator();                //2.根据传入的集合(老集合)获取迭代器
        
        while(it.hasNext()) {                //3.遍历老集合
            Object obj = it.next();            //4.临时记录每一个元素
            if(!newList.contains(obj)) {    //5.如果新集合中不包含老集合中的元素
                newList.add(obj);            //6.将新元素添加到新集合中
            }
        }
        return newList;                        //7.将新集合返回
    }
}
2_(去除ArrayList中重复自定义对象元素)*

A:案例演示

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

B:注意事项

重写equals()方法的

contains方法判断是否包含,底层依赖的是equals方法

remove方法判断是否删除,底层依赖的是equals方法

import java.util.ArrayList;
import java.util.Iterator;
import net.allidea.bean.Person;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ArrayList_2_demo {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();            //创建集合对象
        list.add(new Person("张三",23));
        list.add(new Person("李四",24));
        list.add(new Person("张三",23));
        list.add(new Person("张三",23));
        list.add(new Person("王五",23));
        list.add(new Person("李四",24));
        
//        ArrayList newList = getSingle(list);            //调用方法去除重复
//        System.out.println(newList);
        list.remove(new Person("张三",23));
        System.out.println(list);
    }
    public static ArrayList getSingle(ArrayList list) {
        ArrayList newList = new ArrayList();            //1.创建新集合
        Iterator it = list.iterator();                //2.根据传入的集合(老集合)获取迭代器
        
        while(it.hasNext()) {                //3.遍历老集合
            Object obj = it.next();            //4.临时记录每一个元素
            if(!newList.contains(obj)) {    //5.如果新集合中不包含老集合中的元素
                newList.add(obj);            //6.将新元素添加到新集合中
            }
        }
        return newList;                        //7.将新集合返回
    }
}
    @Override//重写equals方法
    public boolean equals(Object obj) {
        Person p = (Person)obj;
        return this.name.equals(p.name) && this.age == p.age;
    }
3_(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);

import java.util.LinkedList;
public class ArrayList_3_LinkedList {
    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.addFirst("a");
        list.addFirst("b");
        list.addFirst("c");
        list.addFirst("d");//在头部添加
        list.addLast("e");//在尾部添加
        
//        System.out.println(list.getFirst());//打印头部元素
//        System.out.println(list.getLast());//打印尾部元素
//        System.out.println(list.removeFirst());//删除头
//        System.out.println(list.removeLast());//删除尾
        System.out.println(list.get(1));
        System.out.println(list);
    }
}
4_(栈和队列数据结构)*

先进后出 (装子弹原理)

队列

先进先出(水龙头原理)

5_用LinkedList模拟栈数据结构的集合并测试*

A:案例演示

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

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

import java.util.LinkedList;
import java.util.Stack;

public class ArrayList_4_LinkedList {
    public static void main(String[] args) {
//        demo1();
        stack s = new stack();            //进栈
        s.in("a");
        s.in("b");
        s.in("c");
        s.in("d");
        
        while(!s.isEmpty()) {            //是否为空
            System.out.println(s.out());//弹栈
        }
    }

    private static void demo1() {
        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());
        }
    }
}
import java.util.LinkedList;
public class stack {
    private LinkedList list = new LinkedList();
    
    //模拟进栈方法
    public void in(Object obj) {
        list.addLast(obj);
    }
    
    //模拟出栈方法
    public Object out() {
        return list.removeLast();
    }
    
    //模拟栈结构是否为空
    public boolean isEmpty() {
        return list.isEmpty();
    }
}
6_泛型概述和基本使用*

A:泛型概述

B:泛型好处

提高安全性(将运行期的错误转换到编译期)

省去强转的麻烦

C:泛型基本使用

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

D:泛型使用注意事项

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

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

    private static void demo1() {
        ArrayList list = new ArrayList();
//        list.add(100);
//        list.add(true);
        list.add(new Person("张三",23));
        list.add(new Person("李四",24));
        
        Iterator it = list.iterator();
        while(it.hasNext()) {
//            System.out.println(it.next());
            //next()方法只能调用一次,如果调用多次会将指针向后移动多次
//            System.out.println(it.next().getName() + "..." + it.next().getAge());
            Person p = it.next();        //向下转型
            System.out.println(p.getName() + "..." + p.getAge());
        }
    }
}
7_ArrayList存储字符串和自定义对象并遍历泛型版*

A:案例演示

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

import java.util.ArrayList;
import java.util.Iterator;
import net.allidea.bean.Person;
public class Generic_2_demo 
    public static void main(String[] args) {
//        demo1();
        demo2();
    }

    private static void demo2() {
        ArrayList list = new ArrayList<>();
        list.add(new Person("张三",23));
        list.add(new Person("李四",24));
        list.add(new Person("王五",25));
        list.add(new Person("赵六",26));
        
        Iterator it = list.iterator();
        while(it.hasNext()) {
            Person p = it.next();    //将集合中的每一个元素用Person记录
            System.out.println(p.getName() + "..." + p.getAge());
        }
    }
    
    private static void demo1() {
        ArrayList list = new ArrayList();        //创建集合对象
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        Iterator it = list.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }
}
8_泛型的由来(了解)

A:案例演示

泛型的由来:通过Object转型问题引入

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

import net.allidea.bean.Animal;        //Animal 继承 Person及其构造
import net.allidea.bean.Person;        //Person private String name;private int age;
import net.allidea.bean.Tool;        //Tool 自定义类private Object obj;
import net.allidea.bean.Worker;        //Worker 继承 Person及其构造

public class Generic_3_demo {
    public static void main(String[] args) {
        Tool t = new Tool();        //创建工具类对象
        t.setObj(new Animal("张三",23));

        Worker w = (Worker)t.getObj();        //向下转型
        System.out.println(w);
    }
}
9_泛型类的概述及使用(了解)

A:泛型类概述

把泛型定义在类上

B:定义格式

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

C:注意事项

泛型类型必须是引用类型

D:案例演示

泛型类的使用

import net.allidea.bean.Animal;        //Animal 继承 Person及其构造
import net.allidea.bean.Person;        //Person private String name;private int age;
import net.allidea.bean.Tool;        //Tool 自定义类private Object obj;
import net.allidea.bean.Worker;        //Worker 继承 Person及其构造

public class Generic_3_demo {
    public static void main(String[] args) {
        Tool t = new Tool<>();        //创建工具类对象
        t.setObj(new Animal("张三",23));

//        Worker w = (Worker)t.getObj();        //报错
//        System.out.println(w);
    }
}
//Tool文件
package net.allidea.bean;
public class Tool {    //E代表元素
    private Q q;

    public Q getObj() {
        return q;
    }

    public void setObj(Q q) {
        this.q = q;
    }
}
10_泛型方法的概述和使用(了解)

A:泛型方法概述

把泛型定义在方法上

B:定义格式

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

C:案例演示

泛型方法的使用

import net.allidea.bean.Animal;        //Animal 继承 Person及其构造
import net.allidea.bean.Tool;        //Tool 自定义类private Object obj;

public class Generic_3_demo {
    public static void main(String[] args) {
        Tool t = new Tool<>();
//        t.show("abc");
        t.show(true);            //无类型,自动装箱
    }
}
package net.allidea.bean;
public class Tool {    //E代表元素
    private Q q;

    public Q getObj() {
        return q;
    }

    public void setObj(Q q) {
        this.q = q;
    }
    
    public void show(T t) {        //方法泛型需要与类的泛型一致
        System.out.println(t);        //如果不一致,需要在方法上声明该类型
    }
    
    public static void print(Q q) {    //静态方法必须声明自己的泛型,加载早此Q非彼Q
        System.out.println(q);    
    }
}
11_泛型接口的概述和使用(了解)

A:泛型接口概述

把泛型定义在接口上

B:定义格式

public interface 接口名<泛型类型>

C:案例演示

泛型接口的使用

package net.allidea.Generic;
public class Generic_4_demo {    
    public static void main(String [] args) {            
    }
}

interface Inter {        //接口泛型
    public void show(T t);        //抽象方法
}

/*class Demo implements Inter {        //第一种方式实现接口泛型,推荐

     @Override
    public void show(String t) {            //重写抽象方法
        System.out.println(t);
    }
}*/

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

    @Override
    public void show(T t) {
        System.out.println(t);
    }
}
12_(泛型高级之通配符)(了解)

A:泛型通配符

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

B:? extends E

向下限定,E及其子类

C:? super E

向上限定,E及其父类

import java.util.ArrayList;
import java.util.List;
import net.allidea.bean.Person;
import net.allidea.bean.Animal;

public class Generic_5_demo {
    public static void main(String[] args) {
//        List    list = new ArrayList(); //当右边泛型是不确定时,左边可以指定为?
        ArrayList list1 = new ArrayList<>();
        list1.add(new Person("张三",23));
        list1.add(new Person("李四",24));
        list1.add(new Person("王五",25));
        
        ArrayList list2 = new ArrayList<>();
        list2.add(new Animal("赵六",26));
        list2.add(new Animal("田七",27));
        
        list1.addAll(list2);    //Animal继承Person
        System.out.println(list1);    
    }
}
13_增强for的概述和使用*

A:增强for概述——简化数组和Collection集合的遍历

B:格式:

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

C:案例演示——数组,集合存储元素用增强for遍历

D:好处——简化遍历

import java.util.ArrayList;
public class Foreach_1_demo {
    public static void main(String[] args) {
        int[] arr = {11,22,33,44,55,66};
        for(int i : arr) {
            System.out.println(i);
        }

        ArrayList list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        for (String string : list) {
            System.out.println(string);
        }
    }
}
14_ArrayList存储字符串和自定义对象并遍历增强for版 *

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

增强for循环底层依赖的是迭代器(Iterator)

    public static void main(String[] args) {
        ArrayList list = new ArrayList<>();
        list.add(new Person("张三",23));
        list.add(new Person("李四",24));
        list.add(new Person("王五",25));
        list.add(new Person("赵六",26));
        list.add(new Person("田七",27));
        
        for (Person person : list) {
            System.out.println(person);
        }
    }
15_三种迭代的能否删除*

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

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

增强for循环不能删除

    public static void main(String[] args) {
        ArrayList list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("b");
        
        //普通for循环删除,索引要--
        /*for (int i = 0; i < list.size(); i++) {
            if("b".equals(list.get(i))) {
                list.remove(i--);                    //通过索引删除元素
            }
        }*/
        //迭代器删除
        /*Iterator it = list.iterator();
        while(it.hasNext()) {
            if("b".equals(it.next())) {
//                list.remove("b");        //不能用集合的删除方法,会报并发修改异常
                it.remove();
            }
        }*/
        
        /*for(Iterator it2 = list.iterator(); it2.hasNext();) {
            if("b".equals(it2.next())) {
                it2.remove();
            }
        }*/
        
        //增强for循环,不能删除,只能遍历
        for (String String : list) {
            if("b".equals(String)) {
                list.remove("b");
            }
        }
        System.out.println(list); 
    }
16_静态导入的概述和使用(了解)

A:静态导入概述

静态导入时导入类中的静态方法;

B:格式:

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

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

C:注意事项

方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?

这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂。
import static java.util.Arrays.sort;
import static java.util.Arrays.*;
public class StaticImport_2_demo {        
    public static void main(String[] args) {
        int[] arr = {11,33,55,66,99,44};
        sort(arr);            //排序
        System.out.println(Arrays.toString(arr));
    }
}
17_可变参数的概述和使用*

A:可变参数概述

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

B:格式

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

C:注意事项:

这里的变量其实是一个数组

如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个

public class ChangeableArgs_3_demo {
    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(0, arr);
    }
    
    /*public static void print(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }*/
    
    public static void print(int x,int ... arr) {            //可变参数是一个数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}
18_Arrays工具类的asList()方法的使用*

A:案例演示

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

Collection中toArray(T[] a)泛型版的集合转数组

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Demo4_Aslist {
    public static void main(String[] args) {
//        demo1();
//        demo2();
        //集合转数组,加泛型的
        ArrayList list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        String[] arr = list.toArray(new String[10]);//当集合转换数组时,数组长度<=集合的size时,转换后的数组等于集合的size
        for (String string : arr) {            //如果数组的长度大于了size,分配的数组长度就和你指定的长度一样
            System.out.println(string);
        }    
    }

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

    private static void demo1() {
        String[] arr = {"a","b","c","d","e","f","g"};
        List list = Arrays.asList(arr);            //将数组转换成集合
        list.add("h");                                //不能添加
        System.out.println(list);
    }
}
19_集合嵌套之ArrayList嵌套ArrayList*

A:案例演示

集合嵌套之ArrayList嵌套ArrayList

案例

学科——分若干个班级

学科是一个大集合

若干个班级分为每一个小集合

import java.util.ArrayList;
import net.allidea.bean.Person;
public class List_6_ArrayList {
    public static void main(String[] args) {
        ArrayList> list = new ArrayList<>(); 
        ArrayList first = new ArrayList<>();            //创建第一个班级
        first.add(new Person("杨幂",30));
        first.add(new Person("胡歌",36));
        first.add(new Person("郭富城",50));
        first.add(new Person("周杰伦",38));
        
        ArrayList second = new ArrayList<>();
        second.add(new Person("黄晓明",31));
        second.add(new Person("赵薇",31));
        second.add(new Person("陈坤",31));
        
        //将班级添加到学科集合中
        list.add(first);
        list.add(second);
        
        //遍历学科集合
        for(ArrayList a : list) {
            for(Person p : a) {
                System.out.println(p);
            }
        }    
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77199.html

相关文章

  • Java编程基础18——集合(Set集合

    摘要:并把最终的随机数输出到控制台。方法,在集合中如何存储元素取决于方法的返回值返回,集合中只有一个元素。创建集合对象,传入比较器。 1_HashSet存储字符串并遍历 A:Set集合概述及特点 通过API查看即可 B:案例演示 HashSet存储字符串并遍历 import java.util.HashSet; public class Demo1_HashSet { p...

    SexySix 评论0 收藏0
  • Java编程基础34——JDBC&DBUtil

    摘要:不用自己来创建,而是通过池来获取对象使用完后,调用的方法也不会真的关闭,而是把归还给池连接池技术可以完成对象的再次利用接口为数据库连接池提供了公共的接口各个厂商需要让自己的连接池实现这个接口。 1.DButils工具类的介绍个三个核心类 A: 概述 DBUtils是java编程中的数据库操作实用工具,小巧简单实用。 DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少...

    svtter 评论0 收藏0
  • 我的阿里之路+Java面经考点

    摘要:我的是忙碌的一年,从年初备战实习春招,年三十都在死磕源码,三月份经历了阿里五次面试,四月顺利收到实习。因为我心理很清楚,我的目标是阿里。所以在收到阿里之后的那晚,我重新规划了接下来的学习计划,将我的短期目标更新成拿下阿里转正。 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金...

    姘搁『 评论0 收藏0
  • 【Python零基础到入门】Python基础语法篇——基本数据类型【文末送书】

    摘要:布尔值布尔值和布尔代数的表示完全一致,一个布尔值只有两种值的数据类型可以通过内置的函数查询,例如还可以用来判断和的区别在于不会认为子类是一种父类类型。会认为子类是一种父类类型。基本功能是进行成员关系测试和删除重复元素。 ...

    Winer 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<