2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 【Java面试经验】JAVA基础部分(从入门到放弃)

【Java面试经验】JAVA基础部分(从入门到放弃)

时间:2022-01-23 05:01:17

相关推荐

【Java面试经验】JAVA基础部分(从入门到放弃)

写在最前:这些都是面试的时候整理的题目,所有的题目来源于网上,几乎包含了Java面试所有的实体,自己进行了部分答案的编写。

PS:小伙伴们如果有不懂的地方可以在评论进行留言,也可以对未作答的题目进行补充,我会持续进行更新。

MarkDown下载地址:【Java面试经验】JAVA基础部分(从入门到放弃)

结合另一篇文章食用更为妥当

【Java面试经验】JUC部分(对应周阳老师的面试教程)

一、Java 基础

1.JDK和JRE有什么区别

JDK是Java Development Kit 的缩写,包含了Java开发的基础类库,开发环境和运行环境,主要面向开发人员

JRE是Java RunTime Environment的缩写,包含了Java的运行环境,主要面向用户

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

​ == 作用于基本数据类型时,比较的是变量的值,作用于引用类型时,比较的是变量的地址

​ equals只作用于引用类型,String和Data类重写了equals方法,所以一般比较的是变量的值

3.两个对象的 hashCode相同,则 equals也一定为 true,对吗?

​ 不一定,hashCode比较的是哈希值,equals比较的是引用的地址

​ hashCode和equals都是可以自定义的

​ 但是一般规定equals相等的变量,hashCode也要相等,equals不相等的变量,不要求hashCode一定相等

​ 所以在重写equals方法时也要修改hashCode方法

4.final 在 java 中有什么作用?

​ final主要修饰类,方法和变量

​ 在修饰类时,表示该类不可以被继承

​ 在修饰方法时,表示该方法不可以被重写

​ 在修饰变量时,表示对象的引用不能被修改,但是值可以被修改,因为内存地址中保存的值可以被改变,final 主要是保证改变变量值时,变量对应的内存地址是不变的

5.java 中的 Math.round(-1.5) 等于多少?

​ round是四舍六入五成双,对于五,则加0.5后取整 -1.5+0.5= -1

6.String 属于基础的数据类型吗?

​ 不属于,Java总共有8种基本类型,除了基本数据类型都是引用数据类型

​ 整型:byte short int long

​ 浮点型:float double

​ 字符型:char

​ 布尔类型:boolean

​ String是使用final修饰的引用类型

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

​ String StringBuffer StringBuilder

​ String类使用final修饰,不能被更改,性能比较低,内存占用更高,每次使用都会New一个新的对象

​ StringBuffer和StringBuilder加强了对字符串的操作,可以更改,但是StringBuffer使用了synchronized方法, 更加安全,适合多线程,如果是单线程可以使用StringBuilder

8.String str="i"与 String str=new String(“i”)一样吗?(不熟悉)

​ 不一样,String str = "i"首先会在常亮池中去寻找有没有i,如果不存在,则开辟空间保存i,如果存在就不会开辟 新的空间,而是在栈内存中开辟一个str的空间去存储i的地址值

​ new String(“i”)也是会先查找有没有i,如果没有,开辟空间保存i,在运行时,通过String类的构造器在堆内存中 new了一个空间,然后将常量池中的i复制一份放到该堆中,在栈中开辟名为str的空间,存放堆中这个对象的地 址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZxQ4SDD-1594003559111)(C:\Users\WHB\AppData\Roaming\Typora\typora-user-images\image-150139851.png)]

​ 注:栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等

​ 堆:为成员分配和释放,由程序员自己申请、自己释放。否则发生内存泄露。典型为使用new申请的堆内 容。

9.如何将字符串反转?

​ 使用SpringBuffer或StringBuilder的reverse方法,本质上调用的都是他们的父类AbstractStringBuilder

​ 或者自己实现,以递归写法为例

public String reverseByRecursion(String str) {int length = str.length();if (length <= 1) {return str;}return reverseByRecursion(str.substring(1) ) + str.charAt(0);}

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

​ 字符串的获取:

​ length() 获取长度

​ charAt() 获取指定索引位置的值

​ indexOf() 获取本字符首次出现的索引位置,如果没有返回-1

​ 字符串的截取:

​ substring(int index) 截取从参数位置一直到最后

​ substring(int begin,int end) 返回begin到end包含左边不包含右边

​ 字符串的转换:

​ char[] toCharArray() 将当前字符串转化成字符数组

​ replace() 将老字符串替换为新的字符串

​ 分割字符串:

​ split(String regex) 按照参数的格式将字符串分割为若干部分,返回一个字符数组,参数可以是正则表达式

**11.抽象类必须要有抽象方法吗?**1111

