Java面试题03

1.Java容器都有哪些

        Java提供了丰富的容器类,包括Collection接口的实现类(如List、Set等)和Map接口的实现类(如HashMap、TreeMap等),它们分别用于存储不同类型的元素和键值对。

Java容器主要分为两种类型:Java集合容器和Java Web容器。

1.1 Java集合容器

Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有三种子类型,List、Set 和 Queue,实现了这些接口的容器类可以用来存储数据。

1.1.1 List(如 ArrayList、LinkedList):List 是有序集合,会按照元素插入的顺序保存元素。并且它允许包含重复元素。
1.1.2 Set(如 HashSet、TreeSet):Set 是一种不包含重复的元素的集合。它最多包含一个 null 元素。
1.1.3 Queue(如 PriorityQueue、ArrayDeque):Queue 是一种特殊的线性表,只允许在列表的前端(front)进行删除操作,而在列表的尾端(rear)进行插入操作。
1.1.4 Map(如 HashMap、TreeMap):Map 是一种对象,它存储的是键/值对。键和值都是对象。在 Map 中键是不能重复的,但是值可以。

1.2 Java Web容器

Java Web容器,或者说Servlet容器,是一种运行Web应用的地方,它为Web应用提供运行环境。目前流行的Java Web容器有:Tomcat、Jetty、GlassFish等。

2.Collection 和 Collections 有什么区别?

Collection是Java集合框架的根接口,定义了基本的集合操作方法,如添加、删除、遍历 等。Collections是一个包含静态方法的工具类,提供了一些集合操作的实用方法,如排序、查找 等

Collection 和 Collections 都是Java集合框架中的一部分,但是它们之间有一些重要的区别。

  1. 类型:Collection 是集合类的上层接口,它是一个单数形式的集合;而 Collections 是一个帮助类,它是集合框架的“外包装”,用于存储并处理集合。
  2. 功能:Collections 类包含一些对集合的排序、搜索以及序列化的操作。它是一个包装类,可以用来对集合进行各种操作,例如排序、搜索等。而 Collection 接口是Set接口和List接口的父接口,它定义了一些基本的操作,例如添加、删除元素等。

总结来说,Collection 和 Collections 的主要区别在于类型和功能。Collection 是集合的接口,定义了集合的基本操作;而 Collections 是帮助类,提供了对集合进行排序、搜索和序列化等操作的方法。

3.List、Set、Map 之间的区别是什么?

List是有序集合,允许存储重复元素,可以通过索引访问元素;Set是无序集合,不允许存储重复元素;Map是键值对的映射,每个键都唯一对应一个值。

List、Set、Map 是Java中常用的三种集合类型,它们之间有一些区别:

  1. 结构特点:List 和 Set 是存储单列数据的集合,Map 是存储键和值这样的双列数据的集合。
  2. 元素重复性:List允许有重复的元素;Set不允许元素重复;Map允许有重复键,但不允许有重复的键值对。
  3. 元素有序性:List及其所有实现类保持了每个元素的插入顺序;Set中的元素都是无序的;Map中的元素也是无序的。

4.HashMap 和 Hashtable 有什么区别?

HashMap是非线程安全的,允许有null键和值,效率较高;Hashtable是线程安全的,不允 许有null键和值,效率相对较低。

HashMap 和 Hashtable 都是Java中的Map接口的两种实现,它们之间有以下区别:

  1. 性能:,如果只是要获取一个键对应的值,无论是HashMap还是Hashtable,性能都是O(1)。但在插入或删除操作时,由于Hashtable需要创建新的键值对,而HashMap不需要(如果键已存在),因此在这方面,HashMap的性能可能会稍微优于Hashtable。
  2. 线程安全性:Hashtable 是线程安全的,而 HashMap 不是线程安全的。
  3. Null key and null value:HashMap允许使用null作为键和值,而Hashtable不允许使用null作为键或值。
  4. Size and iteration time:Hashtable和HashMap都使用哈希表(hash table)实现,但是Hashtable的size和迭代时间都是固定的,而HashMap的size和迭代时间是不固定的。

