javaSE基础面试 题日常收集到的一些非常基础的面试 常见的题目

一、javaSE

File类中的常用方法有哪些?

getName(); 获取文件名称

getpath(); 获取文件路径

getAbsolutePath(); 获取绝对路径

getParentFile(): 获取上级目录

exist(); 判断文件是否存在

isFile(); 判断是否是文件;

中文乱码问题是怎么造成的? 如何解决?

编码和解码的字符集不一致

保证编码和解码的字符集相同

什么是读? 什么是写?

读:将数据库的文件获取到文件夹,网络.

写将文件夹的内容写到数据库

字节流和字符流的区别是什么? 开发中如何选择?

操作二进制文件必须使用字节流,操作文件文字使用字符流

尤其是操作带有中文的文件,使用字符流不容易导致乱码

缓冲有什么特点?

缓冲流的作用是用来减少磁盘的io操作

什么是序列化和反序列化?

指将java堆内存中的对象数据,通过某种方式把对象数据存储到磁盘文件中或者传递给网络上传输.

反序列化是指将磁盘文件中的对象数据恢复成java对象的过程

JDK,JRE,JVM各自的作用?

JVM虚拟机,不跨平台,在各自的系统中运行Java字节码程序

JRE,Java运行环境,运行Java程序,JRE包括JVM,下载JRE,就包含有JVM虚拟机(在不需要开发环境下,只需要运行程序的机器中安装)

JDK,Java开发环境,开发Java程序,JKD包括JRE,下载JDK也包括也jre,(需要开发Java运行程序的开发机安装)

什么是变量?变量的作用?

变量是指在内存中开辟一个空间储存任一类型常量,变量需要给定初始值,然后进行调用,调用只能在变量所在的花括号内调用.

变量的作用,用来存储常量,并调用它

熟悉Java中常用的运算符

+相加符号

-减符号

/ 除号

*乘

== 相等于

!= 不等于

= 大于等于

<= 小于等于

变量可以如何使用?

int age=1;

变量可以在算数运算时进行调用

数据类型的转换?

数据类型可以从小转大,就是小范围的数据可以转到大的数据范围.例:int->long

byte char short直接转成int,其他数据类型可以自动转成小转大byte<char<short<int<long<float<double

而大转小需要强制转换类型

如何拼接字符串?

使用字符串数据类型String进行存储数据,例:

String str="你"+"好";

String str="你"+"好"; System.out.println(str);**

/和%的区别?

/是商的值,%是余数的值

++和--的作用?前置++和后置++的区别?

作用都是加一/减一

前置++/--是输出结果+1/-1

后置++/--是输出1/-1的原始值

+=的作用是什么?

作用是变量加上某数的值输出结果,例

int a=20; a+=20; System.out.println(a); 结果为40

short s = 2; s = s + 2;有没有问题? s+=2有没有问题?

有问题,short自动转为为int数据类型,如果需要转换short数据类型,需要在s前面加上转换的数据类型.

s+=2没有问题

三元运算符的作用?

数据类型 变量名=Boolean?"表达式":"表达式";

&和|的效果? &和&&的区别?

&的效果是,有false则false

|的效果是,有true则true

&和&&的区别是,&&左边的数据输出是false,则输出false,右边则不再进行运算.

但&不管左边输出false还是true,右边还是进行运算.

Java代码的执行顺序?

Java代码会自上而下的运行

jvm会找到类(字节码)文件加载到虚拟机,然后找到类(字节码)文件内的main主方法内的程序进行执行.

什么时候需要使用选择结构?

逻辑判断输出有多种结果的,此时产生多种选择

例:中午吃饭,逻辑判断想吃什么,有鱼.有上海小混沌.这个时候我们就需要使用选择结构.

if-elseif-elseif-else的语法和执行流程?

if的语法

if(Boolean){语句体}

例:int a=2; if(a>5){System.out.println("a>5")}

