Java企业面试题4

embedded/2024/9/23 19:21:41/

1.异常的概述

  • 什么是异常?

        指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止。

  • 异常的抛出机制

        Java中把不同的异常用不同的类表示,一旦发生某种异常,就`创建该异常类型的对象`,并且抛出(throw)。
        然后程序员可以捕获(catch)到这个异常对象,并处理;如果没有捕获(catch)这个异常对象,那么这个异常对象将会导致程序终止。

  • 如何对待异常

        对于程序出现的异常,一般有两种解决方法:一是遇到错误就终止程序的运行。另一种方法是程序员在编写程序时,
        就充分考虑到各种可能发生的异常和错误,极力预防和避免。实在无法避免的,要编写相应的代码进行异常的检测、以及`异常的处理`,保证代码的`健壮性`。

2.异常的体系结构及常见的异常

java.lang.Throwable:异常体系的根父类
    |---java.lang.Error:错误。Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。
                         一般不编写针对性的代码进行处理。
               |---- StackOverflowError、OutOfMemoryError

    |---java.lang.Exception:异常。我们可以编写针对性的代码进行处理。
               |----编译时异常:(受检异常)在执行javac.exe命令时,出现的异常。
                    |----- ClassNotFoundException
                    |----- FileNotFoundException
                    |----- IOException
               |----运行时异常:(非受检异常)在执行java.exe命令时,出现的异常。
                    |---- ArrayIndexOutOfBoundsException
                    |---- NullPointerException
                    |---- ClassCastException
                    |---- NumberFormatException
                    |---- InputMismatchException
                    |---- ArithmeticException

3.说说你在开发中常见的异常都有哪些?

|----编译时异常:(受检异常)在执行javac.exe命令时,出现的异常。
    |----- ClassNotFoundException
    |----- FileNotFoundException
    |----- IOException
|----运行时异常:(非受检异常)在执行java.exe命令时,出现的异常。
    |---- ArrayIndexOutOfBoundsException
    |---- NullPointerException
    |---- ClassCastException
    |---- NumberFormatException
    |---- InputMismatchException
    |---- ArithmeticException

4.异常处理的方式

过程1:“抛”
 >"自动抛" : 程序在执行的过程当中,一旦出现异常,就会在出现异常的代码处,自动生成对应异常类的对象,并将此对象抛出。

 >"手动抛" :程序在执行的过程当中,不满足指定条件的情况下,我们主动的使用"throw + 异常类的对象"方式抛出异常对象。


过程2:“抓”
    狭义上讲:try-catch的方式捕获异常,并处理。
    广义上讲:把“抓”理解为“处理”。则此时对应着异常处理的两种方式:① try-catch-finally ② throws

5.Java的异常体系简单介绍下(网*)

Java的异常体系主要分为两大类:ErrorExceptionError指的是严重的错误,通常由JVM内部错误或者资源耗尽引起,应用程序无法处理。Exception是程序可以处理的异常情况,又分为检查型异常(checked exceptions)和非检查型异常(unchecked exceptions)。检查型异常在编译时需要显式处理,而非检查型异常则包括运行时异常(RuntimeException及其子类)和错误(Error及其子类)。

6.Java异常处理机制(*科软)

  • Java通过try、catch、finally和throw关键字来处理异常。try块中放置可能抛出异常的代码,catch块用来捕获并处理特定类型的异常,finally块无论是否捕获到异常都会执行,通常用于清理资源。throw用于手动抛出异常。

7.异常的两种类型,Error和Exception的区别(上海冠*新创、北京中**译、*度)

  • Error是严重的问题,通常与代码无关,由系统资源不足、约束失败等引起,应用程序不应尝试捕获这些错误。Exception是程序可以处理的异常情况,分为检查型异常和非检查型异常。检查型异常需要在编译时处理,非检查型异常(如运行时异常)则不需要。

8.运行时异常与一般异常有何异同?(华*思为)

  • 运行时异常(unchecked exceptions)通常由程序逻辑错误引起,如NullPointerExceptionArrayIndexOutOfBoundsException等,它们继承自RuntimeException。检查型异常(checked exceptions)则需要在编译时显式处理,如IOExceptionSQLException等。

9.说几个你常见到的异常(华油**普)

  • 常见的异常包括NullPointerExceptionArrayIndexOutOfBoundsExceptionClassCastExceptionIOExceptionSQLException等。

