java面试题(基础)

java概述

1.何为编程?

计算机为解决某个问题而使用程序设计语言编写代码,并得到结果的过程。

2.什么是java?

java是面向对象的编程语言,具有功能强大、简单易用的特征。

3.jdk、jre、jvm

jdk:java的开发工具(包含jre)

jre:java的运行环境(包含jvm和核心类库)

jvm:java 虚拟机

4.什么是跨平台?原理是什么?

跨平台:一次编译,多个系统运行

原理:只要系统安装了对应的java虚拟机,该系统就可以运行java程序

5.java语言特点

简单易学

面向对象

无关平台

支持多线程

安全

6.什么是字节码?字节码的好处?

字节码:电脑里数据的计量单位

好处:字节码解决了java程序无需重复编译,便可以在不同的系统数运行

7.什么是java主类?应用程序和小程序的主类有什么不同?

java主类:程序运行的入口,只能有一个主类,包含main方法

区别:小程序中主类必须继承JApplet或Applet类,必须是public,应用程序不固定;主类是java程序的入口

基础语法

数据类型

1.什么是基础数据类型?

整数类型:byte(1)、short(2)、int(4)、long(8)

浮点类型:float(4)、double(8)

字符型:char(2)

布尔型:boolean(1)

2.什么是引用数据类型?

接口

数组

编码

1.java采用的编码方式?特点?

采用Unicode编码标准

为每个字符制定一个唯一的数值,在任何平台、语言都可使用

注释

1.java注释及作用?

单行注释://

多行注释:/*    */

文档注释:/**   */

作用:增加代码的可读性,有利于修改和交流

2.访问修饰符的区别?

public:所有类、接口、变量、方法都可见

protected:同一包内的类,以及子类可见,不能修饰类

default:同一包内可见,不使用修饰符

private:仅当前类可见

关键字

1.final作用

修饰的类不能被继承

修饰的方法不能被重写

修饰的变量不能被改变

2.final、finally、finalize的区别?

final:可以修饰类、方法、变量

finally:作用于try-catch代码块中,不管是否出现异常,都要执行

finalize:jvm中垃圾回收器调用finalize方法,回收垃圾

3.this的用法?

指向本身的一个指针;

  1. 直接引用,指向对象本身

  1. 形参和成员名字重名,用this来区分

  1. 引用本类的构造函数(放在构造函数的第一条语句)

4.super的用法?

指向父类的一个指针(最近);

  1. 直接引用,指向当前父类的对象

  1. 子类中成员变量或方法与父类中成员变量或方法重名时,用于区分

  1. 调用父类的构造函数(应放在第一行)

5.this和super的区别?

  1. 本质来讲,this是指针,但super是关键字

  1. this引用自身对象、变量、构造函数,super引用父类中对象、变量、方法、构造方法

6.static的应用及原理?

会在类加载的时候执行一次,加载时分配空间,大多数时候会将一些只需要进行一次的初始化操作放在其中;

被修饰的变量或方法是独立的,被所有实例共享;

  1. 修饰成员变量

  1. 修饰成员方法

  1. 静态代码块

  1. 修饰类(内部类)

  1. 静态导包

7.标识符和关键字有什么区别

编写程序时,需要给类、对象、方法等取名字,就有了标识符;标识符就是一个名字

关键字就是被赋予特殊含义的标识符

8.自增自减运算符

符号在前就先加/减,符号在后就后加/减

流程控制语句

1.break、continue、return的区别及作用?

break:跳出循环,执行下面代码

continue:跳出本次循环,继续执行下次循环

return:跳出循环,不在执行下面代码,直接返回

2.如何跳出多重嵌套循环?

使用break即可跳出循环,继续执行下面代码

面向对象

1.什么是面向对象?

面向对象(行为化):把现实中的事务都抽象成对象,后完成拼装,具有封装、继承、多态,性能低,易于维护。

2.面向对象的三大特征?

封装:把一个对象的属性私有化,同时提供外界访问的方法

继承:在已有类的基础上建立新类,新类可以新增功能。通过继承可以方便的复用以前代码

多态:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,提高程序的拓展性