if-else if语法

if(Boolean){语句体1}else if(Boolean){语句体2}

例:int age=17; if(a>=18){System.out.println("你已经成年")}else if(a<18){System.out.println("你还未成年")}

if-else if-else语法

if(Boolean){语句体1}else if(Boolean){语句体2}else{语句体3}

例:int age=17; if(a>30){System.out.println("a>30")}else if(a=30){System.out.println("a=30")}else{System.out.println("a<30")}

什么时候需要使用循环结构?

对于判断条件是否等于某一数值的时候,对于需要穿透效果的执行语句

while的语法和执行流程?

while的语法

while(整体表达式) case 某个值: 语句体;break;

例:int a=1

while(a=1){System.out.println("a=1")};break;

(a=2){System.out.println("a=2")};break;

do-while的语法和执行流程?

do{语句体}while(Boolean表达式)

循环体至少循环一次

do(System.out.println("a>5"))while(a>5)

for的语法和执行流程?

for(初始化语句;Boolean表达式;循环后操作语句){循环体}

//计算1-10中全部的偶数和

int sum=0

for(int a=1;a%2==0;a++){sum+=a}

二、数组

JVM中的内存区域?

  1. 方法区 在jvm虚拟机内存中新建一个方法区存储类(字节码文件).class文件

  2. 栈 在jvm虚拟机内存中新建一个栈区,在栈区内新建一个栈帧,在栈帧内存储数组的地址,

  3. 堆 在jvm虚拟机内存中新建一个堆区,在堆区内开辟一个地址,储数组的索引跟元素

  4. GC(垃圾回收器) 当jvm中内存不够,则会自动清理堆中无用的对象(没有引用)所占的空间内存

数组的作用?

同类型: 相同类型的数据类型,例如整数跟整数,小数跟小数,字符串跟字符串

多个: 可以有多个,看需求的个数

有序: 索引 用索引从0开始有序的排列,每一个索引对应一个元素,未给元素赋值为0

数组的定义语法?

元素类型[] 变量名; int[] name=new int[]{}

元素类型 变量名[];(不推荐) int name[]=new int[]{}

数组的初始化?

静态初始化:当明确添加到数组的元素时

动态初始化:当明确数组元素的个数,但是不明确具体的元素时

语法:

new 元素类型[]{元素1,元素2,,,,,,}//静态 int[] name=new int[]{元素,元素,元素};

new 元素类型[长度];//动态 int[] name=new int[数组长度];

数组的元素的操作?

如何获取元素的个数 length-1

如何获取数组中的元素 System.out.println(Arrys.toString(数组名))

语法:

注意事项: 索引越界 当数组的元素大于索引则会报错

如何为数组中的指定索引位置设值 int[] 数组名=new int[索引]{需要赋的值}

语法:

注意事项: 索引越界

操作数组过程中可能存在的问题和原因

数组索引越界异常:

空指针异常: 当访问一个空引用变量中的成员时会发生空指针异常 int[] 数组名=null 空指针异常为调用一个数组为空

int[] nums = null;//null表示空引用
int size = nums.length;//发生空指针异常
​
//排除空指针异常的最好的方式,做非空判断
if(nums != null) {
    int size = nums.length;
}

三、方法

方法的作用?

方法的作用就是完成某一个功能,且可以被重复调用的代码块.

main和其他方法的关系?

main方法是程序运行的入口,其他方法块需要在main方法内调用运行

定义方法的语法?

修饰符 返回值类型 方法名称 (参数类型 参数名)

static void getsum(int a){方法体}

方法的返回值类型如何决定?

当不需要返回值,使用void,

如果调用该方法,主方法需要用到某个数据的时候使用return返回值

方法应该有什么形式参数如何决定?

未知因素

调用方法的语法,为什么这里可以使用类去调用方法?

静态方法通过类名就可以直接调用,而不需要类的实例

数据类型 变量名 = 类名.方法名

