没有合适的资源?快使用搜索试试~ 我知道了~
java开发面试题及答案
需积分: 2 1 下载量 165 浏览量
2023-03-14
16:36:40
上传
评论 3
收藏 78KB DOCX 举报
温馨提示
试读
44页
基础语法 9 Q1:简单说说Java有哪些数据类型 答:①分为基本数据类型和引用数据类型。②基本数据类型包括:数值型(byte、short、int、long、float、double),字符型(char)以及布尔型(boolean)。除了基本类型外,其他数据类型都属于引用类型,包括类、接口、数组等。 Q2:float number=3.4;有没有问题?为什么? 答:有问题,因为3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型,可能会造成精度损失,所以必须进行强制类型转换,正确的写法是float number =(float)3.4;/ float number =3.4F;。 Q3:字符串拼接的方式以及效率? 答:①使用+直接拼接,String 是final对象,不会被修改,每次使用 +进行拼接都会创建新的对象,而不是改变原来的对象,效率低,是线程安全的。②使用StringBuffer可变字符串,效率较高,是线程安全的(StringBuffer的方法使用了synchronized关键字进行修饰)。③使用StringBuilder可变字符串,效率最
资源推荐
资源详情
资源评论
java 开发面试题及答案
基础语法 9
Q1:简单说说 Java 有哪些数据类型
答:①分为基本数据类型和引用数据类型。②基本数据类型包括:数值型(byte、short、
int、long、float、double),字符型(char)以及布尔型(boolean)。除了基本类型外,其他
数据类型都属于引用类型,包括类、接口、数组等。
Q2:float number=3.4;有没有问题?为什么?
答:有问题,因为 3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下
转型,可能会造成精度损失,所以必须进行强制类型转换,正确的写法是 float number
=(float)3.4;/ float number =3.4F;。
Q3:字符串拼接的方式以及效率?
答:①使用+直接拼接,String 是 final 对象,不会被修改,每次使用 +进行拼接都会创建新
的对象,而不是改变原来的对象,效率低,是线程安全的。②使用 StringBuffer 可变字符串,
效率较高,是线程安全的(StringBuffer 的方法使用了 synchronized 关键字进行修饰)。③使用
StringBuilder 可变字符串,效率最高,但是线程不安全。
Q4:简述 final,finally 和 finalize 区别
答:①final 可以修饰类,方法和变量,被 final 修饰的类不可继承,被 final 修饰的方法不可
重写,被 final 修饰的变量引用不可更改,引用的内容可以更改。②finally 用于 try-catch 代
码块中,无论是否发生异常最后都将执行,作用是释放资源。③finalize 是 Object 类的方法,
在对象被垃圾回收之前将调用一次,一般用于资源的释放。
Q5:==和 equals 有什么区别?equals 和 hashCode 有什么联系?
答:①如果是引用类型,==比较的是两个对象的引用是否完全相同,如果是基本类型,比较
的是两个基本类型的数值是否相同。②如果没有重写的话,equals 默认按照==进行比较,如
果重写了 equals()方法,则按照对应的比较规则比较。③两个对象如果相等,那么它们的
hashCode 值必须相等,但两个对象的 hashCode 值相等时,它们不一定相同。
Q6:Array 和 ArrayList 的区别?
答:①Array 长度在定义之后就不运行改变了,而 ArrayList 是长度可变的,可以自动扩容。②
Array 只能存储相同类型的数据,ArrayList 可以存储不同类型的数据。③ArrayList 提供了更
多操作数据的方法。
Q7:&和&&的区别?
答:①&具有按位与和逻辑与两个功能。②&&作为逻辑与具有短路的特点,当前面的条件表
达式为 false 时就不会进行后面条件表达式的判断,可以用来避免空指针异常。
Q8:简述 JDK8 的新特性
答:①接口中可以添加 default 修饰的非抽象方法,可以有方法体和内容。②可以使用 lambda
表达式,减少代码冗余。③函数式接口,使用@FunctionalInterface 注解标明,该接口有且
仅有一个抽象方法。④方法引用,可以直接引用已有 Java 类或对象的方法或构造器,进一
步简化 lambda 表达式。⑤stream 流,用于解决已有集合/数组类库的弊端,简化其操作,
有 foreach 遍历、filter 过滤、map 映射、concat 合并等功能。⑥增加日期相关的 API。
Q9:Stream 流了解吗?
答:①Stream 流是 JDK1.8 的新特性,用于解决已有集合/数组类库的弊端,简化集合/数组
的操作。②stream 流的获取:集合:直接调用 stream()方法获取;数组:使用静态方法
Stream.of()/Arrays.stream()获取。③常用方法:forEach() 遍历;count() 统计个数;filter() 按
条件过滤;limit() 取前面 n 个元素;skip() 跳过前面 n 个元素;map() 映射加工;concat()
合并 stream 流。④终结方法:foreach/count 调用终结方法后流不能继续使用;非终结方法:
每次调用完返回一个新的 stream 对象,可以继续使用,支持链式编程。⑤收集 stream 流:
把流转为 Set 集合 collect(Collections.toSet());把流转为 List 集合 collect(Collections.toList());
把流转为 Collection 集合 collect(Collections.toCollection());把流转为数组 toArray()。
面向对象 10
Q1:简述面向对象的特性
答:①封装:建议成员变量私有,然后提供公有的 getter/setter 方法来获取值/赋值,封装
的核心思想是合理隐藏,合理暴露,可以提高安全性,实现代码的组件化。②继承:一种子
类到父类的关系,是“is a”关系,可以提高代码的复用性,相同代码可写到父类,子类的
功能更加强大,不仅得到了父类的功能,还有自己的功能。③多态:同一个类型的对象执行
相同的行为,在不同的状态下表现出不同的特征。多态可以降低类之间的耦合度,右边对象
可以实现组件化切换,业务功能随之改变,便于扩展和维护。
Q2:类和对象有什么区别?
答:类是一个抽象的概念,是具有相同特征的事物的描述,是对象的模板。对象是一个个具
体的存在,是类的实例。
Q3:列举 Object 类的方法
答:①equals(Object obj):判断其他对象是否与当前对象相等。②toString():打印当前对象
的 字 符 串 表 示 。 ③ wait() : 导 致 当 前 线 程 等 待 , 等 待 其 他 线 程 唤 醒 , 会 释 放 锁 。 ④
notify()/notifyAll():随机唤醒一个/全部线程。⑤hashCode():返回当前对象的 hashCode 值。
⑥finalize():当垃圾回收器要回收对象前调用。⑦clone():创建并返回对象的一个副本。
Q4:方法重载和方法重写的区别?
答:①方法重载是同一个类中具有不同参数列表的同名方法(无关返回值类型),方法重写
是子类中具有和父类相同参数列表的同名方法,会覆盖父类原有的方法。②重载的返回值类
型和权限修饰符,异常抛出类型没有要求,重写方法的返回值类型小于等于父类被重写方法
的返回值类型,修饰符权限大于等于父类被重写方法权限修饰符,抛出的异常类型小于等于
父类被重写方法抛出的异常类型。
Q5:接口和抽象类有什么区别?
答:①接口中只能定义 public staic final 修饰的常量,抽象类中可以定义普通变量。②接口和抽
象类都不能实例化,但接口没有构造器,抽象类有构造器。③接口可以多实现,抽象类只能
单继承。④接口在 JDK1.8 之前只能定义 public abstract 修饰的方法,JDK1.8 开始可以定义默
认方法和静态方法,JDK1.9 开始可以定义私有方法,抽象类中的方法没有限制。
Q6:什么时候应该使用接口,什么时候应该使用抽象类?
答:①如果知道某个类应该成为基类,那么第一选择应该是让它成为一个接口,只有在必须
要有方法定义和成员变量的时候,才应该选择抽象类。②在接口和抽象类的选择上,必须遵
守这样一个原则:行为模型应该总是通过接口而不是抽象类定义。通过抽象类建立行为模型
会出现的问题:如果有一个抽象类 Moblie,有两个继承它的类 Mobile1 和 Moblie2,分别有
自己的功能 1 和功能 2,如果出现一个既有功能 1 又有功能 2 的新产品需求,由于 Java 不允
许多继承就出现了问题,而如果是接口的话只需要同时实现两个接口即可。
Q7:内部类有什么作用?有哪些分类?
答:①内部类有更好的封装性,有更多的权限修饰符,封装性可以得到更多的控制。②静态内
部类:由 static 修饰,属于类本身,只加载一次。类可以定义的成分静态内部类都可以定义,
可以访问外部类的静态变量和方法,通过 new 外部类.静态内部类构造器来创建对象。③成
员内部类:属于外部类的每个对象,随对象一起加载。不可以定义静态成员和方法,可以访
问外部类的所有内容,通过 new 外部类构造器.new 成员内部类构造器来创建对象。④局部
内部类:定义在方法、构造器、代码块、循环中。只能定义实例成员变量和实例方法,作用
范围仅在局部代码块中。⑤匿名内部类:没有名字的局部内部类,可以简化代码,匿名内部
类会立即创建一个匿名内部类的对象返回,对象类型相当于当前 new 的类的子类类型。
Q8:泛型和泛型擦除是什么?
答:①泛型的本质是参数化类型,泛型提供了编译时类型的安全检测机制,该机制允许程序
在编译时检测非法的类型。②在编译阶段采用泛型时加上的类型参数,会被编译器在编译时
去掉,这个过程就被称为类型擦除,因此泛型主要用于编译阶段,在编译后生成的 Java 字
节代码文件中不包含泛型中的类型信息。
Q9:泛型标记的规范了解吗?
答:①E:值 Element,在集合中使用,表示在集合中存放的元素。②T:指 Type,表示 Java
类,包括基本的类以及自定义类。③K:指 Key,表示键,例如 Map 集合中的 Key。④V:
指 Value,表示值,例如 Map 集合中的 Value。⑤N:指 Number,表示数值类型。⑥?:表
示不确定的 Java 类型。
Q10:泛型限定是什么?
答:①类型通配符使用?表示所有具体的参数类型,在使用泛型的时候,如果希望将类的继
承关系加入泛型应用中就需要对泛型做限定,具体的泛型限定有对泛型上限的限定以及对泛
型下限的限定。②对泛型上限的限定使用<? extends T>,它表示该通配符所代表的类型是 T
类的子类型或 T 接口的子接口。③对泛型下限的限定使用<? super T>,它表示该通配符所代
表的类型是 T 类的父类型或 T 接口的父接口。
异常 2
Q1:异常有哪些分类?出现的原因是什么?
答:①Throwable 是所有错误和异常的父类,Throwable 分为 Error 和 Exception。②Error 指 Java
程序运行错误,出现 Error 通常是因为系统的内部错误或资源耗尽,Error 不能在运行过程中
被动态处理,如果程序运行中出现 Error,系统只能记录错误的原因和安全终止。③Exception
指 Java 程 序 运 行 异 常 , 即 运 行 中 发 生 了 不 期 望 的 情 况 , 分 为 RuntimeException 和
CheckedException。RuntimeException 指在 Java 虚拟机正常运行期间抛出的异常,可以被捕
获并处理,例如空指针异常,数组越界等。CheckedException 指编译阶段强制要求捕获并处
理的异常,例如 IO 异常,SQL 异常等。
Q2:有哪些异常处理方式?
答:①抛出异常:遇到异常不进行具体处理,而是将异常抛出给调用者,由调用者根据情况
处理。抛出异常有 2 种形式,一种是 throws,作用在方法上,一种是 throw,作用在方法内。②使
用 try/catch 进行异常的捕获处理,try 中发生的异常会被 catch 代码块捕获,根据情况进行
处理,如果有 finally 代码块无论是否发生异常都会执行,一般用于释放资源,JDK1.7 开始可
以将资源定义在 try 代码块中自动释放减少代码。
集合 10
Q1:简述一下集合主要有哪些类和接口,各自有什么特点
答:①主要有两个接口 Collection 和 Map,其中 Collection 又包括 List、Set 和 Queue。②List
是有序的,主要包括 ArrayList,LinkedList 和 Vector,ArrayList 底层通过数组实现,线程不安
全,Vector 是线程安全的 ArrayList,但效率较低,LinkedList 底层通过双向链表实现,与 ArrayList
相比增删快查询慢。③Set 是唯一且无序的,主要包括 HashSet,LinkedHashSet 和 TreeSet。
HashSet 底层其实就是 HashMap,利用了 key 来保证元素的唯一性。LinkedHashSet 可以按照
key 的操作顺序排序,TreeSet 支持按照默认或指定的排序规则排序。④Queue 是队列结构,
主要有 ArrayBlockingQueue 基于数组的阻塞队列、LinkedBlockingQueue 基于链表的阻塞队列
等。⑤Map 以 key-value 键值对的形式存储元素,主要包括 HashMap、LinkedHashMap 和
TreeMap。HashMap 底层通过数组+链表/红黑树实现,LinkedHashMap 可以按照 key 的操作
顺序对集合排序,TreeMap 可以按照默认或指定的排序规则对集合排序。
Q2:HashMap 是线程安全的吗?
答 : ① HashMap 是 线 程 不 安 全 的 , 可 以 使 用 ConcurrentHashMap 保 证 线 程 安 全 。 ②
ConcurrentHashMap 基于减小锁粒度的思想,通过使用分段锁来实现线程安全,内部细分为
很多 Segment 数据段,默认情况下为 16 个,对每个 Segment 的数据都单独进行加锁操作,
Segment 的个数为锁的并发度。ConcurrentHashMap 是由 Segment 数组和 HashEntry 数组组
成的,Segment 继承了可重入锁,HashEntry 用来存储键值对数据。③Segment 的结构和
HashMap 类似,是数组和链表结构,每个 Segment 里面都包含一个 HashEntry 数组,每个
HashEntry 都是一个链表结构的数据要对其进行 i 修改必须先获得对应的 Segment 锁。④多线
程下只要加入的数据 hashCode 映射的数据段不一样就可以做到并行的线程安全。
Q3:List、Set、Map 有什么区别?
答:①List 是有序、可重复、有索引的集合,继承了 Collection 集合全部功能 除了 Collection
的三种遍历方式外,可用索引遍历。②Set 是无序,不可重复的集合,Set 的实现类
LinkedHashSet 和 TreeSet 是有序的,LinkedHashSet 可以按照元素插入的顺序排序,也可以按
照元素操作的时间排序,TreeSet 可以按照默认的比较规则或者自定义的比较规则排序。③
Map 是无序、以 key-value 的键值对形式存储元素的集合,键不可重复,值无要求,重复的
键对应的值会覆盖之前的值。
Q4:HashSet 是如何去重的?
答:①对于基本类型的包装类,可以直接按值进行比较。②对于引用数据类型,会先比较
hashCode()返回值是否相同,如果不同则代表不是同一个对象,如果相同则继续比较 equals()
方法返回值是否相同,都相同说明是同一个对象。③如果希望内容相同的对象就代表对象相
同,那么除了重写 equals()方法还要重写 hashCode()方法,因为内容相同的对象 hashCode()
值不一定相同,因为只有 hashCode()和 equals()都相同才说明是同一个对象。
Q5:HashMap 和 HashSet 的底层是怎么实现的?
答:①JDK1.8 之前,HashMap 的底层是数组加链表实现。数组中的每个元素都是一个单链
表,链表中的每个元素都是 Entry 的实现类 Node 的一个实例,Node 包括 4 个属性:key、
value、hash 值和用于指向单链表下一个元素的 next。②HashMap 在查找数据时,根据 hash
值可以快速定位到数组的具体下标,然后对链表进行遍历查找数据的时间复杂度为 O(n)。
JDK1.8 起对 HashMap 进行了优化,底层改为数组+链表或红黑树,当链表中的元素超过 8 个
之后,HashMap 会将链表结构转换未红黑树以提高查询效率,时间复杂度为 O(logn)。②
HashSet 的底层是基于 HashMap 实现的,HashSet 中的元素只是存放在了底层 HashMap 的 key
上, 而 value 使用一个 static final 的 Object 对象标识。因此 HashSet 的实现比较简单,相
关操作基本上都是直接调用底层 HashMap 的相关方法来完成的。
Q6:Collection 和 Collections 有什么区别?
答:①Collection 是一个集合接口,它包括 List 有序集合、Set 无序集合、Queue 队列等。②
Collections 则是 Collection 的一个工具类,为 Collection 类型的对象提供了很多方便的方法,
例如 addAll 可以直接对 Collection 集合批量添加元素,shuffle 可以随机打乱 List 集合的元素
顺序,sort 可以对 List 集合进行默认或按比较器进行排序。
Q7:迭代器是什么?
答:①迭代器实现了 Iterator 接口,是用于遍历 Collection 集合元素的一个指针。②主要有三个
方法:通过 iterator()获得集合的迭代器;通过 hasNext()判断集合当中是否还有元素,如果
有返回 true,没有则返回 false,初始时迭代器位于第一个元素之前;通过 next()获取集合的
下一个元素,并向后移动一个元素的单位。
Q8:在使用 foreach 循环遍历集合元素时能否添加或删除元素?
答:使用 foreach 循环遍历元素集合时不能修改或删除元素,通过 java -c 查看字节码可以发
现 foreach 循环实际 上是用 Iterator 迭代 器实现的 , 如果进行 添加或删 除元素会 抛 出
ConcurrentModificationException 异 常 , 因 为 添 加 或 删 除 元 素 会 改 变 modCount 的 值 ,
modCount 是集合类的一个成员变量,代表集合的修改次数,当 modCount 的值和预期的
exceptedModCount 值不一致时就会抛出 ConcurrentModificationException 异常。
Q9:Queue 接口中的 add()/offer()、remove()/poll()、element()/peek()方法有什么区别?
答:①add()和 offer()都是向队列尾部插入一个元素,区别是当超出队列界限时,add 方法会
抛出异常,而 offer()会返回 false。②remove()和 poll()都是从队列头部移除一个元素并返回,
区别是队列为空时 remove()方法会抛出异常,poll()方法则是返回 null 值。③element()和 peek()
都是用于查询队列头部的元素,区别时队列为空时, element() 抛出一个异常,而 peek()
返回 null。
剩余43页未读,继续阅读
资源评论
wangyq0517
- 粉丝: 1
- 资源: 150
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- 文件批量改名神器10.0一款简单易用的批量文件重命名工具(已注册PRO版本).rar
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功