面试1

Java面试1

https://juejin.cn/post/6908514567232421895

1.面向对象和面向过程的区别:

面向过程:分析问题的步骤,然后用函数把这些步骤一步一步的实现,然后在使用的时候一一调用即可。

面向对象:把构成问题的事务分解成各个对象,建立对象的目的也不是完成一个个步骤而是为了在解决某个事物整个过程中所发生的行为。易维护,易复用,易扩展但是性能比面向过程低。

2.普通类和抽象类的区别:

普通类可以实例化调用,抽象类不能被实例化;普通类不能包含抽象方法,可以有普通方法,抽象类可以包含抽象方法。

3.接口和抽象类的区别:

实现:抽象类的子类只能用extend继承,接口必须使用implements来实现接口;

构造函数:抽象类可以有多个构造函数,接口没有构造函数;

实现数量:类可以实现多个接口,但是只能继承一个抽象类;

访问修饰符:接口的方法默认是public修饰,抽象类中的方法可以是任意访问修饰符;

4.JDK和JRE有什么区别:

JDK:java开发工具包,提供了java的开发环境和运行环境。

JRE:java运行环境,提供了java运行所需环境。

JDK包含JRE,编译器,java源码等,JRE包含JVM和需要运行的程序。运行java程序安装JRE就可以了,日常开发需要安装JDK。

5.重载和重写的区别:

重载方法的规则

  • 参数列表:被重载的方法必须改变参数列表;
  • 返回类型:可以改变返回类型;
  • 修饰符:可以改变修饰符;
  • 异常:可以声明新的或者更广泛的异常;

重写方法的规则

  • 参数列表:必须与重写方法的参数列表完全匹配;
  • 返回类型:必须与超类中被重写的方法声明的返回类型或子类型完全相同;
  • 访问级别:一定不能被重写的方法强,可以比被重写方法弱;
  • 非检查异常:重写方法可以抛出任何非检查的异常,无论被重写方法是否声明了该异常;
  • 检查异常:重写方法一定不能抛出新的检查异常,或比被重写方法声明的检查异常更广的检查异常;
  • 修饰符:不能重写标志为final,static的方法;

重载和重写,方法的重载和重写是java多态的不同表现。重写是父类和子类之间多态性的一种表现,重载是一个类中多态的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,该方法被重写。

6.equals和==的区别

基本类型:比较的是值是否相等;

引用类型:比较的引用是否相同;

==:在进行基本类型比较时比较的是值,在非基本数据类型时比较的时其关联的对象在内存中的地址;

equals:在进行基本类型比较时会报编译错误;equals是Object中的方法,在Object类中equals方法是用来比较两个对象的引用是否相等,但是在String类中重写了equals方法,在String类中equals用来比较指向字符串对象所存储的字符串是否相等。

7.重写equals方法时为什么必须要重写hashCode方法:

hashCode()的作用是获取哈希码,也称为散列码;它实际上返回是一个int整数。哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在JDK的Object类中,意味着Java中任何类都包含hashCode()函数。

如果两个对象equals和==相等则hashcode一定相同反之则不一定。在将对象加入HashSet中会先计算hsahCode值来判断对象加入的位置,同时其他对象加入时会将他们的hashCode值进行比较如果不同这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果相同HashSet就不会让其加入成功,不同就会重新散列到其他位置。这样减少了equals的次数。如果两个对象相等则hashCode一定相同。两个对象有相同的hsahcode值,他们也不一定是相等的因此ewuals方法重写则hashCode方法也被重写。

8.java的基本数据类型有哪些,什么是自动拆装箱,String属于基础的数据类型吗:

java基本数据类型有8种:byte(1字节),short(2字节),int(4字节),long(8字节),char(2字节),float(4字节),double(8字节),boolean(2字节);String属于对象不属于基本类型;

自动装箱: 就是将基本数据类型自动转换成对应的包装类。

自动拆箱:就是将包装类自动转换成对应的基本数据类型

为什么需要包装类:

java是一种面向对象的语言很多地方需要使用对象而不是基本数据类型(比如,集合的容器要求元素是Object类型)让基本类型有对象的特征出现了包装类。

int自动装箱都是通过Intefer.valueOf()方法来实现的,Integer的自动拆箱都是通过Integer.intValue()来实现的。

9.final,finally,finalize的区别:

final:用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承。final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改;

finally:是异常处理语句结构的一部分,表示总是执行;

finalize:是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等 JVM 不保证此方法总被调用;

10.String,StringBuffer,StringBuider之间有什么区别:

String和StringBuffer,StringBUider的区别在于String声明的是不可变的对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer,StringBuilder可以在原有对象的基础上进行操作。StringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的而StringBuider是非线程安全的,但是StringBuilder的性能高于StringBuffer,单线程推荐StringBuilder,多线程推荐StringBuffer;

11.String类的常用方法:
  • indexOf():返回指定字符的索引
  • charAt():返回指定索引处的字符
  • replace():字符串替换
  • trim():去除字符串两端空白
  • split():分割字符串,返回一个分割后的字符串数组
  • getBytes():返回字符串的byte类型数组
  • length():返回字符串长度
  • toLowerCase():将字符串转成小写字母
  • toUpperCase():将字符串转成大写字母
  • substring():截取字符串
  • equals():字符串比较
12.深浅拷贝的区别:
  • 浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象;
  • 深拷贝:被复制对象的所有变量都含有与原来对象相同的值,而那些引用其他对象的变量将指向被复制过的新的对象,而不再是原来的那些被引用的对象,深拷贝把要复制的对象所引用的对象都复制了一遍。
13.try catch finally,try里面有return,finally还执行吗?

不管有没有异常,finally都会执行;try里面有return,finally会执行而且会早于return;finally是在return后面的表达式运算后执行但此时返回运算后的值先保存起来,不管finally的代码怎么样返回值都不会改变仍是之前保存的值,所以返回值是在finally执行前确定的;finally里面最好不要包含return否则程序会提前退出返回值不是try或catch中保存的返回值;

14.java中IO流分类
  • 功能:输入流(input),输出流(output)
  • 类型:字节流,字符流

字节流和字符流的区别是字节流按8位传输以字节单位输入输出数据,字节流按16位传输已字符流传输数据。

15.BIO,NIO,AIO有什么区别:
  • BIO:Block IO同步阻塞式IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。

  • NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。

  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

16.Files的常用方法都有哪些:
  • Files. exists():检测文件路径是否存在。

  • Files. createFile():创建文件。

  • Files. createDirectory():创建文件夹。

  • Files. delete():删除一个文件或目录。

  • Files.deleteIfExists() :存在才删除,不存在时不会报错。。

  • Files. copy():复制文件。

  • Files. move():移动文件。

  • Files. size():查看文件个数。

  • Files. read():读取文件。

  • Files. write():写入文件。

posted @ 2021-01-27 13:03  L#  阅读(50)  评论(0编辑  收藏  举报