static修饰

实际参数和形式参数的关系?

形参与形参的数量跟数据类型一致

如何理解可变参数?

简化开发

可变参数就是可以把元素作为元素直接传送

可变参数的底层代码就是一维数组,

方法重载的判断依据?

二同一不同

在同一个类,方法名相同的

方法参数列表不同(个数,参数类型,参数类型的排列顺序)

基本类型和引用类型的参数传递的区别?(画图说明)

基本数据类型传送的是值

引用数据类型传送的是地址,修改是直接改变数组内元素

基本数据类型的数据存放在栈帧中,

引用类型的数据存在堆区中

四、面向对象

面向过程和面向对象的区别?

面向过程是我该如何去做,

面向对象我该让谁去做

什么是抽象?

抽象是类的某一实物的概述

一个类的实际体

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

  1. 初始值

    成员变量默认有初始值

    局部变量没有默认初始值,需要自己初始之后才能调用

  2. 作用域

    成员变量作用域在所定义的类中都有效.

    局部变量作用在定义的花括号内.

  3. 生命周期

    成员变量在

    局部变量生命周期在方法生成时开始,当方法调用完销毁时销毁.

什么是类?什么是对象?

类是对某一事物的抽象描述.

对象表示现实生活中该事物的实例,个体.

定义类的语法?

public class 类名

类名 对象名称=new 类名();

创建对象的语法?

类名 对象名称=new 类名();

属于对象的成员有哪些?

构造器的作用和语法?

构造器的作用是创建对象和给对象做初始化操作

如何理解封装思想?

把对象的字段和方法存放在一个独立的模块当中(类)

信息隐藏,尽可能隐藏对象的数据和功能的实现细节

public和private修饰符的区别?

public修饰符是公共的,

private修饰符,表示当前类私有,类访问权限,只有在本类操作,离开本类后不能

JavaBean规范有哪些?

类必须使用pbulic修饰

必须保证有公共无产构造器

字段必须private修饰(私有化)

每个字段提供一对getter和setting方法(需求提供)

this关键字的作用?

解决成员变量和局部变量存在二意性.

为成员变量设置值, 构造器和setter方法的选择,为什么?

构造器,在创建对象的时候设置初始数据,只能初始化一次。

setter方法,创建对象后再设置初始数据,可以设置多次。

为什么需要继承?

解决多个类中的重复代码

Java中的继承语法?

类名 extents 类名

子类能从父类中继承到哪些成员?

类继承自父类后,子类可以拥有父类的某一些状态和行为,即子类复用了父类的某些功能和状态。可以通过访问修饰符判断子类继承了父类的哪些功能和状态: 1、若父类中的成员(字段或方法)是以public修饰的,则子类无条件全继承;

2、若父类中的成员(字段或方法)是以protected修饰的,则子类也全继承,即使子类与父类不在同一个包中; 3、若父类和子类在同一个包中,此时子类可以继承父类中缺省修饰的成员。

4、若父类中的成员(字段或方法)是以private修饰的,则子类无法继承父类的任何成员,因为private修饰的成员只能在本类中访问; 5、父类中的构造器,子类也无法继承,因为构造器必须和当前的类名相同。

子类什么时候需要覆盖父类中的方法?

当父类的方法不适应子类特征时,需要覆盖.

方法覆盖的规则?

除了方法体,都跟父类的一样

直接拷贝父类中方法的定义粘贴到子类中,再重新编写子类方法体

super关键字的作用?

问题,在子类中的某一个方法中需要去调用父类中被覆盖的方法,此时得使用super关键字。

访问调用方法

什么时候需要把父类中的方法定义成抽象方法?

需要子类继承父类的方法并解决

子类中要有某种功能,我们想要对它做约束.

命名规范,解决不同人写的代码同名的问题.

抽象类应该怎么使用?可以直接使用抽象类创建对象吗?

不能直接使用抽象类创建对象

