Java笔记028-集合章节练习

Java笔记028-集合章节练习

  1. 编程题

按要求实现:

  1. 封装一个新闻类,包含标题和内容属性,提供get、set方法,重写toString方法,打印对象时只打印标题

  1. 只提供一个带参构造器,实例化对象时,只初始化标题,并且实例化两个对象:

新闻一:新冠确诊病例超过千万,数百万印度教信徒赴恒河“圣浴”引民众担忧

新闻二:男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生

  1. 将新闻对象添加到ArrayList集合中,并且进行倒叙遍历

  1. 在遍历集合过程中,对新闻标题进行处理,超过15字的只保留前15个,然后在后边加“...”

  1. 在控制台打印遍历出经过处理的新闻标题

package com14.exercise;

import java.util.ArrayList;

/**
 * @author 甲柒
 * @version 1.0
 * @title exercise01
 * @package com14.exercise
 * @time 2023/2/27 21:07
 */
@SuppressWarnings({"all"})
public class exercise01 {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add(new News("新冠确诊病例超过千万,数百万印度教信徒赴恒河“圣浴”引民众担忧"));
        arrayList.add(new News("男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生"));

        int size = arrayList.size();
        for (int i = size - 1; i >= 0; i--) {
//            System.out.println(arrayList.get(i));
            News news = (News) arrayList.get(i);
            System.out.println(processTitle(news.getTitle()));
        }
    }

    //专门写一个方法,处理显示新闻标题 process处理
    public static String processTitle(String title) {
        if (title == null) {
            return "";
        }
        if (title.length() > 15) {
            return title.substring(0, 15) + "...";//[0, 15)
        } else {
            return title;
        }
    }
}

/**
 * 按要求实现:
 * 1. 封装一个新闻类,包含标题和内容属性,提供get、set方法,重写toString方法,打印对象时只打印标题
 * 2. 只提供一个带参构造器,实例化对象时,只初始化标题,并且实例化两个对象:
 * 新闻一:新冠确诊病例超过千万,数百万印度教信徒赴恒河“圣浴”引民众担忧
 * 新闻二:男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生
 * 3. 将新闻对象添加到ArrayList集合中,并且进行倒叙遍历
 * 4. 在遍历集合过程中,对新闻标题进行处理,超过15字的只保留前15个,然后在后边加“...”
 * 5. 在控制台打印遍历出经过处理的新闻标题
 */
class News {
    private String title;
    private String content;

    public News(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "News{" +
                "title='" + title + '\'' +
                '}';
    }
}
  1. 编程题

使用ArrayList完成对 对象Car{name, price}的各种操作

  1. add:添加单个元素

  1. remove:删除指定元素

  1. contains:查找元素是否存在

  1. size:获取元素个数

  1. isEmpty:判断是否为null

  1. clear:清空

  1. addAll:添加多个元素

  1. containsAll:查找多个元素是否都存在

  1. removeAll:删除多个元素

使用增强for和迭代器来遍历所有的car,需要重写Car的toString方法

package com14.exercise;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * @author 甲柒
 * @version 1.0
 * @title Exercise02
 * @package com14.exercise
 * @time 2023/2/27 21:28
 */
@SuppressWarnings({"all"})
public class Exercise02 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        Car car = new Car("宝马", 400000);
        Car car1 = new Car("宾利", 5000000);
//        使用ArrayList完成对 对象Car{name, price}的各种操作
//        1. add:添加单个元素
        list.add(car);
        list.add(car1);
        System.out.println(list);
//        2. remove:删除指定元素
        list.remove(car);
        System.out.println(list);
//        3. contains:查找元素是否存在
        System.out.println(list.contains(car));//false
//        4. size:获取元素个数
        System.out.println(list.size());//1
//        5. isEmpty:判断是否为null
        System.out.println(list.isEmpty());//false
//        6. clear:清空
//        list.clear();
        System.out.println(list);//null
//        7. addAll:添加多个元素
        list.addAll(list);
        System.out.println(list);//2个宾利
//        8. containsAll:查找多个元素是否都存在
        System.out.println(list.containsAll(list));//true
//        9. removeAll:删除多个元素
//        list.removeAll(list);//相当于清空
        System.out.println(list);
//        使用增强for和迭代器来遍历所有的car,需要重写Car的toString方法
        for (Object o : list) {
            System.out.println(o);
        }

        //迭代器
        System.out.println("+++++++迭代器++++++");
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);
        }
    }
}

/**
 * 使用ArrayList完成对 对象Car{name, price}的各种操作
 * 1. add:添加单个元素
 * 2. remove:删除指定元素
 * 3. contains:查找元素是否存在
 * 4. size:获取元素个数
 * 5. isEmpty:判断是否为null
 * 6. clear:清空
 * 7. addAll:添加多个元素
 * 8. containsAll:查找多个元素是否都存在
 * 9. removeAll:删除多个元素
 * 使用增强for和迭代器来遍历所有的car,需要重写Car的toString方法
 */
class Car {
    private String name;
    private double price;

    public Car(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}
  1. 编程题

按要求完成下列任务

  1. 使用HashMap类实例化一个Map类型的对象m,键(String)和值(int)分别用于存储员工的姓名和工资,存入数据如下:jack——650¥;tom——1200¥;smith——2900¥

  1. 将jack的工资更改为2600¥

  1. 为所有员工工资加薪100¥

