韩顺平Java32——集合Homework

集合Homework

1.

package collection.homework;

import java.util.ArrayList;
import java.util.Collections;

/**
 * @author 紫英
 * @version 1.0
 * @discription
 */
public class Homework01 {
    public static void main(String[] args) {
        News news01 = new News("新冠确诊病例超千万,数百万印度教信徒赴恒河“圣浴”引民众担忧");//\"圣浴\"或者用中文的”“
        News news02 = new News("男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生");
        ArrayList list = new ArrayList();
        list.add(news01);
        list.add(news02);
        Collections.reverse(list);
        //也可以如下,因为如果没必要不要轻易改变数组
        /*老师方法:
        for(int i = list.size()-1;i>=0;i--){
        News news = (News) list.get(i);
                System.out.println(proTitle(news.getTitle()))
        }
         */
        for (Object o : list) {
            News n = (News) o;
            //下面的if语句可以封装成方法
            if ((n.getTitle().length()) > 15) {
                System.out.println(n.getTitle().substring(0, 15) + "...");//substring获取指定索引的字符串
            }
//            System.out.println(proTitle(((News) o).getTitle()));
        }
    }

//    public static String proTitle(String title) {
//        if (title == null) return "";
//        if ((title.length()) > 15) {
//            title = title.substring(0, 15) + "...";//substring获取指定索引的字符串
//        }
//        return title;
//    }
}

class News {
    private String title;
    private String content;

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

    @Override
    public String toString() {
        return "News——" +
                "新闻标题:" + 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;
    }
}

2.

 

package collection.homework;

import java.util.ArrayList;

/**
 * @author 紫英
 * @version 1.0
 * @discription
 */
public class Homework02 {
    public static void main(String[] args) {
        Car car = new Car("宝马",400000);
        Car car2 = new Car("宾利",5000000);
        ArrayList list = new ArrayList();
        list.add(car);
        list.add(car2);
        System.out.println(list);
//        list.remove(car2);
        System.out.println(list.contains(car2));
        System.out.println(list.isEmpty());
        list.addAll(list);
        System.out.println(list.containsAll(list));
        for (Object o : list) {
            System.out.println(o);
        }

    }
}

class Car {
    private String name;
    private int price;

    @Override
    public String toString() {
        return "Car{" +
                "name:'" + name + '\'' +
                ", price:" + price +
                '}';
    }

    public String getName() {
        return name;
    }

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

    public int getPrice() {
        return price;
    }

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

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

 

3.

 

 

 

package collection.homework;

import java.util.*;

/**
 * @author 紫英
 * @version 1.0
 * @discription
 */
public class Homework03 {

    public static void main(String[] args) {
        Map m = new HashMap();
        m.put("jack", 650);
        m.put("tom", 1200);
        m.put("smith", 2900);
        m.put("jack", 2600);
        Set set = m.keySet();
        Collection values = m.values();
        for (Object key : set) {
            m.put(key, (Integer) m.get(key) + 100);//注意转换成Interger
        }
        System.out.println("======遍历员工:=====");
        for (Object key : set) {
            System.out.println(key + ":" + m.get(key) + "元");
        }
        System.out.println("======遍历员工(迭代器):=====");
        Set entrySet = m.entrySet();
        Iterator iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            Object o = iterator.next();
            Map.Entry map = (Map.Entry) o;
            System.out.println(map.getKey() + ":" + map.getValue() + "元");

        }
        System.out.println("======遍历工资:=====");
        for (Object value : values) {
            System.out.println(value + "元");
        }
    }
}

 

4.简答题:HashSet和TreeSet分别如何实现去重?

  • (1)HashSet的去重机制:

使用hashcode()+equals(),底层先传入(key)对象,通过运算得到对应的hash()值,再通过hash()值得到对应的数组索引,如果发现该索引位置没有数据,就直接存入,如果有数据,就进行equals()比较。注意是对该索引处的所有元素遍历比较(链表),而且使用的是传入对象(自身)对应的equals()方法。比较之后,如果都不相同,就挂载到最后,如果有相同的就替换value值(PERSENT),key不加入,因为是set,所以相当于不加入。

  • (2)TreeSet去重机制

如果在创建构造器的时候传入了comparator对象,则按照自定义的comparor方法去重——如果方法返回0就判定为相同元素不予添加。如果没有传入比较器对象,则按照传入对象实现的Comparable接口的compareTo方法进行去重。(这里体现了接口的多态——接口类型的变量可以指向实现了该接口的对象实例

Comparable<? super K> k = (Comparable<? super K>) key;

 

5.

 

 

 

public class Test {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        treeSet.add(new Person());
    }

}

class Person{}

  分析:因为在创建构造器的时候,使用的是无参构造器,没有传入比较器所以就会走如题4的那条语句,然后发现Person类并没有实现

Comparable接口,导致抛出类型转换异常,如果只是想编译不报错的话可以让Person实现Comparable接口。
class Person implements Comparable{
    @Override
    public int compareTo(@NotNull Object o) {
        return 0;
    }
}

但是这样的话永远 return 0; 也就是说只能添加一个对象,想要更丰富就看情况自己写。

 

6.

 

 

 

package test;

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

public class Test {
    public static void main(String[] args) {
        HashSet set = new HashSet();
        Person p1 = new Person(1001,"AA");
        Person p2 = new Person(1002,"BB");
        set.add(p1);
        set.add(p2);
        p1.name = "CC";
        set.remove(p1);//这里的remove是按照原先存进去的hash()值来计算的,这时name改变导致删除失败,返回的是false
        System.out.println(set);//false
        set.add(new Person(1001,"CC"));//1002BB 1001CC
        System.out.println(set);//1002BB 1001CC 1001CC
        set.add(new Person(1001,"AA"));
        System.out.println(set);//1002BB 1001CC 1001CC 1001AA
    }

}

class Person {
    int id;
    String name;

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return id == person.id && Objects.equals(name, person.name);
    }

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

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

 

7.Vector与ArrayList的比较

 

 另外Vector的一个构造器可以指定扩容大小

 

posted @ 2022-01-22 15:42  紫英626  阅读(29)  评论(0编辑  收藏  举报

紫英