可以有普通方法

抽象类的意义是什么?

抽象类要有子类才有意义,子类必须覆盖父类的抽象方法,除非子类也是抽象类。

如果要求程序员必须在某个类中特定的方法中实现一个特定的功能, 应该如何实现?

接口是一种约定的规范(做的是定义了应该有哪些功能)

接口中的方法是抽象方法,并不提供功能实现.

实现类实现接口,必须实现接口中的所有抽象方法,

接口约定了实现类应该具备的能力.

接口的作用?

接口约定了实现类应该具备的能力

接口和接口实现类定义的语法?

public interface 接口名

接口 变量 =new 实现类

实现类在实现一个接口的时候, 需要注意哪些问题?

必须实现接口中所有抽象方法,完成功能代码

接口和抽象类的区别?

1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

2、抽象类要被子类继承,接口要被类实现。

3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现

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

5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果

7、抽象类里可以没有抽象方法

8、如果一个类里有抽象方法,那么这个类只能是抽象类

9、抽象方法要被实现,所以不能是静态的,也不能是私有的。

10、接口可继承接口,并可多继承接口,但类只能单根继承。

如何理解编译类型和运行类型?

编译时从大类型(animal)编译类型中查询对应的方法,有就编译通过,否则编译失败.

运行类型从小类型(dog)运行,对象的真实类型

什么是多态? 如何体现多态?好处是什么?

概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。

原因:我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态除了代码的复用性外,还可以解决项目中紧偶合的问题,提高程序的可扩展性.。耦合度讲的是模块模块之间,代码代码之间的关联度,通过对系统的分析把他分解成一个一个子模块,子模块提供稳定的接口,达到降低系统耦合度的的目的,模块模块之间尽量使用模块接口访问,而不是随意引用其他模块的成员变量

有两个好处:

1.应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承

2.派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正

多态情况下, 方法访问的流程?

编译时期,先去找父类方法找到,运行时期-再去找子类方法,找到运行子类方法,找不到运行父类方法

多态指一个对象具备多种形态 多态的前提:    1.必须存在继承或者实现关系    2.父类引用类型变量指向了子类的对象或是接口的引用类型变量指向了接口实现类对象    3.必须有方法重写 注意:    1.多态情况下,子父类存在着同名的成员变量时,默认会访问父类的成员变量    2.多态情况下,子父类存在同名的非静态方法时,默认是访问子类的成员方法    3.多态情况下,子父类存在同名静态方法时,默认是访问父类的成员变量    总结:多态情况下,子父类存在同名成员时,默认访问父类成员,只有存在非静态同名方法时,才访问子类成员    4.多态情况下,不能访问子类特有成员 向上转型与向下转型:   向上转型:父类引用类型变量指向子类的对象   向下转型:将父类的引用强制转换为子类的引用,前提必须有父类的引用存在,向下转型必须依赖于向上转型。 多态的好处(特点):   1)提高代码的维护性(由继承保证)   2)提高代码的扩展性(由多态保证) 多态的弊端:   不能访问子类的特有功能 多态的应用场景:   1.多态用于形式参数类型时,可以接收更多类型参数   形参为抽象类:抽象类多态

根据你的理解,请解释什么面向接口编程?

关于接口的理解。   接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。   我们在一般实现一个系统的时候,通常是将定义与实现合为一体,不加分离的,我认为最为理解的系统设计规范应是所有的定义与实现分离,尽管这可能对系统中的某些情况有点繁烦。   接口的本身反映了系统设计人员对系统的抽象理解。   接口应有两类:第一类是对一个体的抽象,它可对应为一个抽象体(abstract class);   第二类是对一个体某一方面的抽象,即形成一个抽象面(interface);   一个体有可能有多个抽象面。   抽象体与抽象面是有区别的。

this的作用是什么?都有哪些用途?

this的作用是解决成员变量和局部变量二义性

调用其他成员方法

