【Java面试题总结 1】Java基础篇,2024年最新2024金三银四面试季

不属于。

八种基本数据类型:byte、short、char、int、long、double、float、boolean。

六、String str="i"与 String str=new String(“i”)一样吗?


String str="i"会将起分配到常量池中,常量池中没有重复的元素,如果常量池中存中i,就将i的地址赋给变量,如果没有就创建一个再赋给变量。

String str=new String(“i”)会将对象分配到堆中,即使内存一样,还是会重新创建一个新的对象。

七、如何将字符串反转?


将对象封装到stringBuilder中,调用reverse方法反转。

八、String 类的常用方法都有那些?


1、常见String类的获取功能

  • length:获取字符串长度;

  • charAt(int index):获取指定索引位置的字符;

  • indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引;

  • substring(int start):从指定位置开始截取字符串,默认到末尾;

  • substring(int start,int end):从指定位置开始到指定位置结束截取字符串;

2、常见String类的判断功能

  • equals(Object obj): 比较字符串的内容是否相同,区分大小写;

  • contains(String str): 判断字符串中是否包含传递进来的字符串;

  • startsWith(String str): 判断字符串是否以传递进来的字符串开头;

  • endsWith(String str): 判断字符串是否以传递进来的字符串结尾;

  • isEmpty(): 判断字符串的内容是否为空串"";

3、常见String类的转换功能

  • byte[] getBytes(): 把字符串转换为字节数组;

  • char[] toCharArray(): 把字符串转换为字符数组;

  • String valueOf(char[] chs): 把字符数组转成字符串。valueOf可以将任意类型转为字符串;

  • toLowerCase(): 把字符串转成小写;

  • toUpperCase(): 把字符串转成大写;

  • concat(String str): 把字符串拼接;

4、常见String类的其他常用功能

  • replace(char old,char new) 将指定字符进行互换

  • replace(String old,String new) 将指定字符串进行互换

  • trim() 去除两端空格

  • int compareTo(String str) 会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果,如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果,如果连个字符串一摸一样 返回的就是0。

九、new String(“a”) + new String(“b”) 会创建几个对象?


对象1:new StringBuilder()

对象2:new String(“a”)

对象3:常量池中的"a"

对象4:new String(“b”)

对象5:常量池中的"b"

深入剖析:StringBuilder中的toString():

对象6:new String(“ab”)

强调一下,toString()的调用,在字符串常量池中,没有生成"ab"

附加题:

String s1 = new String(“1”) + new String(“1”);//s1变量记录的地址为:new String

s1.intern();//在字符串常量池中生成"11"。如何理解:jdk6:创建了一个新的对象"11",也就有新的地址;jdk7:此时常量池中并没有创建"11",而是创建了一个指向堆空间中new String(“11”)的地址;

String s2 = “11”;

System.out.println(s1 == s2);//jdk6:false;jdk7:true

十、如何将字符串反转?


添加到StringBuilder中,然后调用reverse()。

十一、String 类的常用方法都有那些?


equals、length、contains、replace、split、hashcode、indexof、substring、trim、toUpperCase、toLowerCase、isEmpty等等。

十二、普通类和抽象类有哪些区别?


  1. 抽象类不能被实例化;

  2. 抽象类可以有抽象方法,只需申明,无须实现;

  3. 有抽象方法的类一定是抽象类;

  4. 抽象类的子类必须实现抽象类中的所有抽象方法,否则子类仍然是抽象类;

  5. 抽象方法不能声明为静态、不能被static、final修饰。

十三、接口和抽象类有什么区别?


1、接口

  • 接口使用interface修饰;

  • 接口不能实例化;

  • 类可以实现多个接口;

  • ①java8之前,接口中的方法都是抽象方法,省略了public abstract。②java8之后;接口中可以定义静态方法,静态方法必须有方法体,普通方法没有方法体,需要被实现;

2、抽象类

  • 抽象类使用abstract修饰;

  • 抽象类不能被实例化;

  • 抽象类只能单继承;

  • 抽象类中可以包含抽象方法和非抽象方法,非抽象方法需要有方法体;

  • 如果一个类继承了抽象类,①如果实现了所有的抽象方法,子类可以不是抽象类;②如果没有实现所有的抽象方法,子类仍然是抽象类。

