集合常见问题总结下

简介: 《基础系列》

集合和数组的比较(为什么引入集合)

数组不是面向对象的,存在明显的缺陷,集合完全弥补了数组的一些缺点,比数组更灵活更实用,可大大提高软件的开发效率而且不同的集合框架类可适用于不同场合。具体如下:

1)数组的效率高于集合类.

2)数组能存放基本数据类型和对象,而集合类中只能放对象。

3)数组容量固定且无法动态改变,集合类容量动态改变。

4)数组无法判断其中实际存有多少元素,length只告诉了array的容量。

5)集合有多种实现方式和不同的适用场合,而不像数组仅采用顺序表方式。

6)集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。

200.Collection和Collections的区别

1)Collection是Java提供的集合接口,存储一组不唯一,无序的对象。它有两个子接口List和Set。

2)Java中还有一个Collections类,专门用来操作集合类 ,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。


下列说法正确的有()(选择一项)

A. LinkedList继承自List
B. AbstractSet继承自Set
C. HashSet继承自AbstractSet
D. TreeMap继承自HashMap

答案: C

分析:A:LinkedList实现List接口

B:AbstractSet实现Set接口

D:TreeMap继承AbstractMap


Java的HashMap和Hashtable有什么区别HashSet和HashMap有什么区别?使用这些结构保存的数需要重载的方法是哪些?

答:HashMap与Hashtable实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用

两者的主要区别如下

1、Hashtable是早期JDK提供的接口,HashMap是新版JDK提供的接口

2、Hashtable继承Dictionary类,HashMap实现Map接口

3、Hashtable线程安全,HashMap线程非安全

4、Hashtable不允许null值,HashMap允许null值

HashSet与HashMap的区别

1、HashSet底层是采用HashMap实现的。HashSet 的实现比较简单,HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的。

2、HashMap的key就是放进HashSet中对象,value是Object类型的。

3、当调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),该行的key就是向HashSet增加的那个对象,该行的value就是一个Object类型的常量


列出Java中的集合类层次结构?

答:Java中集合主要分为两种:Collection和Map。Collection是List和Set接口的父接口;ArrayList和LinkedList是List的实现类;HashSet和TreeSet是Set的实现类;LinkedHashSet是HashSet的子类。HashMap和TreeMap是Map的实现类;LinkedHashMap是HashMap的子类。

图中:虚线框中为接口,实线框中为类。

8.png


List,Set,Map各有什么特点

答:List 接口存储一组不唯一,有序(插入顺序)的对象。

Set 接口存储一组唯一,无序的对象。

Map接口存储一组键值对象,提供key到value的映射。key无序,唯一。value不要求有序,允许重复。(如果只使用key存储,而不使用value,那就是Set)。


ArrayList list=new ArrayList(20);中的list扩充几次()

A. 0
B. 1
C. 2
D. 3

答案:A

分析:已经指定了长度, 所以不扩容


List、Set、Map哪个继承自Collection接口,一下说法正确的是()

A. List Map
B. Set Map
C. List Set
D. List Map Set

答案:C

分析:Map接口继承了java.lang.Object类,但没有实现任何接口.


合并两个有序的链表


publicclassSolution {

publicListNode mergeTwoLists(ListNode l1, ListNode l2) {

if(l1 == null|| l2 == null) {

            returnl1 != null? l1 : l2;

        }

        ListNode head = l1.val < l2.val ? l1 : l2;

        ListNode other = l1.val >= l2.val ? l1 : l2;

        ListNode prevHead = head;

        ListNode prevOther = other;

        while(prevHead != null) {

            ListNode next = prevHead.next;

            if(next != null&& next.val > prevOther.val) {

                prevHead.next = prevOther;

                prevOther = next;

            }

            if(prevHead.next==null){

                prevHead.next=prevOther;

                break;

            }

            prevHead=prevHead.next;

        }

        returnhead;

}

}


用递归方式实现链表的转置。


/**

Definition for singly-linked list.

public class ListNode {

int val;

ListNode next;

ListNode(int x) { val = x; }

* }

*/

publicclassSolution {

publicListNode reverseList(ListNode head) {

if(head==null||head.next ==null)

            returnhead;

        ListNode prev = reverseList(head.next);

        head.next.next = head;

        head.next = null;

        returnprev;

}

}


给定一个不包含相同元素的整数集合,nums,返回所有可能的子集集合。解答中集合不能包含重复的子集。