调用本类其他构造方法

super的作用是什么?都有哪些用途?

super关键字的作用是访问父类的成员(非私有字段,跟方法),构造器.

当子类需要用到父类中被重写的方法,

用static修饰的成员和不用static修饰的成员的区别?

static修饰的成员为静态,归类所有,static修饰的成员大家都可以访问到

五、常用类

什么是工具类?工具类如何设计?

完成通用功能的方法分类存放在类中,这些类就叫做工具类

工具类构造器使用static修饰.

static静态,私有化构造器.new一个对象.调用方法

单例模式.减少新建对象占用内存(每一个新建都需要占用到内存空间)

然后用单例模式

饿汉式

懒汉式

枚举式

什么是单例设计模式?有哪些实现方式?

专门用于解决特定场景的需求,使用设计模式是为了可重用代码,让代码更容易被他人更容易理解,保证代码可靠性

八大基本数据类型的包装类

short Short 2个字节 int Integer 4个字节 long Long 8个字节 float Float 4个字节 double Double 8个字节 byte Byte 1个字节 char Character 2个字节 boolean Boolean 这个试编译环境而定

基本类型和包装类的区别

基本数据类型跟引用类型

包装类就是把基本数据类型封装到一个类中,提供便利的方法,让开发者更方便的操作基本类型

什么是装箱和拆箱?

装箱:把基本类型数据转成对应的包装类对象。 拆箱:把包装类对象转成对应的基本数据类型。

什么是自动装箱和拆箱

自动装箱和拆箱,在底层依然是手动装箱和拆箱。

例.integer.valueof()

BigDecimal的加减乘除和保留精度操作

num1.add(num2)

num1.subtrac(num2)

num1.multiply(num2)

num1.divide(num2)

String对象的创建和数据的存储?

String对象的创建和数据的储存在栈中

StringBuilder的常用方法和作用?

StringBuffer封装了一个字符数组,并提供了对该字符数组进行增、删、改、查的方法。所以,我们完全可以把StringBuffer看成一个"字符的容器"!

如果需要对包装的字符数组进行增.删改查时,就需要可变字符串

如果理解StringBuilder中的容量?

StringBuffer封装了一个字符数组,并提供了对该字符数组进行增、删、改、查的方法。所以,我们完全可以把StringBuffer看成一个"字符的容器"!

String、StringBuilder、StringBuffer三者的区别?

String字符串是不可改变的,指的是创建对象完毕后,该对象的内容是不能改变的,一旦改变就变成一个新的对象

当StringBuilder和Stringbuffer对象创建完毕之后,对象的内容可以发生改变,当内容发生改变的时候,对象保持不变

Stringbuffer安全但效率低,StringBuilder反之.

日期和String的相互转换(格式化和解析):SimpleDateFormat

如何方便的操作日期中的数据? Calendar中有哪些常用的方法?

说说你对正则表达式的理解? 通常用在什么地方?

格式化 Date类型转化为String类型:String format(Date date)

解析(parse) String类型转换为Date类型:Date parse(String source)

System.out.println(cal.get(Calendar.YEAR));

System.out.println(cal.get(Calendar.DAY_OF_WEEK));

cal.add(Calendar.YEAR, 100);//在当前年份上增加100

正则表达式用来判断数据是否符合规范.合法.

通常用在创建账号,修改密码等

Date类的作用和常用方法

Simpledateformat

格式化(format):Date类型转换为String类型:String format(Date date)

解析(parse):String类型转换为Date类型:Date parse(String source)

Calendar类的作用和常用方法

修改日期的格式,增删改查

Date类和Calendar的区别

Date类是格式化时间,Calendar类是对时间的增删改查

说说你对正则表达式的理解? 通常用在什么地方?

正则表达式测试字符串的某个模式,查看字符串是否符合某种特定的规范

数组元素拷贝的原理?

