Java集合的一些面试题思考

2 篇文章 0 订阅

1. HashMap根据Value对象的某个属性排序,原样Map结构输出。

  • 题目: 已知一个 HashMap<Integer,User>集合, User 有 name(String)和 age(int)属性。请写一个方法实现对HashMap 的排序功能,该方法接收 HashMap<Integer,User>为形参,返回类型为 HashMap<Integer,User>,要求对 HashMap 中的 User 的 age 倒序进行排序。排序时 key=value 键值对不得拆散。
  • 提示:要做出这道题必须对集合的体系结构非常的熟悉。HashMap 本身就是不可排序的,但是该道题偏偏让给HashMap 排序,那我们就得想在 API 中有没有这样的 Map 结构是有序的,LinkedHashMap,对的,就是他,他是
    Map 结构,也是链表结构,有序的,更可喜的是他是 HashMap 的子类,我们返回 LinkedHashMap<Integer,User>即可,还符合面向接口(父类编程的思想)。
    但凡是对集合的操作,我们应该保持一个原则就是能用 JDK 中的 API 就有 JDK 中的 API,比如排序算法我们不应
    该去用冒泡或者选择,而是首先想到用 Collections 集合工具类。
    结合ArrayList<>()的构建构造方法实现功能。
public static <T> void sort(List<T> list, Comparator<? super T> c) {
        list.sort(c);
    }
    
    
public ArrayList(Collection<? extends E> c) {
  ······
}

实现代码如下:


import java.util.*;

public class HashMapSortTest {
    public static void main(String[] args) {
        Map<Integer, User> map = new HashMap<>();
        map.put(1, new User(1, "zhangsan", 29));
        map.put(2, new User(2, "lisi", 18));
        map.put(3, new User(3, "wangwu", 22));
        map.put(4, new User(4, "zhaoliu", 33));
        System.out.println(map);
        HashMap<Integer, User> mmp = SortedMapMethod(map);
        System.out.println(mmp);
    }
    private static HashMap<Integer, User> SortedMapMethod(Map<Integer, User> map) {
        HashMap<Integer, User> mmp = new LinkedHashMap<>();
        List<Map.Entry<Integer, User>> list = new ArrayList<>(map.entrySet());
        Collections.sort(list, (o1, o2) -> o2.getValue().getAge() - o1.getValue().getAge());
        for (Map.Entry<Integer, User> entry : list) {
            mmp.put(entry.getKey(), entry.getValue());
        }
        return mmp;
    }
}

2. List a=new ArrayList()和 ArrayList a =new ArrayList()的区别?

List list = new ArrayList();这句创建了一个 ArrayList 的对象后把上溯到了 List。此时它是一个 List 对象了,有些ArrayList 有但是 List 没有的属性和方法,它就不能再用了。而 ArrayList list=new ArrayList();创建一对象则保留了ArrayList 的所有属性。 所以需要用到 ArrayList 独有的方法的时候不能用前者。实例代码如下:

1List list = new ArrayList();
2ArrayList arrayList = new ArrayList();
3.list.trimToSize(); //错误,没有该方法。
4.arrayList.trimToSize(); //ArrayList 里有该方法。

3. 请用两个队列模拟堆栈结构

两个队列模拟一个堆栈,队列是先进先出,而堆栈是先进后出。模拟如下
b
(1)入栈:a 队列为空,b 为空。例:则将”a,b,c,d,e”需要入栈的元素先放 a 中,a 进栈为”a,b,c,d,e”
(2)出栈:a 队列目前的元素为”a,b,c,d,e”。将 a 队列依次加入 Arraylist 集合 a 中。以倒序的方法,将 a 中的集
合取出,放入 b 队列中,再将 b 队列出列。

实现代码如下:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class QueueTest {
    //两个Queue队列 实现 模拟一个 堆栈的实现
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();    //a 队列, 队列怎么好像链表
        Queue<String> queue2 = new LinkedList<>();    // b 队列
        List<String> list = new ArrayList<>();
        queue.offer("aaa");
        queue.offer("bbb");
        queue.offer("ccc");
        queue.offer("ddd");
        queue.offer("eee");     //入栈
        for (String str : queue) {
            list.add(str);         //加入集合
            System.out.print(str + " ");
        }
        for (int i = list.size() - 1; i >= 0; i--) {
            queue2.offer(list.get(i));    // 倒叙入栈 queue2
        }
        System.out.println();
        for (String s :queue2) {
            System.out.print(s + " ");    //出栈打印
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值