JavaSE基础加强第一次模拟面试题目 - 参考答案

JavaSE基础加强第一次模拟面试

1.面向对象

重载和重写的区别

重载: 发生在同一个类中,方法名必须相同,参数类型不同.个数不同.顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。 
    
重写: 发生在父子类中,方法名,参数列表必须相同,抛出的异常范围小于等于父类, 访问修饰符范围大于等于父类,如果父类方法访问修饰符为 private 则子类就不能重写该方法。

== 和equals的区别

== 的作用:
  基本类型:比较的就是值是否相同
  引用类型:比较的就是地址值是否相同
    
equals 的作用:
  引用类型:默认情况下,比较的是地址值。
   String、ArrayList、Date这些类都重写了equals方法,比较的是内容而不是地址!

接口和抽象类的区别是什么

成员组成:
    普通类能定义的,抽象类都能定义。
    接口只能包含常量和抽象方法。(JDK8之后可以定义默认方法、静态方法、私有方法)
    
构造方法:
    抽象类可以有构造方法,接口不能有。
    抽象类和接口都不能创建对象。

与类的关系:
    类可以实现多个接口;但是只能继承一个抽象类。

设计思想:
    抽象类通常用于抽取多个子类的共同属性和行为。
    接口通常用于规范功能,所以接口中通常只定义抽象方法。

多态的前提

有继承/实现关系。
有方法重写。
有父类引用指向子类对象。(或者接口指向实现类对象)

抽象类和普通类的关系

抽象类和普通类相比,可以说是有得有失。
	有得:得到定义抽象方法的能力。
	有失:失去创建对象的能力。
除此之外,普通类有的,抽象类都具备。

final 的作用

修饰类:表明该类是最终类,不能被继承。
修饰方法:表明该方法是最终方法,不能被重写。
修饰变量:表明该变量是常量,变量第一次赋值后,不能再次被赋值。

接口的组成

接口的成员特点
	JDK7及之前,接口中只能定义常量和抽象方法,不能有其他成分。
	从JDK8之后,接口中新增了三种非抽象方法。(默认方法,静态方法,私有方法)
    接口中没有构造方法.

2.集合

常见的数据结构有哪些,各有什么特点

栈 :先进后出
    
队列:先进先出
    
数组:查询快,增删慢(底层有索引)

链表:查询慢,增删快
	(查询慢:查询时只能从头结点开始,逐一遍历)
	(增删快:空间是不连续的,不受限制的)
    
红黑树: 
    左子树元素小,右子树元素大。
    查询性能优越。
    增删元素时,旋转的次数比平衡二叉树少,所以增删性能也较好。

集合和数组的区别

1,数组的长度是不可变的,集合的长度是可变的。
2,数组可以存基本数据类型和引用数据类型。
   集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类。

集合的体系和常用实现类特点

1.单列集合的根接口是Collection,包含List和Set两个子接口。
    
2.双列集合的根接口是Map。
    
3.各自特点:
   List接口下的集合:有序,有索引,可重复。
   		ArrayList:底层是数组,查询快,增删慢
    	LinkedList:底层是双向链表,查询慢,增删较快,不受长度限制。
   Set接口下的集合:无序,无索引,不重复。
    	HashSet:底层是哈希表,根据hashCode 和equals去重
        TreeSet:底层是红黑树,元素可以实现排序,根据排序规则去。
   Map接口:数据按键值对的方式存储,键不重复,值可以重复。
        HashMap:底层是哈希表,根据键去重。
        TreeMap:底层是红黑树,可以根据键排序。

ArrayList的底层原理

1.ArrayList底层是一个Object数组.
    
2.使用无参构造方法创建集合时,数组的初始长度为 0
  使用带参构造方法创建集合时,数组长度由参数值指定。

3.当长度为0时,首次添加元素,长度会扩容为10。
    
4.如果添加的元素超过数组长度,数组长度在原来的基础上增加一半。

HashSet添加数据的原理