循环内按排序,第一个放在另一个数组的指定位置,第二个也是如此

数组元素冒泡排序的原理?

通过循环第一个和第二个比较,大则转换,第二跟第三个比较大又转换.如此反复

六、集合框架

什么是数据结构?

Java的集合框架其实就是对数据结构的封装

数据结构,其实就是计算机存储、组织数据的方式。

数据结构是用来分析研究数据存储操作的,其实就是对数据做增删改查操作。

常见的数据结构有哪些?各自的优缺点是什么?

数组列表, 基于数组的数据结构做查询和修改是非常块的,添加和删除操作比较慢

链表 保存和删除操作的性能高

集合框架的作用是什么?

用来存储多个数据,根据不同的存储方式形成的体系结构,就叫做集合框架体系

也称为容器

说说Java中的集合继承体系

在Java中,集合操作都被设计成接口,被不同底层数据结构的实现类所实现。

List集合的特点是什么?有哪些常用的List集合?

List(列表):允许记录添加顺序,允许元素重复。元素有序且可重复

Set(数据集):不记录添加顺序,不允许元素重复。=> 无序且唯一

Map接口:表示映射关系,规定了两个集合映射关系的规范。

说说ArrayList集合的底层原理

底层原理是数组

什么是泛型?为什么需要泛型?

泛型是不确定数据类型使用泛型占位,后面在具体数据类型,

一般在创建对象时,给未知的类型设置一个具体的类型,当没有指定泛型时,默认类型为Object类型。

集合中为什么需要使用到泛型?如何使用?

要约束放到集合里的类型,object类型,不方便管理里面的元素.

使用泛型不需要强转.

此时的E也仅仅是一个占位符,表示元素(Element)的类型,那么当使用容器时给出泛型就表示该容器只能存储某种类型的数据。

fori和foreach的底层就是迭代器

iterator迭代器,hasnext 判断是否有下一个元素,使用while循环.

集合元素的迭代方式有哪些?

fori

foreach

itreator

并发修改集合元素异常是怎么造成的?怎么解决?

在循环里增删元素

使用itreator迭代器

Set集合的特点是什么?有哪些常用的实现?

set特点是无序且唯一

HashSet类:底层采用哈希表实现,开发中使用对多的实现类,重点。

TreeSet类:底层采用红黑树实现,可以对集合中元素排序,使用不多。

HashSet集合的底层原理是什么?

哈希表实现

Comparable接口和Comparator接口的作用和区别?

Comparable接口位于java.lang包下;Comparator位于java.util包下 Comparable接口只提供了一个compareTo()方法;Comparator接口不仅提供了compara()方法,还提供了其他默认方法,如reversed()、thenComparing(),使我们可以按照更多的方式进行排序 如果要用Comparable接口,则必须实现这个接口,并重写comparaTo()方法;但是Comparator接口可以在类外部使用,通过将该接口的一个匿名类对象当做参数传递给Collections.sort()方法或者Arrays.sort()方法实现排序。Comparator体现了一种策略模式,即可以不用要把比较方法嵌入到类中,而是可以单独在类外部使用,这样我们就可有不用改变类本身的代码而实现对类对象进行排序。

说说Map集合的使用场景

List 集合关注的是索引,其元素是顺序存放的,例如一个班的学生成绩,成绩可以重复,就可以使用List集合存放

Set 集合关注的是唯一性,它的值不允许重复,例如一个班的学生学号,学号不可以重复,就可以使用Set集合存放

Map 集合关注的是唯一的标识符(KEY),他将唯一的键映射到某一个元素,例如每个班学生的学号和姓名的映射,每一个学号对应一个学生的姓名,学号不允许重复,但是学生的姓名是可以重复的。

如何完成Map集合中元素的增删改查?

增加元素 pull()

删除remove

改pull

查 int size

什么是异常? 程序员为什么需要处理异常?

异常就是在程序在运行时出现的意外,不正常的情况

