最近遇到的java面试题

如题,直接就是最近面试各家公司遇到的问题

java部分


1.equals和==
1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

2.String、StringBuilder和StringBuffer
1)String 字符串常量;一旦声明就不可改变;String类是final类不可继承;
2)StringBuffer 字符串变量(线程安全)类中提供的方法都是同步方法;
3)StringBuilder 字符串变量(非线程安全)类中方法属于异步方法;

3.重写和重载,构造方法是否可以重写
1)重载与重写是 Java 多态性的不同表现。
2)参数列表必须完全与被重写的方法相同,返回的类型必须一直与被重写的方法的返回类型相同.
3)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。必须具有不同的参数列表.
4)Java 的构造方法是不能被重写的。而重载是针对同一个的,所以构造方法可以被重载。
 4.为什么静态方法不能调用非静态变量,非静态方法可以引用静态变量?
1)在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。
2)相反,非静态方法是可以引用静态变量的。
因为静态变量是存储在静态内存单元内,可以直接用类进行调用,也可以用实例化的对象对其引用。所以非静态方法是可以引用静态变量的。
5.冒泡排序

 //冒泡排序(升序排列)
  int temp = 0; 
  int m = a.length;
	     for(int j = 0 ;j < m ;j++){
	     for(int k = 0;k < m-j-1 ;k++) {
	    		if (a[k+1] < a[k]) {      
	    			temp = a[k];
	    			a[k] = a[k+1];
	    			a[k+1] = temp;
	    		} } } 

6.servlet生命周期
1)加载和实例化
2)初始化
3)请求处理
4)服务终止

7.数据库加载驱动的6个步骤
1)注册加载jdbc数据库驱动
2)得到连接对象 Connection
3)创建 Statement对象
4)书写sql语句并执行sql
5)处理结果集
6)关闭资源释放资源

8.ssh和ssm的区别
一、SpringMVC 对比 Struts
Struts和SpringMVC都是负责做转发的,但是两者针对request的请求上面区别很大。Struts是针对一个Action类来进行请求的,即一个Action类对应于一个请求,属于类拦截,请求的数据类共享。而SpringMVC则是针对于方法级别的请求的,也就是一个方法对应一个请求,属于方法拦截,请求的数据方法不共享。
SpringMVC的配置文件相对来说较为少,容易上手,可以加快软件开发的速度。
SpringMVC的入口是Servlet级别的,而 Struts 的入口是Filter级别的。
二、Hibernate 对比 MyBatis
针对Hibernate和 MyBatis对持久化类进行操作的区别可以整理如下:

Hibernate是一种O/R关系模型,即完成数据库表和持久化类之间的映射,而MyBatis是针对的SQL与Maping之间的映射。个人理解:Hibernate把数据库给封装好以后,可以调用相应的数据库操作语句HQL,而MyBatis则是用的原始的数据库操作语句。所以,Hibernate优化起来相对MyBatis较难;MyBatis入门较快,而Hibernate掌握起来相对较难。

针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。

–转自–https://blog.csdn.net/qq_29229567/article/details/89556037

9.谈谈常用的集合类
Set接口
Set接口直接继承自Collection接口,并且方法接口上也一模一样。Set对添加的元素有一些要求,其不允许出现重复的元素,并且元素之间没有次序。这相当于一个不允许重复的离散的集合。因此,添加进Set的元素类型需要定义equals方法。若是使用自定义的类,则应该重写equals方法来确保实现自己需要的功能。
Set接口主要实现了两个类:HashSet,TreeSet。

HashSet是按照哈希来存取元素的,因此速度较快。HashSet继承自抽象类AbstractSet,然后实现了Set、Cloneable、Serializable接口。
TreeSet也是继承自AbstractSet,不过不同的是其实现的是NavigableSet接口。而NavigableSet继承自SortedSet。SortedSet是一个有序的集合。其添加的元素必须实现了Comparable接口,因为其在添加一个元素的时候需要进行排序。
LinkedHashSet也是Set的一个实现。和HashSet类似,只不过内部用链表来维护,按照元素插入次序来保存。

List接口
List接口也是继承自Collection。与Set不同的是,List可以存储重复的元素。主要有两种实现:ArrayList和LinkedList。
ArrayList没有什么好说的,就像传统的数组一样,有着很快的随机存取速度,但是插入删除的速度就很慢。
LinkedList则与ArrayList恰恰相反,因为用链表来保存数据,所以插入删除元素的速度很快,但是访问数据的速度就不如ArrayList了。

