2020JAVA面试基础总结

目录

 

1、Java的基本数据类型有哪些?各自占用了多少字节?

2、JDK与JRE有什么区别

3、Java语言有哪些特点

4、final在Java中有什么作用(这问题我上礼拜线上面试,技术问我着。。)

5、== 和 equals 的区别是什么?(这个线上面试也问来着)

6、Java面向对象编程的三大特征是什么?

7、hashCode 与 equals

8、String, Stringbuffer, StringBuilder 的区别?

9、抽象类与接口的区别

10、访问修饰符 public、private、protected、default分别都有什么作用? 

11、成员变量与局部变量的区别

12、Java异常

13、Java中的IO流

14、Java序列化问题

15、针对14的Java序列化问题,谈一下serialVersionUID的作用,Transient 关键字作用。

16、深拷贝和浅拷贝的区别是什么(针对序列化的拓展)

17、Java容器有哪些?

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

19、 哪些集合类是线程安全的?

20、如何实现数组和 List 之间的转换?

21、在 Queue 中 poll()和 remove()有什么区别?

 


1、Java的基本数据类型有哪些?各自占用了多少字节?

1)、四种整数类型(byte、short、int、long):    byte:8 位,用于表示最小数据单位,short:16 位,很少用,-32768 ~ 32767    int:32 位、最常用,-2^31-1~2^31  (21 亿)    long:64 位。

2)、两种浮点数类型(float、double):    float:32 位,后缀 F 或 f,1 位符号位,8 位指数,23 位有效尾数。    double:64 位。浮点数是不精准的,不能对浮点数进行精确比较。

3)、一种字符类型(char):    char:16 位,是整数类型,用单引号括起来的 1 个字符。

4)、布尔类型(boolean):true 真  和 false 假。

2、JDK与JRE有什么区别

通常情况下,我们在电脑上下载安装Java环境时,都会安装两个东西,以1.8版本为例子,会安装jdk1.8.0和jre1.8.0,那他们有什么区别呢?

JDK:简单来讲,他提供了Java的开发环境和运行环境。

JRE:他为Java的运行提供了相对应的环境。

jdk包含了jre,如果只是运行Java程序的话安装上jre就够了,但是咱们基本上都是开发人员,就得把jdk得装上了,因为咱得开发呀~

3、Java语言有哪些特点

这个问题,咱看过Java核心技术这本书的都知道,第一章就介绍到了这个知识点。

简单性、面向对象、分布式、健壮性、安全性、体系结构中立、可移植性、解释性、高性能、多线程、动态性。

4、final在Java中有什么作用(这问题我上礼拜线上面试,技术问我着。。)

1)、final修饰的类是最终类,该类不能被继承。

2)、final修饰的方法是不能被重写的。

3)、final修饰的变量叫做常量,他是固定不变的值,必须初始化。

其实挺好记下来的,final英文单字意思是最终的,老末呗,理解下来他修饰的东西就是不能被别人拿走。

5、== 和 equals 的区别是什么?(这个线上面试也问来着)

1)、功能不同,“==”是判断两个变量或者是实例是否是指向同一内存空间。

         equals是判断两个变量或者是实例所指向的内存空间的值是否相等。

2)、定义不同,equals是Java中的方法,“==”是Java中的运算符。

3)、equals本质上其实就是“==”,但是他是方法,可以重写,试用equals比较值会返回ture或者false。

6、Java面向对象编程的三大特征是什么?

  •   封装
  •   继承
  •   多态

7、hashCode 与 equals

    其实把hashCode方法跟equals方法,他们俩的作用是一样的,在Java中都是判断两个对象是否一致的。重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。

  但是这样就hashCode()中存在着一个问题,那就是他并不准确,有些时候,两个对象的 hashCode()相同,equals()不一定 true。因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

8、String, Stringbuffer, StringBuilder 的区别?

1)、运行速度:StringBuilder >StringBuffer >String。

2)、线程安全:StringBuilder是线程不安全的,而StringBuffer是线程安全的。

3)、String:适用于少量的字符串操作的情况、StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况、

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况。

9、抽象类与接口的区别

1)、抽象类需要子类使用extend来继承,接口需要implement来实现。

2)、接口只能作为方法的重申,不能有相关的构造方法,但是抽象类可以。

3)、类可以有多个接口,但是只能继承一个抽象类。

4)、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

5)、抽象类主要用来抽象类别,接口主要用来抽象功能。

