JAVA面试必刷题

本文主要探讨Java面试中常见的问题,包括JDK与JRE的区别、基本数据类型与引用数据类型的辨析、==与equals的区别、String类常用方法、接口与抽象类的不同、List、Set、Map的区别以及HashMap的实现原理等核心概念。此外,还涉及线程、进程、ArrayList与LinkedList的差异以及线程创建方式等知识点。
  • Java基础

  1. JDK 和 JRE 有什么区别?

JDK是整个java的核心,是Java开发工具包,包括JRE,Java工具和一些基础类库。

JRE是运行Java程序所必须环境集合,包含了JVM和Java程序的核心类库。

JVM是整个Java实现跨平台的最核心部分,能够在不同系统中运行以Java编写的Java程序。

  1. 如何区分基本数据类型和引用数据类型?

  1. 基本数据类型:基本数据类型分为8种,除了8种基本类型,其他所有数据类型都是引用数据类型。

(1)整数类型:Long、int 、short、byte

(2)浮点类型:float、double

(3)字符类型:char

(4)布尔类型:boolean

  1. 引用数据类型:引用数据类型非常多,大致包括:

类、接口类型、数组类型、枚举类型、注解类型、字符串型(例:String类型就是引用类型)

  1. 基本数据类型和引用数据类型的区别:

基本数据类型

在方法中定义的基本数据类型具体内容是存储在栈当中中。

引用数据类型

引用类型的具体内容则存储在堆内存中,而栈中存储的是它存放的内存地址

  1. == 和 equals 的区别是什么?

代码解读:

A和B都指向同一个引用地址,所以A==B的结果为true,而C则是通过关键字new出来的,就会在堆内存中开辟一块新的空间,所以A==C的结果为false。

equals方法它默认比较的是引用地址,只不过是String和Integer对equals方法进行了重写,改变为值的比较,所以输出结果均为true。

  • ==在比较基本类型和引用类型中具有不同的效果:

  1. 基本类型:比较的是值

  1. 引用类型:比较的是内存地址值

  • equals

equals本质上就是==,只不过是String 和Integer对equals方法进行了重写,比较的是值,equals默认比较的是对象的内存地址值也就是引用地址。一般情况下equals方法比较的是值。

  1. Java 中操作字符串都有哪些类?它们之间有什么区别?

  1. String、StringBuffer、StringBuilder的区别:

(1)可变性

String类由final关键字字符数组保存字符串,所以说是String对象是不可变的。

StringBuffer和StringBuilder都是继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,但是没有使用final关键字修饰,所以这两种对象是可以在原有对象的基础上进行操作。

(2)线程安全

String中的对象是不可变,也就是常量,所以线程安全的。

StringBuffer对方法或者对调用的方法加了同步锁,所以是线程安全的。

StringBuilder并没有对方法加锁,所以是非线程安全的。

(3)性能

String类在进行改变时会重新创建一个新的String对象,并将指针指向新的String对象。

StringBuffer在进行对象改变时,并没有去创建新的对象而是在对象本身进行操作。

相同情况下:StringBuffer由于加了同步锁的原因,StringBuilder的效率比StringBuffer性能高10%-15%左右,但是要冒线程不安全的风险。

  1. String 类的常用方法都有那些?

  1. indexOf():返回指定字符的索引

  1. trim():去除两端空白

  1. charAt():返回指定索引位置字符

  1. length():返回字符串长度

  1. split():分割字符串,返回切割后的字符串数组

  1. substring():截取字符串

  1. equals():字符串比较

  1. 接口和抽象类有什么区别?

  1. 实现:接口基于implements实现接口,抽象类基于extends来继承。

  1. 构造方法:接口中不能有构造方法,抽象类可以有构造方法。

  1. 实现数量:一个类可以实现多个接口,但是只能继承一个抽象类。

  1. 修饰符:抽象类中的方法可以是任意修饰符,而接口中方法默认public来修饰。

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

  1. List和Set都属于单列集合,而Map是通过以Key-Value的方式存储的双列集合。

  1. List存储的数据是有序且可以重复的,Set所存储的数据是无序的,且不可以重复。

  1. Map中存储的数据也是无序的,但是Key不可以重复,Value允许重复。

  1. HashMap 和 Hashtable 有什么区别?

  1. 数据结构

HashMap在JDK 8版本之后,对底层数据结构进行了优化,引入红黑树,而HashTable则没有这样的机制,并且可以看到HashTable为保留类,不建议使用。

  1. 对null值和null键的支持

HashMap中是允许null值和null键的,而HashTable不允许有null值和null键,否则会报空指针异常。

  1. 初始容量及扩容机制

HashMap初始容量为16,每次扩容为原来的2倍

HashTable初始容量为11,每次扩容为原来的2n+1

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

  1. HashMap继承自AbstractMap实现了Map接口,基于Hash算法实现,我们通过调用put(key,value)方法存储,通过get(key,value)方法取。

  1. 首先将键值对封装到一个Node对象中,先调用key.hashCode()方法得到hash值,然后通过hash算法转换成数的下标。

  1. 如果下标位置上没有任何元素,就将Node添加到该位置,如果下标位置上有元素,此时就将key拿着与其他元素的每个key进行equals比较,如果所有返回值为false,那么就将元素添加到末尾,如果其中一个返回值为true,那么就会覆盖这个元素。

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

区别

ArrayList

LinkedList

数据结构

数组

双向链表

随机访问时间

快,根据数组下标访问

慢,要沿着链表进行遍历

增删改查

默认添加到素组尾部,尾部删除性能可以,其他部分插入,删除都会移动数据,性能较低

头、尾部插入删除性能高,受位置影响,其他位置需要遍历整个链表

内存

需要连续的内存

基于双向链表实现,占用内存大

  1. 线程和进程的区别?

  1. 进程:是正在运行的软件。

具有以下特性:

(1)独立性:进程是一个可以独立运行的基本单位,同时也是系统分配资源和调度的独立单位。

(2)动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的。

(3)并发性:任何进程都可以同其他进程一起并发执行。

  1. 线程:是进程中的单个顺序控制流,是一条执行路径。

(例:我们打开某一个软件,其实就是开了一个进程,而软件的每个功能则可以称之为线程。)

  1. 创建线程有哪几种方式?

  1. 继承Thread类重写run方法

  1. 实现Callable接口

  1. 实现Runable接口

  1. 线程池创建

  1. Runable和Callable的区别?

Runable无返回值,Callable有返回值

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值