HashMap 和 Hashtable 都是 Java 中用于存储 Key-Value 对的集合,但是它们之间存在几个主要的区别:

  1. 线程安全性Hashtable 是线程安全的,它在每个公开的方法(例如 getputremove 等)上都有同步控制,这意味着在多线程环境下,你可以安全地使用 Hashtable。相反,HashMap 不是线程安全的,如果在多线程环境下使用,需要自己处理同步问题。
  2. 性能:因为 Hashtable 在每个方法上都有同步控制,所以它的性能会比 HashMap 低。在单线程环境下,HashMap 的性能通常会比 Hashtable 高得多。
  3. 允许的 key 值HashMap 允许使用 null 作为 key,而 Hashtable 不允许。
  4. 遍历Hashtable 继承自 Dictionary 类,因此可以使用 Enumeration 来遍历键和值。而 HashMap 继承自 AbstractMap 类,使用 Iterator 来遍历。
  5. 初始容量和负载因子HashMap 在创建时没有设定初始容量和负载因子,但这两个参数在 Hashtable 中是必需的。
  6. NullPointerException:Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;HashTable键值对都不能为空,否则包空指针异常。
  7. 方法返回值:如果尝试获取不存在的 key 的值,HashMap 中的 get() 方法返回 null,而 Hashtable 返回 nullKey()
  8. 遍历顺序HashMap 不保证映射的顺序,特别是它不保证该顺序恒久不变。相比之下,Hashtable 的顺序是固定的,因为它的迭代器按照键的插入顺序进行迭代。

总的来说,如果你在多线程环境下工作并且需要一个线程安全的映射,那么应该使用 Hashtable。如果你在单线程环境下工作并且需要高性能,那么应该使用 HashMap

5.如何决定使用 HashMap 还是 TreeMap?

如果需要无序、高效的键值对存储,可使用HashMap;如果需要按键有序存储,可使用 TreeMap,它会根据键的自然顺序或指定的比较器进行排序

  1. 数据结构:HashMap 是基于哈希表实现的,而 TreeMap 是基于红黑树(一种自平衡二叉查找树)实现的。
  2. 性能:在单线程环境下,HashMap 的性能通常优于 TreeMap,因为 HashMap 的 get 和 put 操作的时间复杂度为 O(1),而 TreeMap 的 get 和 put 操作的时间复杂度为 O(log n)。但在多线程环境下,TreeMap 的性能可能更优,因为它支持对数据的并发访问。
  3. Null keys and null values:HashMap 允许使用 null 作为键(key)和值(value),而 TreeMap 不允许使用 null 作为键(key),但可以使用 null 作为值(value)。
  4. Order:TreeMap 中的元素是有序的,即按照键(key)的升序排序。因此,如果你需要有序的数据结构,应该选择 TreeMap。而 HashMap 不保证元素的顺序。
  5. Size:如果需要存储大量的数据并且需要快速查找,HashMap 可能是更好的选择,因为它的空间复杂度为 O(n),而 TreeMap 的空间复杂度为 O(n log n)。
  6. 线程安全:HashMap 不是线程安全的,而 TreeMap 是线程安全的。如果多个线程同时修改 TreeMap,它仍然保持一致性和线程安全。

6.说一下 HashMap 的实现原理?

HashMap基于哈希表实现,内部使用一个数组来存储Entry对象,通过键的哈希码确定数组 位置,当多个键映射到同一个位置时,使用链表或红黑树解决冲突。

HashMap 是 Java 集合框架中的重要组成部分,它基于哈希表(Hash table)实现。以下是 HashMap 的基本实现原理:

  1. 基本数据结构:HashMap 的内部主要由数组实现,这个数组的元素是链表或红黑树(从 Java 8 开始)的实例。链表用于解决哈希冲突,红黑树则用于当链表长度过长(超过一定阈值)时,将链表转化为红黑树以提高性能。
  2. 哈希函数:HashMap 使用哈希函数(hash function)将键(key)映射到数组的索引位置。哈希函数的设计对 HashMap 的性能至关重要。理想情况下,哈希函数应当将键均匀地映射到数组的各个位置,从而最大限度地减少哈希冲突。
  3. 哈希冲突:尽管我们希望哈希函数能将键均匀地映射到数组的各个位置,但实际情况中,不同的键可能会被映射到相同的位置,这就是所谓的哈希冲突。HashMap 使用链表或红黑树来解决哈希冲突。当两个或更多的键哈希到同一位置时,它们在链表或红黑树中相遇并解决冲突。
  4. 扩容与再哈希:当 HashMap 中的元素数量达到一定的阈值(默认为数组长度的 0.75 倍)时,HashMap 会进行扩容(rehashing)。扩容会导致所有元素重新计算哈希值并重新放置到新的数组中。这是一个比较耗时的操作,因此,合理设定初始容量可以减少扩容的频率,从而提高 HashMap 的性能。
  5. 遍历:HashMap 提供了遍历所有元素的方法,如 keySet() 和 values()。在遍历过程中,HashMap 会按照其内部数据结构的顺序返回元素,但这个顺序并不是按照插入顺序或者访问顺序,而是根据哈希值确定的。