publicclassSolution {

    publicList<List<Integer>> subsets (int[] nums) {

        List<List<Integer>> res = newArrayList<ArrayList<Integer>>();

        List<Integer> item = newArrayList<Integer>();

        if(nums.length == 0|| nums == null)

            returnres;

        Arrays.sort(nums); //排序

        dfs(nums, 0, item, res);  //递归调用

        res.add(newArrayList<Integer>());  //最后加上一个空集

        returnres;

    }

    publicstaticvoiddfs(int[] nums, intstart, List<Integer> item, List<List<Integer>> res){

        for(inti = start; i < nums.length; i ++){

            item.add(nums[i]);

            //item是以整数为元素的动态数组,而res是以数组为元素的数组,在这一步,当item增加完元素后,item所有元素构成一个完整的子串,再由res纳入

            res.add(newArrayList<Integer>(item));

            dfs(nums, i + 1, item, res);

            item.remove(item.size() - 1);

        }

    }

}


以下结构中,哪个具有同步功能()

A. HashMap
B. ConcurrentHashMap
C. WeakHashMap
D. TreeMap

答案:B

分析:

A,C,D都线程不安全,B线程安全,具有同步功能


以下结构中,插入性能最高的是()

A. ArrayList
B. Linkedlist
C. tor
D. Collection

答案:B

分析:

数组插入、删除效率差,排除A

tor不是java里面的数据结构,是一种网络路由技术;因此排除C

Collection 是集合的接口,不是某种数据结构;因此排除D


以下结构中,哪个最适合当作stack使用()

A. LinkedHashMap
B. LinkedHashSet
C. LinkedList

LinkedList

分析:

Stack是先进后出的线性结构;所以链表比较合适;不需要散列表的数据结构



下面的代码在绝大部分时间内都运行得很正常,请问什么情况下会出现问题?根源在哪里?


packagecom.bjsxt;

importjava.util.LinkedList;

publicclassStack {

LinkedList list = newLinkedList();

publicsynchronizedvoidpush(Object x) {

synchronized(list) {

list.addLast(x);

notify();

}

}

publicsynchronizedObject pop() throwsException{

synchronized(list){

if(list.size()<=0){

wait();

}

returnlist.removeLast( );

}

}

}

答:将if( list.size() <= 0 )改成:while( list.size() <= 0 )

相关文章
|
6月前
|
Java
Java集合操作示例
Java集合操作示例
64 0
|
6月前
|
存储 数据库 索引
Python新手常见问题一:列表、元组、集合、字典区别是什么?
本文针对Python编程新手常遇到的问题,详细阐述了列表(List)、元组(Tuple)、集合(Set)和字典(Dictionary)这四种数据结构的核心区别。列表是一种有序且可变的数据序列,允许元素重复;元组同样有序但不可变,其内容一旦创建就不能修改;集合是无序、不重复的元素集,强调唯一性,主要用于数学意义上的集合操作;而字典则是键值对的映射容器,其中键必须唯一,而值可以任意,它提供了一种通过键查找对应值的有效方式。通过对这些基本概念和特性的对比讲解,旨在帮助初学者更好地理解并运用这些数据类型来解决实际编程问题。
335 1
|
1月前
|
Python
字典是怎么创建的,支持的操作又是如何实现的?
字典是怎么创建的,支持的操作又是如何实现的?
51 8
|
5月前
|
存储 Java 索引
JavaSE——集合框架一(7/7)-Collection集合的总结、集合的并发修改异常问题(案例引入、for循环-解决方法、迭代器-解决方法、小结)
JavaSE——集合框架一(7/7)-Collection集合的总结、集合的并发修改异常问题(案例引入、for循环-解决方法、迭代器-解决方法、小结)
45 0
|
5月前
|
NoSQL 安全 MongoDB
精准数据清理:掌握 MongoDB 删除集合的方法与最佳实践
精准数据清理:掌握 MongoDB 删除集合的方法与最佳实践
193 0
|
5月前
|
Java 索引 容器
JavaSE——集合框架一(1/7)-集合体系概述(集合体系结构,Collection集合体系)、Collection的常用方法(介绍,实例演示,代码)
JavaSE——集合框架一(1/7)-集合体系概述(集合体系结构,Collection集合体系)、Collection的常用方法(介绍,实例演示,代码)
45 0
|
6月前
|
C#
C#学习相关系列之自定义遍历器
C#学习相关系列之自定义遍历器
|
6月前
|
安全
不可变集合的详细概述
1.不可变集合 1.1 什么是不可变集合 是一个长度不可变,内容也无法修改的集合 1.2 使用场景 如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践。 当集合对象被不可信的库调用时,不可变形式是安全的。
54 0
|
Java 测试技术 API
List集合避坑
在实际的业务开发中,我们通常会进行数组转List的操作,通常我们会使用Arrays.asList来进行转换 但是在转换基本类型的数组的时候,却出现转换的结果和我们想象的不一致。
104 0