java面试题常考知识点汇总

·包装类的作用:

编码过程中只接收对象的情况,比如List中只能存入对象,不能存入基本数据类型;比如一个方法的参数是Object时,不能传入基本数据类型,但可以传入对应的包装类;方便类型之间的转换,比如String和int之间的转换可以通过int的包装类Integer来实现。

 综上;

 一个实现基本类型之间的转换

 二是便于函数传值 ,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况int的默认值为0,而Integer的默认值为null

 三就是在一些地方要用到Object的时候方便将基本数据类型装换

 

·equals/==的区别:

equals:判断堆区中的内容是否相同。使用equals()来进行对象比较时,Integer会先检查类型是否一致,若不一致直接返回false。

==:判断是否指向同一地址。

 

·GC

局部变量没有引用指向它时,GC会回收它。

·抽象类和接口的区别:

抽象类不能被实例化。

抽象方法定义的目的是:子类必须重写方法。

单继承,多实现。

构造方法:

抽象类可以有构造方法。

接口不能有构造方法。

抽象方法和非抽象方法:

抽象类可以有抽象方法和非抽象方法。

接口可以有抽象方法,非抽象方法必须用default关键词声明。

成员变量:

抽象类可以有成员变量。

接口不能有成员变量,只能用static final修饰。

接口和抽象类都不能实例化

 

·多态

赋值多态

如果父类或接口作为数据类型的话,该类型new的对象可以用所有的子类 进行赋值。

传参多态

如果一个方法的参数(形参)是父类或接口时,该类的子类或实现类都 可进行传递。

多态实现方式:

继承父类

子类重写父类方法

父类引用指向子类对象

 

·throws和throw的区别(面试题)

throws

用在方法声明后面,跟的是异常类名

可以跟多个异常类名,用逗号隔开

表示抛出异常,由该方法的调用者来处理

throws表示出现异常的一种可能性,并不一定会发生这些异常

throw

用在方法体内,跟的是异常对象名

只能抛出一个异常对象名

表示抛出异常,由方法体内的语句处理

throw则是抛出了异常,执行throw则一定抛出了某种异常

 

·类的加载

1.隐式装载,程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。

2.显式装载,通过class.forname()等方法,显式加载需要的类。

 

·增强for循环

for (String str : set) {

System.out.println(str);

}

//for里面对一个参数是要遍历集合中元素的类型,第二个表示集合中的元素,第三个是集合

 

·java序列化

简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。

把对象转化成字节流或字符流的过程。反之,称为反序列化。

需要序列化的情况:

当想把的内存中的对象保存到一个文件中或者数据库中时候;

当你想用序列化在网络上传送对象的时候;

当你想通过RMI传输对象的时候;

 

·List:

ArrayList:

底层数据结构是数组,查询快,增删慢。

线程不安全,效率高。

Vector:

底层数据结构是数组,查询快,增删慢。

线程安全,效率低。

LinkList:

底层数据结构是链表,查询慢,增删快。

线程不安全,效率高。

 

·反射机制:

JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

 

·prepareStatement/Statement的区别:

前者有预编译环节;不同的查询参数值,PreparedStatement可以重用,提供缓存机制

prepareStatement缺点:不能直接执行In条件语句

PreparedStatement:可以动态查询、有助于防止SQL注入

 

 

·java锁:

多线程需要用到锁,必须是引用类型,synchronized机制是给共享资源上锁,只有拿到锁的线程才可以访问共享资源,这样就可以强制使得对共享资源的访问都是顺序的。锁实际上是一种互斥机制。

 

·Httpservlet:

HttpServlet 指能够处理 HTTP 请求的 servlet,它在原有 Servlet 接口上添加了一些与 HTTP 协议处理方法,它比 Servlet 接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。 HttpServlet 在实现 Servlet 接口时,覆写了 service 方法,该方法体内的代码会自动判断用户的请求方式,如为 GET 请求,则调用 HttpServlet 的 doGet 方法,如为 Post 请求,则调用 doPost 方法。因此,开发人员在编写 Servlet 时,通常只需要覆写 doGet 或 doPost 方法,而不要去覆写 service 方法。

 

·迭代器:

就是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节。

 