以上就是 HashMap 的基本实现原理。需要注意的是,由于 HashMap 的内部实现细节可能会因 Java 版本的不同而有所差异,因此在实际使用中,应当根据具体情况选择合适的数据结构和参数设置。

7.说一下 HashSet 的实现原理

HashSet基于HashMap实现,它实际上是在HashMap的键部分存储元素,而值部分存储一 个常量。

  1. 数据结构:HashSet 底层实际上是一个 HashMap,它使用一个数组来存储元素,这个数组的每个元素都是一个链表。
  2. 元素存储:HashSet 中的元素都存储在 HashMap 的 key 上,而 value 则是一个固定的对象(private static final Object PRESENT = new Object())。这是因为 HashSet 不允许有重复元素,所以所有的元素都是通过唯一的 key 来标识的。
  3. 添加元素:当我们调用 add 方法时,实际上是调用了底层 HashMap 的 put 方法。如果 key 已经存在,put 方法会修改对应的 value;如果 key 不存在,put 方法会插入新的 key-value 对应关系。
  4. 迭代顺序:HashSet 不保证元素的迭代顺序,特别是不保证该顺序恒久不变。这是因为 HashMap 的实现中,链表元素的顺序并不是按照插入顺序或者访问顺序排列的,而是根据 key 的哈希值确定的。
  5. Null 元素:HashSet 允许使用 null 作为元素。

总的来说,HashSet 的实现充分利用了 HashMap 的特性,通过将元素作为 HashMap 的 key 来存储,并利用哈希表的高效查找特性来实现元素的快速添加和查找。同时,由于 HashMap 中 value 的设计,使得 HashSet 不需要担心重复元素的插入问题。

8.ArrayList 和 LinkedList 的区别是什么?

ArrayList是基于动态数组实现,通过索引访问元素速度快,插入和删除元素较慢; LinkedList是基于双向链表实现,插入和删除元素速度快,但访问元素较慢

ArrayList 和 LinkedList 是 Java 中两种常用的 List 类型,它们在内部实现方式和使用场景上存在一些重要的区别:

  1. 底层实现:ArrayList 是基于动态数组实现的,而 LinkedList 是基于双向链表实现的。
  2. 内存空间:对于 ArrayList,当元素数量超过数组默认的大小(例如,对于 int 类型,默认为10)时,ArrayList 会自动进行扩容,可能涉及到内存空间的连续申请和复制,因此对于大量数据的随机访问效率较高。对于 LinkedList,每个节点都会存储前一个和后一个节点的引用,所以内存空间利用率相对较低,但是它在插入和删除元素时的效率较高。
  3. 插入和删除:由于 ArrayList 基于数组实现,因此在列表的中间位置插入和删除元素效率较低,因为可能需要移动大量的元素。而 LinkedList 在列表的中间位置插入和删除元素效率较高,因为它只需更改一些节点的引用即可。
  4. 遍历:两者的遍历速度都很快,因为它们都支持 for-each 循环。但是,如果需要逆序遍历,LinkedList 的效率会更高。
  5. 容量增长:当 ArrayList 的元素数量超过其容量时,它通常会创建一个新的数组并复制原有的元素到新的数组中。这个过程可能会导致性能下降。LinkedList 则不需要这样做,因此在大规模数据操作时,LinkedList 可能更优。
  6. 线程安全性:两者都不是线程安全的。如果多个线程同时修改 ArrayList 或 LinkedList,可能会导致数据不一致。如果需要线程安全,可以考虑使用 CopyOnWriteArrayList 或者使用并发库中的 ConcurrentLinkedQueue。
  7. 应用场景:ArrayList 更适合查询操作(即查找、获取),因为其基于数组实现,随机访问效率高。LinkedList 更适合插入和删除操作,因为其基于链表实现,插入和删除效率高。

总的来说,选择 ArrayList 还是 LinkedList 取决于你的具体需求和使用场景。如果你需要频繁地访问元素,那么 ArrayList 可能是更好的选择。如果你需要频繁地插入和删除元素,那么 LinkedList 可能更适合你。

9.如何实现数组和 List 之间的转换?

可以使用Arrays.asList()方法将数组转换为List,或者使用ArrayList的构造函数将List转换为 数组。

1. 数组转 List:

你可以使用 Arrays.asList() 方法将数组转换为 List。例如:

String[] array = {"a", "b", "c"};
List<String> list = Arrays.asList(array);

需要注意的是,通过 Arrays.asList() 返回的 List 是一个固定大小的 List,它直接引用原数组,所以原数组改变时,这个 List 也会跟着改变。它并不是一个可改变的 List。