1. 先调用元素的hashCode方法,确定在哈希表的存储位置。
2. 如果存储位置为空,直接存入元素。
3. 如果存储位置不为空,调用equals方法和该位置的所有元素逐一比较,如果有返回true,表示要存入的元素已经存在,元素将不再重复添加。

3.异常

Java中的异常体系

1.Throwable是所有异常结构的父类,有两种子类:Error和Exception。
    
2.Error:无法通过异常机制处理的严重问题。比如内存溢出。
  Exception:可以通过异常机制处理的问题。比如空指针异常。 

3.Exception异常又分为编译时异常和检查时异常。

编译时异常和运行时异常的区别

编译时异常: 
	直接继承Exception,也叫检查时异常。
	在编译时期就必须处理,否则编译失败,程序无法运行。
	(如日期格式化异常ParseException)
运行时异常:
	继承自RuntimeException的异常。
	编译期间无需处理,可以通过优化代码逻辑来解决。
	(如空指针异常,数组索引越界异常,类型转换异常等)

异常处理的两种方式

1.使用try-catch捕捉异常:
    捕获并处理可能出现的异常。
	好处:能让代码继续往下运行。

2.使用throws声明异常:
    定义方法时,对可能出现的异常进行异常声明。
	作用:告知调用者某个方法可能有问题,让调用者去处理。

throw和throws的区别

throws:
 	是异常的处理方式之一,在方法定义上进行声明。
 	作用:告知调用者,该方法有可能会出现这样的异常。
        
throw:
 	是产生一个异常的关键字,用在方法体内部。
 	作用:表示创建并抛出一个异常对象,throw与return有一样的效果,执行了throw之后,方法调用会结束。

4.多线程

线程和进程的区别

进程:
	进程指在内存中运行的应用程序。
	在Windows系统中,一个运行的应用程序就是一个进程。
线程:
    线程是进程的执行单元,是CPU调度的最小单位。
	一个进程可以包含多个线程,线程间共享进程的所有资源。

创建线程有几种方式

继承Thread类的方式。
实现Runnable接口的方式。
使用线程池的方式。

Runnable和Callable的区别

1.线程池的submit方法,可以接收Runnable和Callable两种类型的任务。
2.Runnable接口的run方法,没有返回值,方法中不能抛出异常,只能进行捕捉处理。
  Callable的call方法,有返回值,方法中可以抛出异常。

start和run方法的区别

run():封装线程要执行的任务代码,当线程启动后,会被自动调用运行。
start():启动线程,由创建出来的线程对象调用。

线程有哪几种状态

新建状态(NEW):创建好线程对象,没有调用start。
可运行状态(RUNNABLE):调用start后。
终止状态(TERMINATED):run方法运行结束后。
阻塞状态(BLOCKED):没有抢到锁。
无限等待状态(WAITING):调用了无参的wait方法
计时等待(TIMED_WAITING):调用了sleep方法、或者带参的wait方法。   

wait()和sleep()的区别

1. sleep会进入休眠,时间到了会自动醒来
   wait(): 进入无限等待,直到另一个线程将它唤醒

2. sleep不需要在同步代码块里面。
   wait需要在同步代码块中执行(因为要先抢到锁,才有所谓的释放锁)

3. 如果在同步块中,执行sleep不会释放锁,wait会释放锁,但两个方法都会让线程进入等待。

5.IO流

IO流的分类

1.按流向分:输入流,输出流
    
2.按数据的种类分:
    字节流:(InputStream、OutputStream)
    字符流:(Reader、Writer) 

字节流与字符流的区别

字节流:计算机所有文件都是以字节进行储存的,所以字节流可以操作所有类型的文件。
字符流:只能用于读写纯文本文件。    

close和flush的区别

close方法:
	底层先执行了一次flush,再把流关闭,执行了close之后,流不能再使用。

flush方法:
    把缓冲区的数据刷新到文件中,但是没有关闭流,刷新后可以继续写数据。

posted on 2022-03-19 12:05  -G  阅读(8)  评论(0编辑  收藏  举报

导航