​ 不必须,抽象类不一定需要有抽象方法,但是有抽象方法的一定要是抽象类

**12.普通类和抽象类有哪些区别?**1111

​ 抽象类必须要有abstract关键字来修饰

​ 抽象类不能被实例化

​ 抽象类可以有抽象方法,抽象方法只需要声明,不需要实现

​ 抽象方法不能被声明为静态的,不能使用private修饰,不能使用final修饰(final修饰的类不能被继承)

13.抽象类能使用 final 修饰吗?

​ 不能 考察点:final关键字的作用

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

​ 接口使用interface修饰,抽象类使用abstract修饰

​ 接口中均为抽象方法,抽象类中既可以有抽象方法也可以对方法进行实现

​ 接口要被类实现,抽象类要被类继承

​ 接口中的成员变量只能是static final类型的,遵从开放封闭原则(认为是要变化的东西,就放在你自己的实现中,不能放在接口中去,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现 implements)开放,接口是对开闭原则的一种体现。)

​ 一个类可以继承一个抽象类,但是可以实现多个接口

15.java 中 IO 流分为几种?

​ 分为两种,一种是字节流,一种是字符流

​ 每种流都有输入和输出,主要对应四个抽象类

​ InputStrem OutputStrem Reader Writer

​ 字节流可以用于任何的对象,包括二进制对象,而字符流只能处理字符或者字符串

BIO、NIO、AIO 有什么区别?

实现过程详解

​ BIO:Bolck IO 同步阻塞式IO,数据的读写必须阻塞在下一个线程内等待其完成

​ BIO模型模拟:创建ServerSocket设置监听端口,使用accept函数循环等待,如果有客户端连接则创建 一个线程进行处理

​ NIO:Non-Bolck(NEW) IO 同步非阻塞式IO

​ 三大核心 Channel(通道) Buffer(缓冲区) Selector(选择器)

​ AIO:Asynchronous IO 异步非阻塞式IO

同步:同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。异步:异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。阻塞:阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续非阻塞:非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。

17.Files的常用方法都有哪些?

Files.exists() 检测文件路径是否存在Files.createFile()创建文件Files.createDirectory()创建文件夹Files.delete() 删除文件或者目录Files.copy() 复制文件Files.move() 移动文件Files.size查看文件个数Files.read() 读取文件Files.write()写入文件

二、容器

18.java 容器都有哪些?

​ java容器类类库的用途是"保存对象"。摘自: “Thinking in Java”

​ 数组,String,java.util下的集合容器

​ 数组长度限制为 Integer.Integer.MAX_VALUE

​ String的长度限制: 底层是char 数组 长度 Integer.MAX_VALUE 线程安全的

​ Collection接口下的List,Set,Queue.和Map

​ List:存放有序,列表存储,元素可重复

​ Set:无序,元素不可重复

​ Map:无序,元素可重复

​ 解析

​ 注:Integer.MAX_VALUE = 2的32次方-1

​ 第一位是符号位(0是正数,1是负数),后面的31位是数字位,所以最大的正数是011111……111,0 后面总共31个1,就是2的32次方-1

**19.Collection 和 Collections 有什么区别?**1111

Java.util.Collection是一个集合接口, 定义了一些集合操作的通用方法,如size(),isEmpty()等。

​ List,Set,Queue都继承了Collection类,该类的作用是为各个集合提供了统一的操作方式。

Java.util.Collections是一个针对Collection 的工具类,包含了有关集合操作的各种静态方法,如排序搜索等。

静态方法和普通方法的主要区别:静态方法在创建对象前就可以使用了,非静态方法必须通过new出来的对象调用。 静态方法可以通过 类名::方法名直接调用。普通方法需要创建一个实例,也就是new一个对象,然后通过 对象名->方法名的方式来调用

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

List按线性方式存储,是有序的,Set和Map是无序的,但是LinkedHashSet按照元素的插入顺序进行排序,TreeMap根据键对其中的元素进行升序排序。

List里的值可以重复,Set不允许有重复对象,Map是以键值对的形式存储的,不允许有重复的键,但是键值可以重复。

List允许多个null元素,Set只允许有一个null元素,Map只允许出现一个空键,但允许出现多个空值。

21.HashMap 和 Hashtable 有什么区别?

HashMap 可以存储null值和null键,线程不安全,可以使用ConcurrentHashMap保证线程安全,锁分段技术(数组里存放的是Segment对象,每个对象里都保存了一个hashMap,在调用put方法时,只针对进行操作的segment进行加锁)

HashTable 不能存储null,线程安全,实现线程安全时是在修改数据的时候锁住整个HashTable,效率低

22.如何决定使用 HashMap 还是 TreeMap?

HashMap是链式数组,可以快速的获取key对应的value,但是不支持排序,查询多的时候使用HashMap

