查看原文
其他

Java基础篇——Java开发面试题1期

Java精选 2022-08-09


Java面试前需要做足各方面的准备工作,肯定都会浏览大量的面试题,本人也不例外,通过浏览面试题和以往的面试经历,总结了从初级到中级以及高级的面试题,供大家学习讨论。


Java中java.util.Comparator接口简单描述一下?

点击下方空白区域查看答案解析!

java.util.Comparator是比较器接口,如果我们需要控制某个类的次序并且该类本身不支持排序,那么就可以建立一个类比较器来进行排序,实现方式很简单只需要实现java.util.Comparator接口。


java.util.Comparator接口只包括两个函数,它的源码如下:

package java.util;    

public interface Comparator<T> {    

    int compare(T o1, T o2);    

    boolean equals(Object obj);    

}    


1)若一个类要实现java.util.Comparator接口:它一定要实现int compare(T o1, T o2) 函数,而另一个可以不实现boolean equals(Object obj) 函数


2)int compare(T o1, T o2) 是比较o1和o2的大小


如果返回值为负数意味着o1比o2小,否则返回为零意味着o1等于o2,返回为正数意味着o1大于o2

String类为什么是final的?

点击下方空白区域查看答案解析!

答案一:
String类型是对象类型,在静态方法下必须调用静态方法或值,如果非静态的方法,必须实例化;
main函数是static的,所以String可以和其他类型一样被直接调用,不会报错误的原因

答案二:
主要考虑到“安全”和“效率”的缘故,若String允许被继承,那么它的高度使用率可能会降低程序的性能,因此String被定义成了final。

更多资料:
https://www.zhihu.com/question/31345592

什么是序列化以及用途,什么时候使用序列化?

点击下方空白区域查看答案解析!

序列化是指把对象转换为字节序列的过程称为对象的序列化;而反序列化是指把字节序列恢复为对象的过程称为对象的反序列化。


对象的序列化主要有两种用途:

1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

2)在网络上传送对象的字节序列。


什么时候使用序列化:

1)对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。

2)java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。


用简洁的话描述一下关于Spring的IOC与AOP?

点击下方空白区域查看答案解析!

IoC就是对象的创建,依赖都由Spring及配置文件控制;而AOP就是统一的给一些类似的方法加上同样的功能,比如日志,事务。


IOC:控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制;


第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系。他们的依赖关系只在使用的时候才建立。


AOP:面向切面,是一种编程思想,OOP的延续。将系统中非核心的业务提取出来,进行单独处理。比如事务、日志和安全等。

Java虚拟机内存的堆区(heap),栈区(stack)和静态区(static/method)

点击下方空白区域查看答案解析!

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)


堆区:

1)存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)

2)jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身.

3)一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。


栈区:

1)每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中

2)每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

3)栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

4)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。


静态区别名方法区:

1)方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

2)方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

3)全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

Java中HashMap和HashTable的区别?

点击下方空白区域查看答案解析!

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。


HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。


最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap)。 


Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

cookie和session的的区别有哪些?

点击下方空白区域查看答案解析!

COOKIE数据存放在客户的浏览器上,而session数据放在服务器上;


COOKIE分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的COOKIE

COOKIE不是很安全,可以分析存放在本地的COOKIE并进行COOKIE欺骗,出于安全考虑应当使用session;


session会在一定时间内保存在服务器上,当访问增多时会比较影响服务器的性能,出于考虑减轻服务器性能方面,应当使用COOKIE;


单个COOKIE保存的数据不能超过4K,大多说浏览器都限制了一个站点最多保存20个COOKIE


个人观点认为将一些登录信息(重要信息)存放在session中,而其他信息如果需要保留,可以放在COOKIE中


推荐阅读

 

Spring基础篇——DI/IOC和AOP原理初识

Spring基础篇——通过Java注解和XML配置装配bean

Spring基础篇——bean的自动化装配

微框架Spring Boot使用Redis如何实现Session共享

SpringMvc框架MockMvc单元测试注解及其原理分析


更多推荐↓↓↓
 

Java精选

关注微信公众号“Java精选”(w_z90110),回复关键字领取资料:如HadoopDubboCAS源码等等,免费领取资料视频和项目。 

涵盖:程序人生、搞笑视频、算法与数据结构、黑客技术与网络安全、前端开发、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开发、大数据技术、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录统一认证、分布式框架、集群、安卓开发、iOS开发、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存