【JavaOOP应用】1、集合类

1. 集合类

1.1 Java结合接口分层图

img

1.2 List集合

1.2.1 ArrayList 类与 Vector 类

ArrayList 特点:
1、有序,集合的顺序与存放的顺序一样
2、可以通过下标访问、可以放重复元素

1.2.1.1 ArrayList的基本用法
/**
 * 1、ArrayList的基本用法
 * 注意:
 *   ① 默认集合的长度为10个元素。
 *   ② 当容量不够时,会自动增长原来的一半,如:第一次增长就为15个长度,这样就实现了自动扩容。
 *   private void grow(int minCapacity) {
 *         // overflow-conscious code
 *         int oldCapacity = elementData.length;
 *         int newCapacity = oldCapacity + (oldCapacity >> 1);
 *         if (newCapacity - minCapacity < 0)
 *             newCapacity = minCapacity;
 *         if (newCapacity - MAX_ARRAY_SIZE > 0)
 *             newCapacity = hugeCapacity(minCapacity);
 *         // minCapacity is usually close to size, so this is a win:
 *         elementData = Arrays.copyOf(elementData, newCapacity);
 *     }
 */
@Test
public void test01(){
    // 1. 定义ArrayList对象
    List list = new ArrayList<>();

    // 2. 向list中添加数据
    list.add("abc");
    list.add("def");
    list.add(3.45);
    list.add(new Integer(123));
    List small = new ArrayList();
    small.add(true);
    small.add(true);
    small.add(true);
    small.add(true);
    small.add(true);
    small.add(true);
    small.add(true);
    list.addAll(small);         // 在大集合中放小集合

    //3. 实际查看长度
    int size = list.size();
    System.out.println("size = " + size);

    // 4. 删除指定元素
    // 4.1 根据内容删除单个元素
    list.remove(new Integer(123));
    // 4.2 根据下标删除元素
    list.remove(1);
    // 4.3 从大集合中删除小集合
    list.removeAll(small);
    System.out.println("list = " + list);

    // 5. 修改元素
    list.set(1,"welcome");          // 参数1:修改元素的下标  参数2:要修改的值
    System.out.println("list = " + list);

    // 6. 通过下标获取元素
    Object o = list.get(0);
    System.out.println("o = " + o);

    // 7. 遍历集合
    // 7.1 方法一:基本for循环
    for (int i = 0; i < list.size(); i++) {
        Object obj = list.get(i);
        System.out.println(obj);
    }
    System.out.println("---------------------------");
    // 7.2 方法二:增强for循环
    for (Object o1 : list) {
        System.out.println(o1);
    }
    System.out.println("---------------------------");
    // 7.3 方法三:迭代器完成
    Iterator iterator = list.iterator();
    while(iterator.hasNext()){
        Object next = iterator.next();
        System.out.println( next);
    }
    System.out.println("---------------------------");
    // 7.4 方法四:使用forEach函数
    list.forEach(new Consumer() {
        @Override
        public void accept(Object o) {
            System.out.println(o);
        }
    });
    System.out.println("---------------------------");
    list.forEach(a -> System.out.print(a + "\t"));
    System.out.println("\n---------------------------");
    list.forEach(System.out::println);
}

image-20240806191352505

1.2.1.2 ArrayList的泛型用法
/**
     * ArrayList的泛型用法
     */
@Test
public void test02(){
    // 1. 定义ArrayList集合
    List<Student> list = new ArrayList<>();
    // 2. 定义一组学生对象
    Student st1 = new Student(1001,"张三","男",20,"上海");
    Student st2 = new Student(1002,"李四","男",22,"西安");
    Student st3 = new Student(1003,"王五","女",21,"杭州");
    Student st4 = new Student(1004,"赵六","女",23,"广州");
    // 3. 添加到集合中
    list.add(st1);
    list.add(st2);
    list.add(st3);
    // 4. 打印学生
    list.forEach(System.out::println);
    System.out.println("-------------------------------");
    for (Student student : list) {
        System.out.println(student);
    }
    System.out.println("-------------------------------");
    // 5. 查看某个学生
    Student stud = list.get(1);
    System.out.println("stud = " + stud);
    // 6. 修改学生
    list.set(2,st4);
    System.out.println("-------------------------------");
    System.out.println("修改后 : " + list);
    // 7. 删除学生
    list.remove(st4);
    System.out.println("-------------------------------");
    System.out.println("删除后 : " + list);
}