10.说说final、finally、finalize的区别

  • final可以用来修饰类、方法和变量。被final修饰的类不能被继承,方法不能被重写,变量(成员变量或局部变量)则不能被重新赋值。
  • finally是异常处理的一部分,与try-catch配合使用,无论是否捕获到异常,finally块中的代码都会执行。
  • finalize是Object类的一个方法,在垃圾收集器执行时会调用被回收对象的finalize()方法。

11.如果不使用try-catch,程序出现异常会如何?

  • 如果不使用try-catch处理异常,当异常发生时,程序会立即终止,并打印出异常的堆栈跟踪信息。

12.try ... catch捕捉的是什么异常?

  • try-catch可以捕捉Exception及其子类的实例。具体捕捉哪个异常类型,由catch块中声明的异常类型决定。

13.如果执行finally代码块之前方法返回了结果或者jvm退出了,这时finally块中的代码还会执行吗?(恒*电子)

  • 是的,finally块中的代码总会被执行,即使在方法返回之前或JVM退出时。

14.在try语句中有return语句,最后写finally语句,finally语句中的code会不会执行?何时执行?如果执行是在return前还是后(拓*思、华**为)

  • finally块中的代码会在return之前执行。即使try块中有return语句,控制权也会传递给finally块执行其中的代码。

15.捕获异常在catch块里一定会进入finally吗?catch里能return吗?catch里return还会进finally吗?在try里return是什么情况?(*蓝)

  • catch块之后总是会进入finally块。
  • catch块中可以有return语句。
  • 如果catch块中有return语句,在执行return之前会先进入finally块。
  • 在try块中的return会在执行前先进入finally块。

16.throw和throws的区别?(北京亿**方、北京新*阳光)

  • throw是用来抛出一个具体的异常实例。
  • throws用来声明一个方法可能会抛出哪些异常类型。

17.如何自定义一个异常?

  • Exception或RuntimeException等,并根据需要添加构造函数和其他成员方法。自定义异常应该提供足够的信息以帮助诊断问题。

18.以下两种方式创建的String对象有什么不同?(*团)

String str = new String("test");

String str = "test";

  • String str = new String("test");:这种方式会先在字符串常量池中查找是否有"test"这个字符串,如果没有,则将"test"存入常量池。然后在堆上创建一个新的String对象,并指向常量池中的"test"。如果有,则直接在堆上创建一个新对象,指向常量池中的"test"。
  • String str = "test";:这种方式会在编译期直接创建,并且如果字符串池中已经存在"test",则直接引用池中的对象,不会在堆上创建新的对象。这种方式更高效。

19.String s = new String("xyz");创建了几个String Object? (新*陆)

  • String s = new String("xyz"); 创建了两个String对象。一个是在字符串常量池中的"xyz"对象,另一个是在堆内存中通过new关键字创建的String对象。

20.String a="abc" String b="a"+"bc" 问a==b?(网*邮箱)

  • String a="abc";此时"a"是在字符串常量池中创建的。
    String b="a"+"bc";表达式"abc"是在编译期间计算出来的,因此它也是在字符串常量池中创建的。因此,a和b引用的是同一个对象,a == b返回true。

21.String 中 “+” 怎样实现?(阿*)

  • 在Java中,当使用“+”操作符连接字符串时,实际上会创建一个StringBuilder或StringBuffer对象来完成字符串拼接工作。拼接完成后,再将结果转换为一个新的String对象。
  • 常量 + 常量 :略
  • 变量 + 常量 、变量+变量:创建一个StringBuilder的实例,通过append()添加字符串,最后调用toString()返回一个字符串。(toString()内部new 一个String的实例)

22.Java中String是不是final的?(凡*科技)

  • Java中String是final的。这意味着一旦String对象被创建,它的值就不能被改变。

23.String为啥不可变,在内存中的具体形态?(阿*)

  • 规定不可变。
  • String:提供字符串常量池。
  • String不可变的原因主要是为了安全性和性能优化。不可变对象可以被自由地共享而不用担心被修改,这使得它们在多线程环境中非常安全。此外,不可变对象可以被JVM优化,例如通过字符串常量池来减少内存使用。

24.String 可以在 switch中使用吗?(上海*睿)

  • 在Java中,String可以在switch语句中使用。从Java 7开始,switch语句支持String类型的参数。