十四、java 中 IO 流分为几种?


1、按流划分,可以分为输入流和输出流;

2、按单位划分,可以分为字节流和字符流;

字节流:inputStream、outputStream;

字符流:reader、writer;

十五、BIO、NIO、AIO 有什么区别?


1、同步阻塞BIO

一个连接一个线程。

JDK1.4之前,建立网络连接的时候采用BIO模式,先在启动服务端socket,然后启动客户端socket,对服务端通信,客户端发送请求后,先判断服务端是否有线程响应,如果没有则会一直等待或者遭到拒绝请求,如果有的话会等待请求结束后才继续执行。

2、同步非阻塞NIO

NIO主要是想解决BIO的大并发问题,BIO是每一个请求分配一个线程,当请求过多时,每个线程占用一定的内存空间,服务器瘫痪了。

JDK1.4开始支持NIO,适用于连接数目多且连接比较短的架构,比如聊天服务器,并发局限于应用中。

一个请求一个线程。

3、异步非阻塞AIO

一个有效请求一个线程。

JDK1.7开始支持AIO,适用于连接数目多且连接比较长的结构,比如相册服务器,充分调用OS参与并发操作。

十六、Files的常用方法都有哪些?


  1. exist

  2. createFile

  3. createDirectory

  4. write

  5. read

  6. copy

  7. size

  8. delete

  9. move

十七、什么是反射?


所谓反射,是java在运行时进行自我观察的能力,通过class、constructor、field、method四个方法获取一个类的各个组成部分。

在Java运行时环境中,对任意一个类,可以知道类有哪些属性和方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于反射机制。

十八、什么是 java 序列化?什么情况下需要序列化?


序列化就是一种用来处理对象流的机制。将对象的内容流化,将流化后的对象传输于网络之间。

序列化是通过实现serializable接口,该接口没有需要实现的方法,implement Serializable只是为了标注该对象是可被序列化的,使用一个输出流(FileOutputStream)来构造一个ObjectOutputStream对象,接着使用ObjectOutputStream对象的writeObejct(Object object)方法就可以将参数的obj对象到磁盘,需要恢复的时候使用输入流。

序列化是将对象转换为容易传输的格式的过程。

例如,可以序列化一个对象,然后通过HTTP通过Internet在客户端和服务器之间传输该对象。在另一端,反序列化将从流中心构造成对象。

一般程序在运行时,产生对象,这些对象随着程序的停止而消失,但我们想将某些对象保存下来,这时,我们就可以通过序列化将对象保存在磁盘,需要使用的时候通过反序列化获取到。

对象序列化的最主要目的就是传递和保存对象,保存对象的完整性和可传递性。

譬如通过网络传输或者把一个对象保存成本地一个文件的时候,需要使用序列化。

十九、为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么?


1、什么要使用克隆?

想对一个对象进行复制,又想保留原有的对象进行接下来的操作,这个时候就需要克隆了。

2、如何实现对象克隆?

  1. 实现Cloneable接口,重写clone方法;

  2. 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深克隆。

  3. BeanUtils,apache和Spring都提供了bean工具,只是这都是浅克隆。

3、深拷贝和浅拷贝区别是什么?

  • 浅拷贝:仅仅克隆基本类型变量,不克隆引用类型变量;

  • 深克隆:既克隆基本类型变量,又克隆引用类型变量;

4、代码实例



二十、throw 和 throws 的区别?


1、throw

  • 作用在方法内,表示抛出具体异常,由方法体内的语句处理;

  • 一定抛出了异常;

2、throws

  • 作用在方法的声明上,表示抛出异常,由调用者来进行异常处理;

  • 可能出现异常,不一定会发生异常;

二十一、final、finally、finalize 有什么区别?


final可以修饰类,变量,方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写

finally用于抛异常,finally代码块内语句无论是否发生异常,都会在执行finally,常用于一些流的关闭。