  1. 遍历集合中所有的员工

  1. 遍历集合中所有的工资

package com14.exercise;

import java.util.*;

/**
 * @author 甲柒
 * @version 1.0
 * @title Exercise03
 * @package com14.exercise
 * @time 2023/2/27 21:57
 */
@SuppressWarnings({"all"})
public class Exercise03 {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("jack", 650);//int->Integer
        map.put("tom", 1200);//int->Integer
        map.put("smith", 2900);//int->Integer
        System.out.println(map);
        map.replace("jack", 2600);//替换
        System.out.println(map);
//        为所有员工工资加薪100¥
        Set keySet = map.keySet();
        for (Object o : keySet) {
            //更新
            map.put(o, (Integer) map.get(o) + 100);
        }
        System.out.println(map);
        //遍历集合中所有的员工
        //entrySet
        System.out.println("====遍历集合中所有的员工====");
        Set entrySet = map.entrySet();
        //迭代器
        Iterator iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            Map.Entry next = (Map.Entry) iterator.next();
            System.out.println(next.getKey());
        }

        //遍历集合中所有的工资
        System.out.println("=====遍历所有的工资=====");
        Collection values = map.values();
        for (Object o : values) {
            System.out.println("工资=" + o);
        }

    }
}
/**
 * 按要求完成下列任务
 * 1. 使用HashMap类实例化一个Map类型的对象m,
 * 键(String)和值(int)分别用于存储员工的姓名和工资,
 * 存入数据如下:jack——650¥;tom——1200¥;smith——2900¥
 * 2. 将jack的工资更改为2600¥
 * 3. 为所有员工工资加薪100¥
 * 4. 遍历集合中所有的员工
 * 5. 遍历集合中所有的工资
 */
  1. 简答题

试分析HashSet和TreeSet分别如何实现去重

  1. HashSet的去重机制:hashCode() + equals(),底层先通过存入对象,进行运算得到一个hash值,通过hash值得到对应的索引,如果发现table索引所在的位置,没有数据,就直接存放,如果有数据,就进行equals比较[遍历比较],如果比较后,不相同,就加入,否则就不加入。

  1. TreeSet的去重机制:如果你传入了一个数据Comparator匿名对象,就使用实现的compare去重,如果方法返回0,就认为是相同的元素/数据,就不添加,如果你没有传入一个Comparator匿名对象,则以你添加的对象实现的Comparable接口的compareTo去重。

package com14.exercise;

import java.util.TreeSet;

/**
 * @author 甲柒
 * @version 1.0
 * @title Exercise04
 * @package com14.exercise
 * @time 2023/2/28 19:11
 */
public class Exercise04 {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        treeSet.add("甲柒");
        treeSet.add("tom");
        treeSet.add("king");
        treeSet.add("甲柒");//加入不了
        System.out.println(treeSet);

    }
}
  1. 代码分析题

下面代码会不会抛出异常,并从源码层面说明原因。[考察 读源码+接口编程+动态绑定]

package com14.exercise;

import java.util.TreeSet;

/**
 * @author 甲柒
 * @version 1.0
 * @title Exercise05
 * @package com14.exercise
 * @time 2023/2/28 19:36
 */
@SuppressWarnings({"all"})
public class Exercise05 {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        //分析源码
        //add方法,因为TreeSet()构造器没有传入Comparator接口的匿名内部类
        //所以把底层Comparable<? super K> K = (Comparable<? super K>) key;
        //即 把Person转成Comparable
        treeSet.add(new Person());//ClassCastException
    }
}

class Person {
}
//解决方法
//class Person implements Comparable {
//
//    @Override
//    public int compareTo(Object o) {
//        return 0;
//    }
//}
  1. 下面的代码输出什么

已知:Person类按照id和name重写了hashCode和equals方法,问下面代码输出什么

package com14.exercise;

import java.util.HashSet;
import java.util.Objects;

/**
 * @author 甲柒
 * @version 1.0
 * @title Exercise06
 * @package com14.exercise
 * @time 2023/2/28 19:50
 */
@SuppressWarnings({"all"})
public class Exercise06 {
    public static void main(String[] args) {
        HashSet set = new HashSet();//ok
        Person06 p1 = new Person06(1001, "AA");//ok
        Person06 p2 = new Person06(1002, "BB");//ok
        set.add(p1);//ok
        set.add(p2);//ok
        p1.name = "CC";
        set.remove(p1);
        System.out.println(set);
        set.add(new Person06(1001, "CC"));
        System.out.println(set);
        set.add(new Person06(1001, "AA"));
        System.out.println(set);
    }
}

class Person06 {
    public int id;
    public String name;

    public Person06(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person06 person06 = (Person06) o;
        return id == person06.id && Objects.equals(name, person06.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    @Override
    public String toString() {
        return "Person06{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
  1. 试写出Vector和ArrayList的比较

底层结构

版本

线程安全(同步)效率

扩容倍数

ArrayList

可变数组

JDK1.2

不安全,效率高

如果使用有参构造器按照1.5倍扩容

使用无参构造器

第一次扩容10

从第二次开始扩容按照1.5倍

Vector

可变数组Object[]

JDK1.0

安全,效率不高

如果是无参,默认10,满后按照2倍扩容

如果是指定大小创建Vector,则每次按照2倍扩容

猜你喜欢

转载自blog.csdn.net/qq_59621600/article/details/129249745