各自努力,最高处见!加油!


集合(九)—— 集合练习题

  • 1、倒叙遍历、截取字符串
  • 2、Map类型对象的遍历、修改、与Set的关系
  • 3、试分析HashSet和TreeSet分别如何去重
  • 4、下面代码运行会不会抛出异常,并从源码层面说明原因。(读源码+接口编程+动态绑定)
  • 5、陷阱题


1、倒叙遍历、截取字符串

java中集合题目 java集合代码题_抛出异常


练习代码:

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

public class Homework1 {
    public static void main(String[] args) {
        News news1 = new News("新冠确诊病例超千万,数百万印度教信徒赴恒河“圣欲”引民众担忧");
        News news2 = new News("男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生");
        ArrayList arrayList = new ArrayList();
        arrayList.add(news1);
        arrayList.add(news2);

        //或者采用String类的substring(a,b);方法截取从a到b的元素(左闭右开)

        for (int i = arrayList.size()-1; i >= 0 ; i--) {
            News news=null;
            if (arrayList.get(i) instanceof News){
                news = (News)arrayList.get(i);
            }
            if (news!=null&&news.title.length()>15){
                char[] chars = news.title.toCharArray();
                for (int j=14;j<chars.length;j++){
                    if(j>14){
                        chars[j]=' ';
                    }else {
                        chars[j]='…';
                    }

                }
                System.out.println(chars);
            }else{
                System.out.println(news);
            }
//            System.out.println(news);
        }

    }
}

class News{
    String title;
    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 +
                '}';
    }
}

2、Map类型对象的遍历、修改、与Set的关系

java中集合题目 java集合代码题_java中集合题目_02

3、试分析HashSet和TreeSet分别如何去重

  1. HashSet去重机制:hashCode()+equals(),底层先通过存入对象,进行运算得到一个hash值,通过hash值得到对应的索引,如果发现table索引所在的位置,没有数据,就直接存放。如果有数据,就进行equals比较(遍历比较)。比较后,链表中没有相同的元素,就加入,否则不加入。
    注意:程序员可以通过重写equals方法,决定相同元素的判定机制。
  2. TreeSet去重机制:如果你传入一个Comparator匿名对象,就使用实现的Comparator去重。如果方法返回0,就认为是相同元素/数据,就不添加。如果你没有传入一个Comparator匿名对象,则以你添加的对象实现的Compareable接口的compareTo方法去重。

4、下面代码运行会不会抛出异常,并从源码层面说明原因。(读源码+接口编程+动态绑定)

TreeSet treeSet=new TreeSet();
treeSet.add(new Person());

java中集合题目 java集合代码题_java中集合题目_03


原因分析:因为在创建TreeSet对象的时候没有传入Comparator接口的匿名内部类,所以在底层Person转成Comparable类型没有成功,抛出异常。

java中集合题目 java集合代码题_抛出异常_04

解决方法:Person类继承Comparable类并实现compareTo方法。
问:上述代码中treeSet集合能加入多少个元素?
答:1个。
原因:在执行add方法时,会默认进入Person中的compareTo方法中进行比较,但在上述代码中compareTo方法返回0,代表后面加入的对象都是相同的对象,所以加入失败。

5、陷阱题

java中集合题目 java集合代码题_抛出异常_05


分析:

java中集合题目 java集合代码题_java中集合题目_06