如果你需要一个可以修改的 List,可以使用 ArrayList 的构造方法:

String[] array = {"a", "b", "c"};
List<String> list = new ArrayList<>(Arrays.asList(array));

这样得到的 List 就可以被修改,并且不会影响原数组。

2. List 转数组:

你可以使用 List.toArray() 方法将 List 转换为数组。例如:

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
String[] array = new String[list.size()];
list.toArray(array);

在这个例子中,我们首先创建了一个大小为 List 大小的数组,然后调用 List.toArray() 方法将 List 的元素填入数组。需要注意的是,这里数组的大小必须和 List 的大小一样,否则会抛出 ArrayStoreException

10.ArrayList 和 Vector 的区别是什么?

ArrayList 和 Vector 是 Java 中两种常用的动态数组实现,它们都实现了 List 接口,但在使用和特性上有一些区别:

  1. 同步性(Synchronization):这是 ArrayList 和 Vector 最主要的区别。Vector 是同步的,这意味着它是线程安全的,但这也意味着在单线程环境下,由于线程同步的开销,它的性能可能比非同步的 ArrayList 要低。而 ArrayList 是非同步的,它在单线程环境下可以提供更高的性能。
  2. 性能:由于同步性,ArrayList 在单线程环境下的性能通常优于 Vector。但是,如果你需要线程安全,并且性能不是关键因素,那么 Vector 也可以是一个选择。
  3. 初始化容量和增长:当创建 ArrayList 或 Vector 时,你可以指定初始容量。Vector 的初始容量是固定的,而 ArrayList 的初始容量可以改变。当 ArrayList 的元素数量超过其容量时,它会自动进行扩容。
  4. 使用场景:ArrayList 和 Vector 都可以用于存储和操作数组的元素,但它们的适用场景不完全相同。如果你需要一个可以快速、随机访问的列表,并且不需要考虑线程安全问题,那么 ArrayList 是一个更好的选择。如果你需要一个线程安全的列表,或者需要存储大量的数据并且希望内存使用效率更高,那么 Vector 可能更适合你。
  5. 遗留与现代:Vector 被认为是较旧的数据结构,现在较少使用。ArrayList 是一个更现代的选择,被认为更灵活、更强大、更易于使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 小波自适应阈值去噪

1、内容简介 略 12-可以交流、咨询、答疑 小波自适应阈值去噪 2、内容说明 小波自适应阈值一维信号去噪&#xff0c;也包含软阈值和硬阈值 硬阈值、软阈值、自适应阈值 3、仿真分析 略 4、参考论文 略 链接&#xff1a;https://pan.baidu.com/s/1yQ1yDfk-_Qnq7tGpa23L…

JOSEF约瑟 反时限过流继电器JGL-115板前接线5A速断保护

系列型号 JGL-111反时限过流继电器&#xff1b;JGL-112反时限过流继电器&#xff1b; JGL-113反时限过流继电器&#xff1b;JGL-114反时限过流继电器&#xff1b; JGL-115反时限过流继电器&#xff1b;JGL-116反时限过流继电器&#xff1b; JGL-117反时限过流继电器&#xff1b…