3.抽象类与接口的区别?

  1. 抽象类可以有方法实现;接口不存在方法和构造器

  1. 抽象类用extends继承;接口用implement实现

  1. 定义关键字不同,接口用interface,抽象类abstract

  1. 访问属性,接口默认用public;抽象方法可以任意;

  1. 抽象类可以继承一个类或实现多个接口;接口可以继承一个或多个其他接口

  1. 抽象类新增方法不需要改变实现类;接口新增方法,必须改变实现类;

  1. 抽象类中可以使用静态代码块,接口中不行

4.什么是构造方法?

作用是完成对类对象的初始化工作,如果没有什么构造方法也会有默认的不带参数的构造方法;

特性:

  1. 名字与类名相同;

  1. 没有返回值,但不能用void什么

  1. 自动执行,无需调用

5.成员变量和局部变量的区别?

  1. 成员变量整个类都有效;局部变量一般在方法或语句内有效

  1. 成员变量随着对象的创建而存在,随着对象的消失而消失;局部变量当方法用完或语句结束自动释放

  1. 成员变量有默认初始值;局部变量没有,使用前必须赋值

6.什么是内部类?内部类的种类

将一个类的定义,放在另一个类的内部;内部类本身是一个属性,与其他属性定义方式一样。

成员内部类:定义在类内部,非静态的;可以访问外部的所有方法和变量;使用方式:外部类实例.new 内部类();

局部内部类:定义在方法中的内部类;可以访问外部的所有方法和变量;如果定义在静态方法中,只能访问外部类的静态方法和变量;使用方式:在对应的方法内,new 内部类();

匿名内部类:没有名字的内部类;必须继承一个抽象类或实现一个接口;不能定义静态;参数申明为final;不能是抽象的;使用方式:new 类{}

静态内部类:定义在类内部的静态类;可以访问外部类的所有静态变量;使用方式:new 外部类.静态内部类();

7.内部类的优点及使用场景

优点:

  1. 不为其他类所见,局域封装性

  1. 实现了多重继承

  1. 方便定义回调

  1. 可以访问创建它的外部类对象的内容,包括私有数据

使用场景:

  1. 使代码更加灵活,富有扩展性;

  1. 除了外部类,不能被其他类访问

  1. 解决一些非面向对象的语句块

8.重写与重载的区别

  1. 重载是相同方法名,参数不同;重写是子类重写父类方法;

  1. 重载定义在类中;重写定义在父类和子类之间

  1. 重载对返回没有要求;重写要求返回类型,有兼容的返回类型

  1. 重载的参数个数、类型、顺序都可以不同;重写父子类必须相同

  1. 重载对访问修饰符没有要求;重写的访问修饰符必须大于父类

9.==和equals的区别

==:基本数据类型比得是值,引用数据类型比得是内存地址

equals:

没有重写:等价于==

重写:比较内容是否相同

10.hashCode与equals

hashCode:确定对象在哈希表中的位置,返回int;加入对象是,先计算对象的hashcode来判断加入的位置,如果hashCode已存在,调用equals来检查对象是否相同。

两个对象相同,hashCode一定相同;hashCode相同,对象也不一定相同。

11.对象相等和引用相等

对象相等:指的是内容是否相等;引用相等:指的是内存地址是否相等。

12.什么是值传递

调用方法是时进实际参数负责复制一份传到方法中,就算修改参数,也不会影响实际参数

13.值传递与引用传递的区别

值传递:方法调用时,传递的参数是直接拷贝,传递后互不相关;

引用传递:方法调用时方法调用时,传递的参数是引用地址,传递前后都指向同一个引用地址;

14.instanceof关键字的作用

双目运算符,检测对象是否为一个类

15.java自动拆箱与装箱

拆箱:将包装器类型,转化为基本数据类型

装箱:将基本数据类型,转化为包装器类型

16.深拷贝与浅拷贝的区别

浅拷贝:对于基础数据类型是直接进行值传递,在另一个空间存放,修改值不会影响拷贝值;对于引用数据类型是进行的地址传递,不开辟新空间,所以两个值会指向同一个内存地址,修改后会影响拷贝源的值。

深拷贝:新分配一块内存,会拷贝所有的属性,并拷贝属性指向的内存,速度慢,花销大

17.泛型中super和extends的区别

泛型中extends是设定类型通配符的上限;super是设定类型通配符的下限

18.java类加载器有哪些

1.引导类加载器(启动类加载器)

2.拓展类加载器

3.系统类加载器

4.自定义加载器

19.双亲委派原则