finalize方法用于垃圾回收。

一般情况下不需要我们实现finalize,当对象被回收的时候需要释放一些资源,比如socket链接,在对象初始化时创建,整个生命周期内有效,那么需要实现finalize方法,关闭这个链接。

但是当调用finalize方法后,并不意味着gc会立即回收该对象,所以有可能真正调用的时候,对象又不需要回收了,然后到了真正要回收的时候,因为之前调用过一次,这次又不会调用了,产生问题。所以,不推荐使用finalize方法。

二十二、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?


二十三、常见的异常类有哪些?


  1. NullPointerException:空指针异常;

  2. SQLException:数据库相关的异常;

  3. IndexOutOfBoundsException:数组下角标越界异常;

  4. FileNotFoundException:打开文件失败时抛出;

  5. IOException:当发生某种IO异常时抛出;

  6. ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出此异常;

  7. NoSuchMethodException:无法找到某一方法时,抛出;

  8. ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常;

  9. NumberFormatException:当试图将字符串转换成数字时,失败了,抛出;

  10. IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。

  11. ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。

二十四、hashcode是什么?有什么作用?


Java中Object有一个方法:

public native int hashcode();

1、hashcode()方法的作用

hashcode()方法主要配合基于散列的集合一起使用,比如HashSet、HashMap、HashTable。

当集合需要添加新的对象时,先调用这个对象的hashcode()方法,得到对应的hashcode值,实际上hashmap中会有一个table保存已经存进去的对象的hashcode值,如果table中没有改hashcode值,则直接存入,如果有,就调用equals方法与新元素进行比较,相同就不存了,不同就存入。

2、equals和hashcode的关系

如果equals为true,hashcode一定相等;

如果equals为false,hashcode不一定不相等;

如果hashcode值相等,equals不一定相等;

如果hashcode值不等,equals一定不等;

3、重写equals方法时,一定要重写hashcode方法

4、百度百科

hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。

hashCode 的常规协定是:

在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。

以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

5、小白解释

1.hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有

例如内存中有这样的位置

0  1  2  3  4  5  6  7

而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法。

但如果用hashcode那就会使效率提高很多。

我们这个类中有个字段叫ID,那么我们就定义我们的hashcode为ID%8,然后把我们的类存放在取得得余数那个位置。比如我们的ID为9,9除8的余数为1,那么我们就把该类存在1这个位置,如果ID是13,求得的余数是5,那么我们就把该类放在5这个位置。这样,以后在查找该类时就可以通过ID除 8求余数直接找到存放的位置了。

2.但是如果两个类有相同的hashcode怎么办那(我们假设上面的类的ID不是唯一的),例如9除以8和17除以8的余数都是1,那么这是不是合法的,回答是:可以这样。那么如何判断呢?在这个时候就需要定义 equals了。

也就是说,我们先通过 hashcode来判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过 equals 来在这个桶里找到我们要的类。

那么。重写了equals(),为什么还要重写hashCode()呢?

想想,你要在一个桶里找东西,你必须先要找到这个桶啊,你不通过重写hashcode()来找到桶,光重写equals()有什么用啊。

二十五、java 中操作字符串都有哪些类?它们之间有什么区别?


1、String

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

分享

首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:

(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)

其次分享一些技术知识,以截图形式分享一部分:

Tomcat架构解析:

算法训练+高分宝典:

Spring Cloud+Docker微服务实战:

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

Java高级架构面试知识整理:

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:**

(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)

其次分享一些技术知识,以截图形式分享一部分:

Tomcat架构解析:

[外链图片转存中…(img-J6pxH4v0-1712789972552)]

算法训练+高分宝典:

[外链图片转存中…(img-5oT0o5hQ-1712789972552)]

Spring Cloud+Docker微服务实战:

[外链图片转存中…(img-0BMzHtw6-1712789972553)]

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

[外链图片转存中…(img-dh7s5ymY-1712789972553)]

Java高级架构面试知识整理:

[外链图片转存中…(img-V6VgqZOs-1712789972553)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-TuxjmpTk-1712789972553)]

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值