铺抓异常并处理异常,程序员自己解决不了就需要抛出异常 Java的异常继承体系是什么? exception继承throwable 说说Throwable、Error、Exception的区别

1.什么是异常? 异常本质上是程序上的错误,包括程序逻辑错误和系统错误。比如使用空的引用(NullPointerException)、数组下标越界(IndexOutOfBoundsException)、内存溢出错误等。Throwable 类是 Java 语言中所有错误或异常的超类。有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。 2.Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。 例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(VirtualMachineError)、类定义错误(NoClassDefFoundError)等。 3.异常和错误的本质区别:异常能被程序本身处理,而错误无法处理。Error是可以catch的,而且也可以向常规Exception一样被处理,而且就算不捕捉的话也只是导致当前线程挂掉,其他线程还是可以正常运行,如果有需要的话捕捉Error之后也可以做些其他处理。但是Error是一种系统内部的错误,这种错误不像Exception一样是可能是程序和业务上的错误是可以恢复的。 怎么catch?catch throwable会把Error和其他继承Throwable的类捕捉到。而catch Exception只会捕捉Exception极其子类,捕捉的范围更小。 说说异常的分类和区别 分成异常和错误 捕获异常是什么意思? 语法是什么? 就是在在可能发生异常的语句里捕获可能发生的异常, try{}catch(){}finally{} finally语句块的特点是什么? finally语句块的特点是无论是否捕获异常,finally语句块的内容都会执行到 什么时候需要抛出异常? 语法是什么? 当程序员在写代码时无法解决的异常,要提醒用户是否解决异常时,需要抛出异常 说说throw和throws的区别 throw是 自定义异常时需要注意哪些问题? 先确定是运行时异常还是编译时异常,然后再根据情况自定义异常

说说进程和线程的区别

进程是指内存中运行的应用程序(程序的一次运行就会产生一个进程),每个进程都有自己独立的空间

线程是指进程中的一个执行任务

一个Java程序启动后至少有几个线程?他们的作用是什么?

至少有二个线程,一个是主线程

一个后台线程,维护垃圾的回收

自定义线程的方式有几种?他们的区别是什么?

自定义线程的方式有二种,一种是继承,一种是实现

继承方式:

  • Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了。

  • 从操作上分析,继承方式更简单,获取线程名字也简单。

  • 从多线程共享同一个资源上分析,继承方式不能多个线程共享同一个资源。

实现方式:

  • Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口(设计上,更优雅)。

  • 从操作上分析,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用。

  • 从多线程共享同一个资源上分析,实现方式可以多线程共享同一个资源。

说说线程的生命周期和不同状态的线程的转换关系

新生状态=新建 通过调试start()方法进入就绪状态

就绪状态=可运行

说说同步和异步的区别

  • 线程同步:是多个线程访问同一资源时,只有当前正在访问的线程访问结束之后,其他线程才能开始访问(被阻塞)。

  • 线程异步:是多个线程在访问竞争资源时,可以在空闲等待时去访问其它资源(不被阻塞)。

说说你对多线程并发访问带来的问题的理解

死锁是一种并发锁定的特殊状态,指的是多个共享资源,一部分线程持有另一部分资源的锁,另一部分线程持有另外的资源,导致各自持有各自的锁,但需要另一部分资源的锁为被释放,这样就进入了一个相互等待的状态,都无法执行,称之产生了死锁。

死锁是一种特殊的并发状态,程序中药尽力避免死锁。

死锁产生的条件

多把锁进行了同步嵌套

解决死锁

避免死锁

避免锁的同步嵌套

检测并打断死锁

有时无法进行避免死锁的操作,此时只能不停的检测是否有死锁产生,如果有死锁产生,则打断死锁,所谓的打断死锁,就是将造成死锁的某一线程错误退出,打断对锁互相要求的环,从而使程序可以正常运行下去

觉得可以可以收藏点个赞,谢啦!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值