·内部类、外部类

内部类可以是静态static的,也可用public,default,protected和private修饰,

外部类的修饰符只能是public,abstract,final

 

·equals/hashCode:

equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。

hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

 

·E-R图转换为关系模式的个数为:

实体集的数量+多对多关系的个数

 

·数据库事务:

是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

四大特性:

原子性:要么全部成功,要么全部失败回滚、

一致性:执行之前和执行之后都必须处于一致性状态。

隔离性:多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离

持久性:持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的

 

·红黑树:

红黑树是一种近似平衡的二叉查找树,它能够确保任何一个节点的左右子树的高度差不会超过二者中较低那个的一陪。具体来说,红黑树是满足如下条件的二叉查找树:

每个节点要么是红色,要么是黑色。

红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。

对于每个节点,从该点至null(树尾端)的任何路径,都含有相同个数的黑色节点。

 

·依赖注入三种方式:

构造器注入

属性setter方法注入

基于注解注入

 

·锁:

在并发编程中,经常遇到多个线程访问同一个 共享资源 ,这时候作为开发者必须考虑如何维护数据一致性,在java中synchronized关键字被常用于维护数据一致性。synchronized机制是给共享资源上锁,只有拿到锁的线程才可以访问共享资源,这样就可以强制使得对共享资源的访问都是顺序的,因为对于共享资源属性访问是必要也是必须的,下文会有具体示例演示。

 

·为什么B+树比B树更适合做系统的数据库索引和文件索引

B+树的磁盘读写代价更低

因为B+树内部结点没有指向关键字具体信息的指针,内部结点相对B树小

B+树的查询更加稳定

因为非终端结点并不是指向文件内容的结点,仅仅是作为叶子结点的关键字索引,因此所有的关键字查询都会走一条从根节点到叶子结点的路径。即s所有关键字查询的长度是一样的,查询效率稳定。

 

·线程安全:

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

 

多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

 

·线程不安全

就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

 

在多个线程同时访问同一个对象时会发生数据错误 不完整等情况时 那就是线程不安全,不会发生上续错误时是线程安全的,一般采用锁机制。

原因:线程内的关于外部变量的语境(也就是各个线程都有自己的工作内存),与真实外部语境(主内存)不一致(此时的先决条件已经发生变化)。

 

·索引的优缺点:

加快查找速度。占用物理内存。

 

·内存区域存放:

1. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。);

2. 堆:存放所有new出来的对象;

3. 静态域:存放静态成员(static定义的);

4. 常量池:存放字符串常量和基本类型常量(public static final)。有时,在嵌入式系统中,常量本身会和其他部分分割离开(由于版权等其他原因),所以在这种情况下,可以选择将其放在ROM中 ;

5. 非RAM存储:硬盘等永久存储空间

 

 

·常见异常

1、空指针异常类:NullPointerException

调用了未经初始化的对象或者是不存在的对象。经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针, 即把数组的初始化和数组元素的初始化混淆起来了。

数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化, 依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)。

2、数据类型转换异常:java.lang.ClassCastException

当试图将对某个对象强制执行向下转型,但该对象又不可转换又不可转换为其子类的实例时将引发该异常,如下列代码。

Object obj = new Integer(0);

String str = obj;

3、没有访问权限:java.lang.IllegalAccessException

当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了Package的情况下要注意这个异常。

4、方法的参数错误:java.lang.IllegalArgumentException

比如g.setColor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。

5、数组下标越界异常:java.lang.IndexOutOfBoundsException

查看调用的数组或者字符串的下标值是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了。

还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候先查看一下数组的length,以免出现这个异常。

6、文件已结束异常:EOFException

当程序在输入的过程中遇到文件或流的结尾时,引发异常。因此该异常用于检查是否达到文件或流的结尾

7、文件未找到异常:FileNotFoundException

当程序试图打开一个不存在的文件进行读写时将会引发该异常。该异常由FileInputStream,FileOutputStream,RandomAccessFile的构造器声明抛出,即使被操作的文件存在,但是由于某些原因不可访问,比如打开一个只读文件进行写入,这些构造方法仍然会引发异常。

 

8、字符串转换为数字异常:NumberFormatException