Leetcode—69.x的平方根【简单】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—69.x的平方根 直接法实现代码 int mySqrt(int x) {long long i 0;while(i * i < x) {i;}if(i * i > x) {return i - 1;}return i; }运行结果 二分法实现代码 int mySqrt(int x) {long long left 0, right (l…

Apache DolphinScheduler如何完全设置东八区?

默认情况 为了兼容全世界不同时区&#xff0c;Apache DolphinScheduler 使用的是 UTC 0 时区&#xff0c;包括保存到数据库表中的数据时区&#xff0c;以及展示到页面上的时区。 如果我们想在页面上看到东八区时间&#xff0c;则需要在页面上手动选择上海时区&#xff0c;如下…

[Hive] INSERT OVERWRITE DIRECTORY要注意的问题

在使用Hive的INSERT OVERWRITE语句时&#xff0c;需要注意以下问题&#xff1a; 数据覆盖&#xff1a;INSERT OVERWRITE语句会覆盖目标目录中的数据。因此&#xff0c;在执行该语句之前&#xff0c;请确保目标目录为空或者你希望覆盖的数据已经不再需要。数据格式&#xff1a;…

Android Glide transform圆形图CircleCrop动态代码描边绘制外框线并rotateImage旋转,Kotlin

Android Glide transform圆形图CircleCrop动态代码描边绘制外框线并rotateImage旋转&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app&q…

JVM及其垃圾回收机制(GC)

目录 一.JVM内存区域划分 二.JVM类加载机制 类加载过程 类加载的时机 双亲委派模型 三.JVM垃圾回收机制&#xff08;GC) GC工作过程 1.找到垃圾/判断垃圾 &#xff08;1&#xff09;引用计数【python/PHP】 &#xff08;2&#xff09;可达性分析【Java】 2.对象释放…

Juniper PPPOE双线路冗余RPM配置

------------------ 浮动静态路由 set routing-options static route 0.0.0.0/0 next-hop pp0.0 qualified-next-hop pp0.1 preference 10 ----------------- RPM测试的内容,包括从哪个接口发起测试,测试ping等等 #指定探针类型用ICMP请求 #探测的目标地址 #探测间隔 #探测阈…

ElasticSearch中常见的分词器介绍

文章目录 ElasticSearch中常见的分词器介绍前言分词器的作用如何指定分词器分词器的组成分词器的类型标准分词器空格分词器简单分词器关键词分词器停用词分词器IK分词器NGram分词器正则匹配分词器语言分词器自定义分词器 ElasticSearch中常见的分词器介绍 前言 ElasticSearch是…

如何利用黑群晖虚拟机和内网穿透实现公网远程访问

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

Linux系统上搭建高可用Kafka集群(使用自带的zookeeper)

本次在CentOS7.6上搭建Kafka集群 Apache Kafka 是一个高吞吐量的分布式消息系统&#xff0c;被广泛应用于大规模数据处理和实时数据管道中。本文将介绍在CentOS操作系统上搭建Kafka集群的过程&#xff0c;以便于构建可靠的消息处理平台。 文件分享&#xff08;KafkaUI、kafka…

No193.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

kali linux安装教程

安装 Kali Linux 非常简单&#xff0c;下面是基本的步骤&#xff1a; 首先下载 Kali Linux 的 ISO 镜像文件。你可以从官方网站 https://www.kali.org/downloads/ 下载。 确保你的计算机支持使用盘或者 USB 启动。你可以在计算机开机时按下 F12 或者其他类似的按键&#xff0c;…

Java 中表示整数的包装类Integer(详解)

Integer 是 Java 中的一个类&#xff0c;属于 java.lang 包。 基本概念 在Java中&#xff0c;Integer是一个类&#xff0c;它封装了一个int类型的值&#xff0c;使得int类型的值可以被当做对象来处理。Integer类提供了许多方法来操作整数值&#xff0c;包括将字符串转换为整数…

C#中Linq AsEnumeralbe、DefaultEmpty和Empty的使用

Linq是Language Integrated Query的简称&#xff0c;它是微软在.NET Framework 3.5里面新加入的特性&#xff0c;用以简化查询查询操作。以下主要介绍C#中Linq的AsEnumeralbe、DefaultEmpty和Empty操作符。 1、AsEnumeralbe操作符 AsEnumerable操作符可以将一个类型为IEnumer…

ctfshow sql171-179

mysql 先打开我们本地的mysql&#xff0c;可以看到这些数据库 information_schema information_schema 库: 是信息数据库&#xff0c;其中保存着关于MySQL服务器所维护的所有其他数据库的信息比如数据库名&#xff0c;数据库表&#xff0c; SCHEMATA表: 提供了当前MySQL实例…

Golang 字符串处理汇总

1. 统计字符串长度&#xff1a;len(str) len(str) 函数用于统计字符串的长度&#xff0c;按字节进行统计&#xff0c;且该函数属于内置函数也不用导包&#xff0c;直接用就行&#xff0c;示例如下&#xff1a; //统计字符串的长度,按字节进行统计: str : "golang你好&qu…

​软考-高级-系统架构设计师教程(清华第2版)【第4章 信息安全技术基础知识(P160~189)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第4章 信息安全技术基础知识&#xff08;P160~189&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

postgresql实现job的六种方法

简介 在postgresql数据库中并没有想oracle那样的job功能&#xff0c;要想实现job调度&#xff0c;就需要借助于第三方。本人更为推荐kettle&#xff0c;pgagent这样的图形化界面&#xff0c;对于开发更为友好 优势劣势Linux 定时任务&#xff08;crontab&#xff09; 简单易用…

tx-前端笔试题记录

目录 目录 1.你最熟悉的前端框架是什么说说你对它的理解。 2.请简单实现一下js对象深度拷贝。 3.CSS 有几种方法实现垂直水平居中?请简要写一下。 4.这段程序执行之后控制台会打印什么内容? 5.下列程序的输出结果是多少?为什么? 6.有ABCDE 五个火车站&#xff0c;单向…