image-20240806191608201

1.2.2 ArrayList 类与 Vector 类的区别

1、ArrayList 类是 JDK1.2 之后才出现的新类,而 Vector 则是 JDK1.0 之后就出现的老的集合类。
2、当容量不够时,Vector 容量会增加为原来的一倍,而 ArrayList 则会增加为原来的1/2。
3、Vector 是现成安全的,是同步的(synchronized),所以性能较低,而 ArrayList 则是异步的,所以性能较高。

1.2.3 LinkedList 类
/**
 * LinkedList集合
 */
@Test
public void test01(){
    LinkedList list = new LinkedList();
    list.add("abc");                // 向集合后面存放
    list.push(true);             // 将元素入栈(栈操作)
    list.addFirst("hello");      // 将元素放到集合的头部
    list.addLast("world");       // 添加元素到集合的尾部

    //Object pop = list.pop();        // 出栈(弹出栈顶元素)
    Object peek = list.peek();        // 查看栈顶元素

    System.out.println("peek = " + peek);
    // System.out.println("pop = " + pop);
    System.out.println("list = " + list);

    // 循环查看元素,查看一个就弹出一个
    while(!list.isEmpty()){
        Object pop = list.pop();        // 每次循环弹出一个元素
        System.out.println(pop);
    }
    int size = list.size();            // 最后查看元素个数为0
    System.out.println("size = " + size);
}

image-20240806192309643

1.2.4 ArrayList 与 LinkedList 集合的区别

1、ArrayList 集合底层使用的是数组实现的,而 LinkedList 底层使用的是链表实现的。
2、ArrayList 集合在对集合遍历和查找时,效率较高,而 LinkedList 在对集合进行添加或删除元素时,效率较高。

1.3 Set集合

TreeSet与HashSet集合:
1、前者是一个经过排了序的set
2、后者是一个未经过排序的set
3、两种集合都会自动去重,二者都是由JDK1.2才出现的集合类,都是线程异步的。

1.3.1 HashSet 集合
/**
 * 1. HashSet:数据无序
 */
@Test
public void test01(){
    // 1. 定义一个set集合
    Set<String> set = new HashSet<>();
    set.add("星期1");
    set.add("星期4");
    set.add("星期5");
    set.add("星期2");
    set.add("星期6");
    set.add("星期6");
    set.add("星期3");
    set.add("星期3");
    // 2. 遍历集合
    // 方法一:增强for循环
    for (String s : set) {
        System.out.println(s);
    }
    System.out.println("------------------------------");
    // 方法二:使用迭代器
    Iterator<String> iterator = set.iterator();
    while(iterator.hasNext()){
        String next = iterator.next();
        System.out.println(next);
    }
    System.out.println("------------------------------");
    // 方法三:使用foreach函数
    set.forEach(System.out::println);
    // 3. 删除元素
    set.remove("星期3");
    System.out.println("------------------------------");
    set.forEach(System.out::println);
    System.out.println("set = " + set);
}
1.3.2 TreeSet 集合
/**
     * 2、TreeSet集合用法
     * 特点:
     *   去重、经过排了序的set集合
     */
@Test
public void test02(){
    // 2.1 定义一个set集合
    Set<String> set = new TreeSet<>();
    // 2.2 将元素放到集合中
    set.add("星期1");
    set.add("星期4");
    set.add("星期5");
    set.add("星期2");
    set.add("星期6");
    set.add("星期6");
    set.add("星期3");
    set.add("星期3");
    // System.out.println("set = " + set);
    // 2.3 删除元素
    set.remove("星期3");
    System.out.println("删除元素后:");
    // 2.4 打印元素
    for (String s : set) {
        System.out.println(s);
    }
}

1.4 Map 集合

HashMap与Hashtable的区别:
1、二者都是key、value集合
2、前者是JDK1.2出现的,后者是JDK1.0出现的
3、前者是线程异步的,后者是线程同步的,安全的,性能较低。
4、前者是可以放null键与null值,后者不能放null键与null值。

1.4.1 HashMap 集合
/**
 * 1. HashMap用法
 */