6)、抽象类前面的访问修饰符(见9)可以是任何,但是接口默认的是public,(写代码的时候可以不写)

10、访问修饰符 public、private、protected、default分别都有什么作用? 

1)、public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。
2)、private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
3)、protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
4)、default:即不加任何访问修饰符,通常称为"默认访问模式"。该模式下,只允许在同一个包中进行访问。

11、成员变量与局部变量的区别

1)、类中的位置不同,成员变量一般在方法外,类内。局部变量则在方法当中。

2)、作用对象不同,成员变量一般是公有的而局部变量一般只是供给方法去使用的。

3)、生命周期不同,成员变量会随着对象的创建而创建,对象的消失而消失。局部变量只会在执行到对应方法的时候才会出现,出了这个区域就会马上从内存当中消失。

4)、初始值不同,成员变量是有默认的初始值的,但是局部变量没有,必须要初始化之后才能够使用。

12、Java异常

转自https://www.cnblogs.com/wrencai/p/5648442.html,这块我后面再整理,先看人家的。

13、Java中的IO流

1)、按照数据流方向可以分为:输入流(InputStream),输出流(outputStream)。

2)、按照类型分可以分为:字节流,字符流。 1字符 = 2字节 、 1字节(byte) = 8位(bit)  、 一个汉字占两个字节长度

他们俩有一个关于汉字的问题,字节流:每次读取(写出)一个字节,当传输的资源文件有中文时,就会出现乱码。字符流:每次读取(写出)两个字节,有中文时,使用该流就可以正确传输显示中文。

14、Java序列化问题

1)、序列化应用的场景:(1)永久的保存对象,保存对象的字节序列到本地文件或者是数据库中。(2)通过序列化使对象以字节流的形式再网络中进行传递和接收。(3)通过序列化在进程中传递对象。

2)、序列化的好处:(1)实现了数据的持久性,通过序列化可以将数据永久的保存在硬盘内。(2)利用序列化实现了远程的通信。

3)、Java序列化有两个接口,分别是Serializable和Externalizable接口。但他们俩也是有些区别的:

(1)Externalizable继承自Serializable接口

(2)需要我们重写writeExternal()与readExternal()方法

(3)实现Externalizable接口的类必须要提供一个public的无参的构造器。

15、针对14的Java序列化问题,谈一下serialVersionUID的作用,Transient 关键字作用。

1)、一句话:其目的是序列化对象版本控制,有关各版本反序列化时是否兼容。如果在新版本中这个值修改了,新版本就不兼容旧版本,反序列化时会抛出InvalidClassException异常。如果修改较小,比如仅仅是增加了一个属性,我们希望向下兼容,老版本的数据都能保留,那就不用修改;如果我们删除了一个属性,或者更改了类的继承关系,必然不兼容旧数据,这时就应该手动更新版本号,即SerialVersionUid。

serialVersionUID有两种显示的生成方式:

一是默认的1L,比如:private static final long serialVersionUID = 1L;

二是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,

2)、Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

16、深拷贝和浅拷贝的区别是什么(针对序列化的拓展)

1)、其实对象的克隆也就做对象的拷贝,拷贝来讲就分为了两种,深拷贝和浅拷贝。

浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。

深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。这个方式称为深拷贝。

浅拷贝存在对象拷贝不彻底问题。

2)、他们俩有什么区别呢:浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

17、Java容器有哪些?

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

  • List:有序集合,元素可重复
  • Set:不重复集合,LinkedHashSet按照插入排序,SortedSet可排序,HashSet无序
  • Map:键值对集合,存储键、值和之间的映射;Key无序,唯一;value 不要求有序,允许重复

本截图来源: https://blog.csdn.net/u012102104/article/details/79235938

19、 哪些集合类是线程安全的?

1、vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
2、statck:堆栈类,先进后出。
3、hashtable:就比hashmap多了个线程安全。
4、enumeration:枚举,相当于迭代器。

20、如何实现数组和 List 之间的转换?

1、List转换成为数组:调用ArrayList的toArray方法。

2、数组转换成为List:调用Arrays的asList方法。

21、在 Queue 中 poll()和 remove()有什么区别?

poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

 

关于Java多线程问题,我会另外再写一个的,这边主要去总结关于Java基础方面的一些基本知识点,包括面试的时候会用到的知识。

更多详细的信息,请看这里:https://blog.csdn.net/qq_41790332/article/details/105254057


 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值