25.String中有哪些方法?列举几个(闪*购)

  • length(): 返回字符串长度。
  • equals():用于比较字符串内容是否相等
  • charAt(int index): 返回指定索引处的字符。
  • substring(int beginIndex): 返回一个新字符串,它是此字符串的一个子字符串。
  • concat(String str): 将指定字符串连接到此字符串的结尾。
  • substring(int beginIndex, int endIndex):用于获取子字符串等等。
  • replace(char oldChar, char newChar): 返回一个新字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。
  • toLowerCase()toUpperCase(): 分别返回将此字符串中所有字符转换为小写或大写后的新字符串。

26.subString()到底做了什么?(银*数据)

String str = "hello";

String subStr = str.subString(1,3); //底层是new的方式返回一个subStr,实体内容是"el"

  • String类的substring()方法用于返回一个新的字符串,这个新字符串是原字符串的一个子序列。具体的,substring()方法接受两个参数,分别是起始索引(包含)和结束索引(不包含),并且返回这两个索引之间的字符组成的新字符串。

27.Java中操作字符串有哪些类?他们之间有什么区别。(南*电网)

    主要类有String、StringBuilder和StringBuffer。

  • String是不可变的,每次修改都会生成新的对象。
  • StringBuilder是可变的,适用于单线程环境下的字符串操作,因为它不是线程安全的,所以性能更好。
  • StringBufferStringBuilder类似,但它是线程安全的,因为它所有的公共方法都使用synchronized关键字同步了。这使得它在多线程环境下安全,但性能略低于StringBuilder

28.String的线程安全问题(闪*购)

  • String本身由于是不可变的,所以在多线程环境下是安全的。但是基于String的操作,如拼接等,可能需要考虑线程安全性。

29.StringBuilder和StringBuffer的线程安全问题(润*软件)

  • StringBuilder不是线程安全的,它没有同步方法,因此在单线程中使用时性能更高。
  • StringBuffer是线程安全的,因为它的方法都是同步的,适用于多线程环境,但会牺牲一些性能。

30.简单说说 Comparable 和 Comparator 的区别和场景?(软**力)

  • Comparable接口定义了一个自然排序的方式,通常用于对象本身的比较。
  • Comparator接口允许一个外部的比较器来定义对象的顺序,可以灵活地定义不同的排序规则。

31.Comparable 接口和 Comparator 接口实现比较(阿*)

  • Comparable接口要求实现compareTo(T o)方法,它定义了对象的自然顺序。
  • Comparator接口要求实现compare(T o1, T o2)方法,用于定义两个对象之间的比较规则。

32.List,Set,Map是否继承自collection接口?(北京中*译咨询、思*贸易)

  • List 和 Set 继承自 Collection 接口。
  • Map 不继承自 Collection 接口,它是另一种集合框架,用于存储键值对。

33.说说List,Set,Map三者的区别(民*银行)

  • List:有序集合,允许元素重复,可以包含null元素,如ArrayList、LinkedList。
  • Set:无序集合,不允许元素重复,最多只能有一个null元素,如HashSet、TreeSet。
  • Map:键值对集合,键(Key)唯一,值(Value)不唯一,键和值都可以是null(但键不能全为null),如HashMap、TreeMap。

34.写出list、map、set接口的实现类,并说出其特点(华**为)

  • List:ArrayList(动态数组,快速随机访问,非线程安全)、LinkedList(链表结构,快速插入和删除,非线程安全)。
  • Map:HashMap(基于哈希表的Map接口实现,非线程安全)、TreeMap(基于红黑树的NavigableMap实现,有序)、LinkedHashMap(维护插入顺序的HashMap)。
  • Set:HashSet(基于HashMap实现,不允许重复元素)、LinkedHashSet(维护插入顺序的HashSet)、TreeSet(基于TreeMap实现,元素自动排序)。

35.常见集合类的区别和适用场景(饿**)

  • ArrayList:适用于频繁访问元素的场景。
  • LinkedList:适用于频繁插入和删除元素的场景。
  • HashMap:适用于快速查找和访问键值对的场景。
  • TreeMap:适用于需要元素排序的场景。
  • HashSet:适用于需要存储唯一元素的场景。

36.集合的父类是谁?哪些安全的?(北京中**信)

  • 集合的顶级接口是 Collection 和 Map(Map不是Collection的子接口)。
  • 线程安全的集合类包括 VectorHashtable 以及它们的子类,以及 Collections 工具类提供的同步包装器(如 Collections.synchronizedList(list))。