一个类加载器收到请求后不会立即加载自己,而是先检查父类加载器是否已经加载,层层迭代,到顶层加载器没有了,会往下进行委派去加载指定的类

20.String、StringBuffer、StringBuilder的区别

String对象是不可变的,也就可以理解为常量,线程安全;

StringBuffer、StringBuilder是可变的(append方法)

StringBuffer加了同步锁所以线程安全;StringBuilder没加锁,线程不安全;

String进行改变时会生成新的对象;StringBuffer、StringBuilder对本身修改

总结:

操作少量的数据用String

单线程下操作大量数据用StringBuilder

多线性下操作大量数据用StringBuffer

反射

1.什么是反射?

能够动态的获取信息以及调用对象的方法;对于任意类和任意方法都能知道所有的方法和属性;

2.反射的方式

  1. 通过new对象实现

  1. 通过路径实现

  1. 通过类名实现

3.反射的优缺点

优点:能动态加载类,提高代码灵活度

缺点:消耗资源,性能是瓶颈

4.反射的应用场景

  1. 动态配置属性

  1. 可以获取某个类的实例

  1. 将xml或配置文件加载到内存中

异常

1.异常分类

Error:错误

Exception:异常

  1. 运行时异常

  1. 编译时异常

2.异常的处理方式

  1. 抛出异常:throw

  1. 声明异常:throws

  1. 捕获异常:try-catch-finally

3.throw和throws的区别

  1. throw用在方法内部,只能用于抛出一种异常;throws用在方法声明上,可以抛出多个异常;

  1. throws表示可能出现异常;throw则一定会抛出某种异常对象

4.Error和Exception的区别

Error:错误,编译器不进行检测,也不进行捕捉,一旦发生,程序通常终结

Exception:异常,可以在程序中进行捕捉并处理,处理成功后,正常运行

5.运行时异常和一般异常的区别是什么

运行时异常:运行期间出现的异常

一般异常:除了运行时异常之外的所有异常

区别:

如果强制要求必须处理,使用一般异常,否则使用运行时异常

6.try-catch-finally可以省略哪一部分

catch可以省略

因为try处理运行时异常,try+catch处理运行时异常+普通异常,所以当处理运行时异常,catch可以省略

7.常见的运行时异常有哪些?

  1. 类转换异常

  1. 数组越界

  1. 空指针

  1. 数据存储异常

其他

  1. 浏览器发出一个请求到收到响应需要经历哪些步骤

2.跨域请求是什么?有什么问题?这怎么解决

跨域请求:指浏览器发起网络请求时,会检查对应的协议、域名、端口与当前的网页是否一致,如果不一致则进行限制

问题:当网络请求和当前网页不一致时,为了用户安全,浏览器会进行限制

解决:

利用jsonp的形式(底层script可以跨域)

后台控制,先访问同域名中的接口,再使用httpClient等工具去调用目标接口

使用网关,交给后台服务来进行跨域访问

response添加header

3.什么是前后端分离

前后端分离就是把数据操作和显示分离出来。前端专注做数据显示,通过文字,图片或者图标等方式让数据形象直观的显示出来。后端专注做数据的操作。前端把数据发给后端,有后端对数据进行修改。

后端提供接口给前端调用,来触发后端对数据的操作

4.为什么String被设计的是不可变的?

String被final修饰,变为常量,不可修改,附一个新值,也是重新建了一个字符串;

好处:

  1. 使用了字符串常量池

  1. 缓存hashCode

  1. 用作hashCode的key

  1. 线程安全(具备不可变)

5.TCP的三次握手和四次挥手

tcp协议是7层网络协议中的传输层协议,负责数据的可靠性传播;在建立tcp连接时,需要通过三次握手来建立,过程是:

1.客户端向服务端发送一个SYN

2.服务端发收到SYN后,给客户端发送一个SYN_ACK

3.客户端收到SYN_ACK后,再给服务端发送一个ACK

断开tcp连接时,需要通过四次挥手来端口,过程是:

1.客户端向服务端发送FIN

2.服务端接收FIN后,向客户端发送ACK

3.服务端处理完所有数据后,向客户端发送FIN,表示服务端可以断开连接

4.客户端接收服务端的FIN,向服务端发送ACK,表示客户端可以断开连接

猜你喜欢

转载自blog.csdn.net/qq_35056891/article/details/129558777