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的异常体系主要分为两大类:
Error
和Exception
。Error
指的是严重的错误,通常由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)通常由程序逻辑错误引起,如
NullPointerException
、ArrayIndexOutOfBoundsException
等,它们继承自RuntimeException
。检查型异常(checked exceptions)则需要在编译时显式处理,如IOException
、SQLException
等。
9.说几个你常见到的异常(华油**普)
- 常见的异常包括
NullPointerException
、ArrayIndexOutOfBoundsException
、ClassCastException
、IOException
、SQLException
等。
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
是可变的,适用于单线程环境下的字符串操作,因为它不是线程安全的,所以性能更好。StringBuffer
与StringBuilder
类似,但它是线程安全的,因为它所有的公共方法都使用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的子接口)。
- 线程安全的集合类包括 Vector、Hashtable 以及它们的子类,以及 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。