37.集合说一下哪些是线程不安全的(*科软)

  • ArrayList、HashMap、HashSet等大多数集合类都是线程不安全的。

38.遍历集合的方式有哪些?(恒*电子)

  • 使用迭代器(Iterator)
  • 使用增强for循环(for-each循环)
  • 使用ListIterator(仅适用于List)
  • 使用Java 8的Stream API进行遍历

39.List下面有哪些实现(软**力)

  • ArrayList、LinkedList、Stack(继承自Vector,但不推荐使用)、Vector。

40.ArrayList与LinkedList区别?(O**O、滴*、汇*天下、拓*软件、博纳**软件、上海*进天下,北京永生**信息、*联、在*途游)

  • ArrayList:基于动态数组实现,适合随机访问,插入和删除操作相对较慢。
  • LinkedList:基于双向链表实现,适合插入和删除操作,但随机访问较慢。

41.ArrayList与Vector区别呢?为什么要用ArrayList取代Vector呢?(湖**利软件)

Vector是线程安全的,而ArrayList不是。Vector的方法大多使用synchronized关键字进行同步,这使得Vector在多线程环境下更安全,但性能较低。因此,在单线程环境下推荐使用ArrayList。

42.Java.util.ArrayList常用的方法有哪些?(华**为)

  • add(E e):添加元素到列表末尾。
  • get(int index):获取指定位置的元素。
  • size():返回列表中的元素数量。
  • remove(int index):移除指定位置的元素。
  • contains(Object o):判断列表是否包含指定元素。

43.Arraylist 是有序还是无序?为什么?(蜜*信息)

  • ArrayList是有序的。它按照元素添加的顺序存储元素。

44.Set集合有哪些实现类,分别有什么特点?(拓*软件)

  • HashSet:基于HashMap实现,不允许重复元素,无序。
  • LinkedHashSet:基于LinkedHashMap实现,维护元素的插入顺序。
  • TreeSet:基于TreeMap实现,元素自动排序。

45.List集合和Set集合的区别?(亚*科技、*海*翼科技,*华电*系统,达*贷)

  • List:有序,允许重复元素。
  • Set:无序,不允许重复元素。

46.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?(鸿*网络)

  • Set使用equals()方法来判断两个对象是否相等,从而确定元素是否重复。==比较的是对象的引用,而equals()比较的是对象的内容。

47.TreeSet两种排序方式在使用的时候怎么起作用?(拓*软件)

  • 自然排序:通过实现Comparable接口,定义元素的自然顺序。
  • 定制排序:通过构造函数传入Comparator接口实现,定义元素的排序规则。

48.TreeSet的数据结构(*米)

  • TreeSet基于红黑树实现,是一种自平衡的二叉搜索树。

49.说一下Java的集合Map有哪些Map?(奥*医药)

  • HashMap:基于哈希表的Map接口实现,非线程安全。
  • TreeMap:基于红黑树的NavigableMap实现,元素自动排序。
  • LinkedHashMap:维护插入顺序的HashMap。
  • Hashtable:线程安全的Map实现,不推荐使用,因为效率较低。
  • Properties:Hashtable的子类,用于处理属性文件。

50.final怎么用,修饰Map可以继续添加数据吗?(*深蓝)

  • 使用final修饰的Map对象不能再指向另一个Map对象,但可以修改其内容,如添加或删除键值对。

51.Set和Map的比较(亚*科技)

  • Set:存储唯一元素的集合。
  • Map:存储键值对的集合,每个键映射到一个值。

52.HashMap说一下,线程安全吗?(*米)

  • HashMap不是线程安全的。在多线程环境下,推荐使用Collections.synchronizedMap()或ConcurrentHashMap。

53.HashMap和HashTable的区别?(银*数据、阿**巴芝麻信用、*众银行、爱*信、杭州*智公司)

  • HashMap不是线程安全的。在多线程环境下,推荐使用Collections.synchronizedMap()或ConcurrentHashMap。

54.Hashtable是怎么实现的,为什么线程安全?(迪*创新)

  • Hashtable通过synchronized关键字同步其方法实现线程安全,但这种同步方式效率较低。

55.HashMap和LinkedHashMap的区别(北京*晨阳光)

  • HashMap:基于哈希表,不维护元素的插入顺序。
  • LinkedHashMap:基于HashMap,维护元素的插入顺序。