当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常.如现在讲字符型的数据“123456”转换为数值型数据时,是允许的。

但是如果字符型数据中包含了非数字型的字符,如123#56,此时转换为数值型时就会出现异常。系统就会捕捉到这个异常,并进行处理。

9、指定的类不存在: java.lang.ClassNotFoundException

这里主要考虑一下类的名称和路径是否正确即可,通常都是程序试图通过字符串来加载某个类时可能引发异常。比如:调用Class.forName;或者调用ClassLoad的finaSystemClass;或者LoadClass;

10、实例化异常:java.lang.InstantiationException

当试图通过Class的newInstance方法创建某个类的实例,但程序无法通过该构造器来创建该对象时引发。Class对象表示一个抽象类,接口,数组类,基本类型 。该Class表示的类没有对应的构造器。

·int和String相互转换

Integer.parseInt(str)是把一个数字字符串转化成int类型的数据

Integer.valueOf(str or num) 是把一个数字或者一个字符串转化为Integer类型的数据;

·泛型的作用

类型的参数化,就是可以把类型像方法的参数那样传递。

泛型使编译器可以在编译期间对类型进行检查以提高类型安全,减少运行时由于对象类型不匹配引发的异常。

 

·Javabean四个作用域范围

 

·多线程

 

 

 

·mvc在BS系统下的请求过程

 

·mybatis、hibernate区别

 

 

·springboot缺点

 

·Springboot特点

·单、多数据输出

 

·进程和线程

 

·类初始化

 

·排序算法的复杂度

 

·数组的定义

 

·死锁

 

·读取文件内容

Bufferreader/BufferWriter

·finally/return

1在某些情况下,try语句压根就没有执行到,那么finally语句也一定就不会执行到了

 

2还有一种情况就是在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。

3finally是在retrun语句执行后,return返回之前执行的,也就是说finally必执行(当然是建立在try执行的基础上)

4finally中修改的基本类型没有return是不影响返回结果的,有了retrun才会影响

5finally中修改list ,map,set引用类型时,就算没有return,也是是影响返回结果的

·List、Map、Set

 

·==/===区别:

  1. ===:称为等同符,当两边值的类型相同时,直接比较值,若类型不相同,直接返回false; 2、==:称为等值符,当等号两边的类型相同时,直接比较值是否相等,若不相同,则先转化为类型相同的值,再进行比较;

·get /post请求的区别

哪一些情况下,浏览器会发送get请求

a直接在浏览器地址栏输入某个地址

b点击链接

c表单默认的提交方式

 

哪一些情况下,浏览器会发送post请求?

a设置表单method = "post"

 

get请求的特点

a请求参数会添加到请求资源路劲的后面,只能添加少量参数(因为请求行只有一行,大约只能存放2K左右的数据)(2K左右的数据,看起来也不少。。。)

b请求参数会显示在浏览器地址栏,路由器会记录请求地址

 

post请求的特点

a请求参数添加到实体内容里面,可以添加大量的参数(也解释了为什么浏览器地址栏不能发送post请求,在地址栏里我们只能填写URL,并不能进入到Http包的实体当中)

b相对安全,但是,post请求不会对请求参数进行加密处理(可以使用https协议来保证数据安全)。

·new/newInstance

区别在于创建对象的方式不一样。newInstance前者是使用类加载机制。Java中工厂模式经常使用newInstance来创建对象,因此从为什么要使用工厂模式上也可以找到具体答案。

newInstance: 弱类型。低效率。只能调用无参构造。

new: 强类型。相对高效。能调用任何public构造。

newInstance()是实现IOC、反射、依赖倒置 等技术方法的必然选择,new 只能实现具体类的实例化,不适合于接口编程。类里面就是通过这个类的默认构造函数构建了一个对象,如果没有默认构造函数就抛出InstantiationException, 如果没有访问默认构造函数的权限就抛出IllegalAccessException

 

·接口和抽象类的使用场景

抽象类中不一定都是抽象的方法,也可以有具体实现的方法,这样就可以把大家公用的方法提升到抽象类中,然后具体的方法可以留给子类自己实现。所以抽象类可以更好的实现代码的复用。

抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它。

所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。

接口是多态的体现。

当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值