TreeMap底层是红黑树,是一颗自平衡的二叉树,如果需要一个有序的结果,就使用TreeMap

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

HashMap本质上是基于哈希表(散列表)的Map接口实现,使用数组加链表进行存储,当使用put(key,value)方法添加数据时,它调用键对象的hashCode()方法返回一个hashCode用于找到bucket位置来存储Entry对象。

当使用get(key)方法查找数据时,还是首先计算键的hashCode值,然后在bucket中找到对应的位置,如果后面没有Entry,就返回null,如果有,就使用equals方法比较当前key和要查找的key,如果返回true,则查找成功,否则将一直查找到链表最后。

如果两个对象的hashCode相同,他们的bucket位置就会相同,就会产生碰撞(冲突),在冲突个数比较少的时候HashMap是使用拉链法来解决冲突的,多的时候使用红黑树,当我们使用get方法获取对象时,找到bucket位置之后,会调用keys.equals()方法去在链表中找到正确的节点

24.说一下 HashSet 的实现原理?

HashSet是基于HashMap来实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75的HashMap。

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

ArrayList和LinkedList都是不安全的

ArrayList底层使用的是Object数组,LinkedList在JDK1.6之前使用的是双向链表,JDK1.7取消了循环

进行插入和删除时,ArrayList受元素位置的影响,如果在最后一个就需要遍历到最后一个,LinkedList因为使用的链表,所以插入和删除不受元素位置的影响

26.如何实现数组和 List 之间的转换?

27.ArrayList 和 Vector 的区别是什么?

Vector是现成安全的,使用synchronized实现线程安全

数据容量增长时,Vector会增长原来的一倍,ArrayList会增长原来的0.5倍

28.Array 和 ArrayList 有何区别?

29.在 Queue 中 poll()和 remove()有什么区别?

30.哪些集合类是线程安全的?

31.迭代器 Iterator 是什么?

32.Iterator 怎么使用?有什么特点?

33.Iterator 和 ListIterator 有什么区别?

34.怎么确保一个集合不能被修改?

三、多线程

并行和并发有什么区别?

并发:一个处理器可以同时处理多个任务。这是逻辑上的同时发生。指同一时刻只能够执行一条指令,但是多条指令被快速的进行切换,给人造成了它们同时执行的感觉。但在微观来说,并不同同时进行的,只是划分时间段,分别进行执行。并行:多个处理器同时处理多个不同的任务。这是物理上的同时发生。在同一时刻,有多条指令在多个处理器上同时执行。有一个清晰地比喻:

并发:一个人同时吃三个苹果。并行:三个人同时吃三个苹果。

线程和进程的区别?

进程是CPU调度的基本单位,线程是程序执行的基本单位一个进程中可以有多个线程,且至少会有一个线程进程拥有独立的内存空间,所以他更加的稳定。多个线程共享一个进程的内存空间,他们是资源共享的,所以切换交流更加的方便,同时因为进程拥有独立的内存空间,所以进程如果挂掉了,那么程序也就终止了,但是进程可以有多个,一个进程挂了,可以由另外的进程代替他的工作。进程开销会很大,线程的开销比较小

守护线程是什么?

java中线程种分为守护线程Daemon和用户线程User。可以通过Thread.setDaemon(true)设置为守护线程,但是必须在start之前调用。

Daemon是为其他线程提供服务,如果全部用户线程结束,Daemon没有服务对象,也就没有继续运行程序的必要了。

守护线程最典型的应用就是 GC (垃圾回收器)

当 JVM 中不存在任何一个正在运行的非守护线程时,则 JVM 进程即会退出

创建线程有哪几种方式?

继承Thread类

实现runnale接口

实现callable接口

说一下 runnable 和 callable 有什么区别?

两者最大的不同点是:实现Callable接口的任务线程能返回执行结果;而实现Runnable接口的任务线程不能返回结果runnable使用run方法,callable使用call 方法Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出异常,可以获取异常信息

线程有哪些状态?

新建状态:新建线程对象,并没有调用start()方法之前

就绪状态:调用start()方法之后线程就进入就绪状态,但是并不是说只要调用start()方法线程就马上变为当前线程,在变为当前线程之前都是为就绪状态。值得一提的是,线程在睡眠和挂起中恢复的时候也会进入就绪状态哦。

运行状态:线程被设置为当前线程,开始执行run()方法。就是线程进入运行状态

阻塞状态:线程被暂停,比如说调用sleep()方法后线程就进入阻塞状态

死亡状态:线程执行结束

sleep() 和 wait() 有什么区别?

功能差不多,都用来进行线程控制,sleep()不释放同步锁,wait()释放同步缩

sleep只是将cpu释放给其他线程使用wait直接释放锁

还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。