@Test
public void test01(){
    // 1.1 定义一个HashMap集合
    Map<Integer, Student> studentMap = new HashMap<>();
    // 1.2 定义几个学生对象
    Student st1 = new Student(1001,"张三","男",20,"上海");
    Student st2 = new Student(1002,"李四","男",22,"西安");
    Student st3 = new Student(1003,"王五","女",21,"杭州");
    Student st4 = new Student(1004,"赵六","女",23,"广州");
    // 1.3 将学生放到map集合
    studentMap.put(st1.getSid(),st1);
    studentMap.put(st2.getSid(),st2);
    studentMap.put(st3.getSid(),st3);
    studentMap.put(null,null);              // 可以放null键和null值
    // 1.4 遍历数据:
    // 方法一:遍历key,通过key得到值
    Set<Integer> keySet = studentMap.keySet();
    for (Integer key : keySet) {
        Student student = studentMap.get(key);      // 通过key取值
        System.out.println(student);
    }
    System.out.println("-----------------------------------------");
    // 方法二:遍历值的集合
    Collection<Student> values = studentMap.values();
    for (Student value : values) {
        System.out.println(value);
    }
    System.out.println("-----------------------------------------");
    // 方法三:将key与value当作一个整体进行遍历
    Set<Map.Entry<Integer, Student>> entries = studentMap.entrySet();
    for (Map.Entry<Integer, Student> entry : entries) {
        Integer key = entry.getKey();
        Student value = entry.getValue();
        System.out.println(value);
    }
    System.out.println("-----------------------------------------");
    // 方法四:使用forEach函数遍历
    studentMap.forEach((k,v) -> {
        System.out.println(k + "====》" + v);
    });
    // 1.5 修改元素(相同的key,新值覆盖旧值)
    studentMap.put(st2.getSid(),st4);
    System.out.println("-----------------------------------------");
    System.out.println("修改后:");
    studentMap.forEach((k,v) -> System.out.println(k + "====》" + v));
    //1.6 删除元素
    studentMap.remove(1002);
    System.out.println("-----------------------------------------");
    System.out.println("删除后:");
    studentMap.forEach((k,v) -> System.out.println(k + "====》" + v));

    // 1.7 替换元素
    studentMap.replace(st2.getSid(),st4);
    System.out.println("-----------------------------------------");
    System.out.println("替换后:");
    studentMap.forEach((k,v) -> System.out.println(k + "====》" + v));
}
1.4.2 Hashtable 集合
/**
 * Hashtable的用法
 */
@Test
public void test03(){
    // 1.1 定义一个HashMap集合
    Hashtable<Integer, Student> studentMap = new Hashtable<>();
    // 1.2 定义几个学生对象
    Student st1 = new Student(1001,"张三","男",20,"上海");
    Student st2 = new Student(1002,"李四","男",22,"西安");
    Student st3 = new Student(1003,"王五","女",21,"杭州");
    Student st4 = new Student(1004,"赵六","女",23,"广州");
    // 1.3 将学生放到map集合
    studentMap.put(st1.getSid(),st1);
    studentMap.put(st2.getSid(),st2);
    studentMap.put(st3.getSid(),st3);
    studentMap.put(null,null);              // 不能放null键和null值
    // 1.4 遍历数据:
    // 方法一:遍历key,通过key得到值
    Set<Integer> keySet = studentMap.keySet();
    for (Integer key : keySet) {
        Student student = studentMap.get(key);      // 通过key取值
        System.out.println(student);
    }
    System.out.println("-----------------------------------------");
    // 方法二:遍历值的集合
    Collection<Student> values = studentMap.values();
    for (Student value : values) {
        System.out.println(value);
    }
    System.out.println("-----------------------------------------");
    // 方法三:将key与value当作一个整体进行遍历
    Set<Map.Entry<Integer, Student>> entries = studentMap.entrySet();
    for (Map.Entry<Integer, Student> entry : entries) {
        Integer key = entry.getKey();
        Student value = entry.getValue();
        System.out.println(value);
    }
    System.out.println("-----------------------------------------");
    // 方法四:使用forEach函数遍历
    studentMap.forEach((k,v) -> {
        System.out.println(k + "====》" + v);
    });
    // 方法四:使用枚举器遍历
    System.out.println("-----------------------------------------");
    Enumeration<Student> elements = studentMap.elements();
    while (elements.hasMoreElements()) {
        Student student = elements.nextElement();
        System.out.println(student);
    }
}
  • 18
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮生146

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值