56.HashMap 和 TreeMap 的区别(*度,太极**、*线途游、阿*校招)

  • HashMap:基于哈希表,无序。
  • TreeMap:基于红黑树,元素自动排序。

57.HashMap里面实际装的是什么?(惠*)

  • HashMap内部维护了一个数组,数组的每个位置称为桶(bucket),用于存储键值对。

58.HashMap的key存储在哪里?和value存储在一起吗?那么value存储在哪里?说具体点?(湖**利软件、天*伟业)

  • 在HashMap中,键(key)和值(value)存储在Entry对象中,Entry对象存储在数组的桶中。键和值不是直接存储在一起的,而是通过Entry对象关联。

59.自定义类型可以作为Key么?(阿*)

  • 可以,只要自定义类型正确实现了equals()和hashCode()方法。

60.集合类的工具类是谁?用过工具类哪些方法?(顺*)

  • 集合类的工具类是Collections。常用方法包括sort(), reverse(), shuffle(), synchronizedList(), synchronizedMap()等。

61.Collection 和 Collections的区别?(平*金服、*软)

  • Collection:是所有单列集合的根接口。
  • Collections:是一个包含各种集合操作静态方法的工具类。

62.ArrayList 如何实现排序(阿*)

  • 可以使用Collections.sort()方法对ArrayList进行排序。

63.HashMap是否线程安全,怎样解决HashMap的线程不安全(中*卫星)

  • HashMap本身不是线程安全的。解决方法包括使用Collections.synchronizedMap()包装器,或者使用ConcurrentHashMap。


http://www.ppmy.cn/embedded/115735.html

相关文章

前端面试题——token安全问题处理与大数据列表展示

1.长时间保存token问题 长时间保存Token涉及多个方面的问题,包括安全性、性能、以及Token的管理策略等。以下是对长时间保存Token问题的详细分析: 一、安全性问题 Token泄露风险: Token是用户身份验证的凭证,如果长时间保存且未…

使用Apache SeaTunnel高效集成和管理SftpFile数据源

本文为Apache SeaTunnel已经支持的SftpFile Source Connector使用文档,旨在帮助读者理解如何高效地使用SFTP文件源连接器,以便轻松地使用Apache SeaTunnel集成和管理您的SftpFil数据源。 SftpFile 是指通过 SFTP(Secure File Transfer Proto…

Codeforces Round 891 (Div. 3) G题 Counting Graphs(最小生成树,快速幂维护加权方案数)

题目链接 https://codeforces.com/problemset/problem/1857/G 思路 考虑将给出的树的边按照权值从小到大排序,并模拟最小生成树的过程。 因为 k r u s k a l kruskal kruskal算法在每次合并两个连通块的过程中,会浪费掉两个连通块大小乘积 − 1 -1 −…

python画图1

import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] ["SimHei"]# 模拟数据 years [2016, 2017, 2018, 2019, 2020, 2021, 2022] market_size [7950, 8931, 9940, 11205, 12305, 13199, 14980] my_color #3e9df5plt.plot(years, market_s…

算力风暴(Computational Power Surge)

算力风暴(Computational Power Surge) 算力风暴(Computational Power Surge) 1. 算力风暴的定义与驱动因素 2. 关键技术驱动算力提升 3. 算力风暴带来的挑战 4. 应对算力风暴的策略 5. 算力风暴的未来展望 6. 算力风暴对产…

蓝桥杯嵌入式客观题合集

十四届模拟赛二客观题 解析:STM32微控制器的I/O端口寄存器必须按32位字被访问 解析:微分电路能将三角波转换为方波;积分电路能将方波转换为三角波 解析:放大电路的本质是能量的控制与转换 解析:具有n个节点&#xff0c…

【C高级】有关shell脚本的一些练习

目录 1、写一个shell脚本,将以下内容放到脚本中: 2、写一个脚本,包含以下内容: 1、写一个shell脚本,将以下内容放到脚本中: 1、在家目录下创建目录文件,dir 2、dir下创建dir1和dir2 …

Vuex 入门与实战

引言 Vuex 是 Vue.js 官方推荐的状态管理库,它可以帮助我们更好地管理 Vue 应用的状态。在大型应用中,组件之间的状态共享和通信是一个非常重要的问题,而 Vuex 提供了一种优雅的解决方案。 在 Vue 应用中,数据的流动一般是单向的…