Java基础面试题
Posted 小坏蛋至尊宝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础面试题相关的知识,希望对你有一定的参考价值。
Java基础
需要以下资料的关注公众号,私信留言即可
- equals和 == 有什么区别
在没有重写equals 方法之前,二者没有任何区别, 在重写equals 方法后, equals 是按照重写规则进行比较, 而 == 则是比较栈中的值
- ArrayList和LinkedList的区别
ArrayList :
JDK中使用数组 实现 ArrayList。数组默认长度 10 , 超过10个元素后, 会进行数组扩容原长度1.5倍
对应的数据结构:线性表(一段地址连续的内存空间)
元素访问的效率高
插入和删除操作的效率低
LinkedList
对应的数据结构:双向链表(每个数据节点中除了保存元素值以外,还包括上一个元素的地址和下一个元素的地址)
插入和删除的效率高
元素访问的效率低
- String,StringBuffer和StringBuilder的区别
String具有不变模式,即String值一旦确定,不可修改。所以String 线程安全。(但是,String中的’+’运算线程不安全)。
String 类不可被继承。String 不适合做大量修改运算
StringBuilder 线程不安全,效率高
StringBuffer 线程安全,效率低
- HashMap和HashTable的区别
- HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类
- Hashtable既不支持Null key也不支持Null value(由于存入元素时会调用key.hashCode方法,会出现空指针异常)
- Hashtable是线程安全的,HashMap线程不安全
- Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍
- ArrayList与数组的区别与联系
JDK中使用数组 实现 ArrayList, 数组定长, ArrayList 为不定长(可以动态扩容)
- JVM JRE 和JDK的区别
JVM: Java Virtual Machine Java虚拟机
JRE: Java Runtime Environment Java运行环境
JDK:Java Development Kit Java 开发工具包
- switch能否用String做参数
JDK1.7+ 支持。语法糖,实际JVM并不支持这个语法结构。class中是hashCode方法利用int比较。
- Java中数组或list有重复数据,怎么去重
放入到Set集合中
- java中异常处理方法
try-catch 或者 throws
- String 常用方法
indexOf lastIndexOf substring replace replaceAll
toLowercase toUpperCase startWith endWith charAt equalsIgnoreCase split trim
- List与Map的区别
List 为有序列表 Map 为键值对
- java中日期格式化为String的方法
SimpleDateFormat
- final关键字
- 修饰类: 表示 类 不可被 继承
- 修饰方法:表示 方法不可被 重写
- 修饰属性/变量:表示 变量 栈中的值 不能被 修改
- 运行异常和Check异常有什么异同
运行时异常不强制要求程序员处理, Check异常要求程序员处理
- int和integer的异同
int 默认值为 0 , Integer 为 null
int == 比较比的是值 Integer == 比较,两个非new生成的Integer对象,如果值在区间-128到127之间,则比较结果为true
- 封装的作用
- 提高代码的安全性
- 提高代码的复用性
- “高内聚”:封装细节,便于修改内部代码,提高可维护性
- “低耦合”:简化外部调用,便于调用者使用,便于扩展和写作。
- 父类私有属性子类能否继承
不能,子类只能继承父类的public和 protected 属性和方法。同时,不能继承构造方法
- 重载与重写有什么区别
重写
- 发生在父类与子类之间
- 方法名,参数列表,返回类型 (方法签名)必须相同
- 访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
- 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
重载
- 发生在一个类中
- 同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
- 重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准
- 值传递和引用传递有什么区别?
Java 中所有的参数传递都是传递栈中的值, 而对于基本数据类型,栈中存放的是具体的值, 对于引用类型,栈中存放的是堆内存的地址。但是, 对于String,Integer等类型而言,其真实值使用final修饰,即我们常说的不变模式, 所以,不能用这些类型来验证值传递与引用传递
- 为什么ArrayList遍历快
ArrayList 底层是线性表, 使用 数组 作为元素的存储方式, 对于数组而言,在内存中是一段地址连续的空间, 可以使用首元素地址+偏移量的方式直接定位目标元素的内存地址。(这也是为什么下标从0开始的原因)。
- 静态变量和实例变量的区别
静态变量属于类,当类加载时被初始化, 并且只会实例化一次(因为类只会被加载一次)。通过类名访问
实例变量属于对象,当对象被创建时初始化,每个对象拥有自己的实例变量。通过对象访问。
- 抽象类和接口的区别?
- 接口是规范,抽象类是特殊的类
- 接口中不能有构造方法,抽象类中可以
- 接口中的方法都是抽象方法(JDK1.8+可以有default方法), 抽象类中可以有普通方法
- 接口中的属性必须是常量(static final), 抽象类中可以有普通属性
- 接口多实现, 类单继承
- hashmap的底层原理
HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。
HashMap由数组+链表组成的(JDK1.8增加了红黑树部分, 当链表长度>8时,转换为红黑树) 数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的
- try catch finally块 catch能否同时捕获多个异常及子类父类的排列顺序
能。子类在前,父类在后
- error与exception
Error :
虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
Exception:
在Exception分支中有一个重要的子类RuntimeException(运行时异常)。异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生
- 八大基本数据类型与其包装类,以及二者的区别
byte short int char long float double boolean
Byte Short Integer Character Long Float Double Boolean
区别见 int 和 Integer 区别
- 运行时异常与编译时异常 举例
RuntimeException:
NullPointer ArrayIndexOutOfBounds ...
Exception
SQL IO ClassNotFound FileNotFound
- 常用的集合及其特征
List: 有序和重复 Set: 无序不可重复
Map:键值对
Queue:FIFO (First In First Out)
Stack: FILO (First In Last Out)
- Map怎么遍历输出
KeySet EntrySet Values
- HashMap怎么变成线程安全的
Map map = Collections.synchronizedMap(new HashMap());
- ArrayList和Vector哪个是线程安全的
Vector
- java数据类型分为几大类
三大类:基本数据类型,引用类型,空类型
- hashmap的初始值多少?什么情况下扩容?扩容机制,扩容之后值是多少?
新建的HashMap容量为16。系数(扩容因子)为0.75。
当第一次扩容时目前的元素数量>=16*0.75时,会将HashMap的容量扩大一倍(x2)。
- hashcode和equals
hashcode 返回一个int值, 作用为提高hash散列表(hashMap和hashSet底层)的效率, 不同对象的hashcode值建议不相同。(可以相同,但是无法提高hash表效率)。重写equals一定要重写hashcode,原因见下一题。
- HashSet如何判断元素不可重复
- 获取元素Key的hashCode值
- 根据hash散列算法,算出 哈希表的索引值
- 判断该位置是否已经有元素:
- 没有:直接放入该位置 --》 结束
- 有:调用已有对象的equals方法(或者 == 运算符)和要放入的对象比较
- 返回true : 使用要放入的元素覆盖原有值 --》 结束
- 返回false:在当前位置下,以链表的形式追加(在jdk8+,对其做了优化,当链表长度大于等于8的时候,会将其数据结构重构为 平衡二叉树)
- 结束
- java中的排序算法
能够默写冒泡排序代码
能够讲出快速排序和希尔排序以及堆排序的原理(最好能够默写)
- 对finally,在结构中能不能省略?
finally 不论是否出现异常,都会执行的代码块,在结构中可以省略,如果try中有return,先执行return,再执行finally。
return是将返回值放到方法的返回区,并不是立即返回。
- IO使用过哪些对象?
BufferedReader / BufferedWriter: 按行读写
FileInputStream / FileOutputStream 基础节点流
ByteArrayInputStream / ByteArrayOutputStream 内存流
RandomAccessFile 随机读写流,唯一一个能对同一个文件同时进行读写操作的流。
- double和float有什么区别
精度不同, double为双精度, float为单精度
- long,short,char有什么区分
short , char 底层都是int , 三者表示的范围不同
- 数据库连接池概念
一次性向数据库申请多个连接对象,缓存在池中,每次需要使用连接对象时直接从池中获取, 节省了频繁向数据库申请连接的时间。
常用连接池: dbcp / c3p0 / druid
- java中xml文件解析常用方式,有何区别
jdom / dom4j : 基于Document 模型解析XML
SAX: 基于DOM事件解析XML
Digester: 基于DOM与JavaBean 映射关系解析DOM
- 说一下double和decimal数据类型哪个更精确?
decimal更精确
以上是关于Java基础面试题的主要内容,如果未能解决你的问题,请参考以下文章