Map接口
Map(映射)是一个存储键值对的容器接口。每一个元素包含一个key对象和value对象,且元素不允许重复。
Map接口的实现有以下几个:
HashMap是最常用的一个实现。HashMap使用hash映射来存取数据,这个速度是相当快,是O(1)的速度。其容量capacity,和负载因子load factor可以在一开始设定。当元素个数达到capacity*load factor的时候,就会进行扩容。
LinkedHashMap和HashMap类似,只不过内部用链表来维护次序。因此遍历时候的顺序是其插入顺序。
TreeMap是基于红黑树的Map,插入的数据被有次序保存,并且有很高的效率。因此在遍历输出的时候可以得到排序的数据。但是这要求插入的数据实现了comparable接口。

剩下的问题都偏向主观

1.说一下java的异常,如果碰到空指针异常怎么处理
运行时异常和编译时异常,一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws),我们可以通过它的类型来捕捉它,或最后由缺省处理器来处理它(finally)。
try:用来指定一块预防所有异常的程序
catch:紧跟在try后面,用来捕获异常
throw:用来明确的抛出一个异常
throws:用来标明一个成员函数可能抛出的各种异常
finally:确保一段代码无论发生什么异常都会被执行的一段代码。

对于可能出现空指针的代码,带使用对象之前一定要判断一下该对象是否为空,必要的时候对runtimeException

进行try catch处理的时候要在catch代码块中对异常信息进行记录,通过调用异常类的相关方法获取到异常的相关信息,返回到web端
写一个自定义异常,抛回给客户端.

数据库部分

1.假设有表A和表B,百万级别的数据查询,如何更快速而准确的查询

1、选取最适用的字段属性
MySQL可以很好的支持大数据量的存取,
但是一般说来,数据库中的表越小,
在它上面执行的查询也就会越快。
因此,在创建表的时候,为了获得更好的性能,
可以将表中字段的宽度设得尽可能小。
应该尽量把字段设置为NOT NULL,
这样在将来执行查询的时候,数据库不用去比较NULL值。
2.使用索引
索引是提高数据库性能的常用方法,
它可以令数据库服务器以比没有索引快得多的速度检索特定的行
,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令
的时候,性能提高更为明显。
3.使用连接(JOIN)来查询

2.如何保证数据库安全性
确保操作系统的安全是保护数据库安全的前提,
因为如果整个运行环境不安全,
那么网站上所有的东西都脆弱,
很容易暴露于攻击者。为了维护操作系统和MySQL服务器

安装杀毒软件,防火墙以及所有推荐的补丁和更新,
防火墙能有效地把流量过滤到MySQL服务器。

在安装MySQL的时候,
默认情况下创建了一个命名为“root”的管理用户。
每个人都知道这一点,
所以攻击者通常试图侵入这个“root”用户来获取访问权限。
为了保障这个重要帐户的安全,
你需要给它重新命名,然后更改一个长并且复杂的密码。

减少管理员账户

删除测试数据库
有一个默认的“测试”数据库用于测试目的。
由于这个数据库有安全风险,
匿名用户也可以访问,
使用mysql> DROP database test;指令尽快把它清除掉。

3.理解左连接,右连接,内连接,外连接
 
 大佬写的—https://blog.csdn.net/u014204541/article/details/79739980

数据结构和网络协议部分

1.用两个栈实现一个队列&用两个队列实现一个栈
 
 大佬写的—https://blog.csdn.net/cherrydreamsover/article/details/80466781
 
 2.TCP网络分层
 
应用层、
传输层、
网络层、
数据链路层、
物理层。
 
 3.简述TCP网络协议的握手协议
三次握手 
(1)主机A向主机B发送TCP连接请求数据包,其中包含主机A的初始序列号seq(A)=x。(其中报文中同步标志位SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的第一个数据字节的序号是x)
(2)主机B收到请求后,会发回连接确认数据包。(其中确认报文段中,标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含主机B的初始序列号seq(B)=y,以及主机B对主机A初始序列号的确认号ack(B)=seq(A)+1=x+1)
(3)第三次,主机A收到主机B的确认报文后,还需作出确认,即发送一个序列号seq(A)=x+1;确认号为ack(A)=y+1的报文;

四次挥手
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手,连接关闭

–转自–https://blog.csdn.net/freak_ysy/article/details/81543873

本文章在我正式工作之前将持续更新,如有侵权请联系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值