总结一下JAVA基础大全(也有很多面试常问基础题)

刷了牛客1041道JAVA题!!(因为不喜欢编程题。即使知道很重要)
在这里插入图片描述
(其实也不多,都是简单的知识点)这些题都是在我找工作和刷题还有找面试题的时候积累下来的,做个总结分享给大家,也方便我自己看或者复习,这些题都是基础,因为还没有工作经验,更深入的像源码或者JVM也没有了解太多!!但是基础得打好!答案都比较简洁易懂,有些是把长篇大论缩减为白话文写的方便记忆(毕竟我觉得在JAVA中任何一个问题都可以深入去讨论。。。)!希望有用。有错请指出谢谢。

JAVA基础

1.&和&&的区别?
&是位运算符,按位与,也就是非短路运算符,判断左边若为false,继续向后执行。
&&是逻辑运算符,就是短路运算符,若判断左边为false,右边的判断不执行。直接返回false。

2.JAVA中有没有goto语句?
有,但是goto是JAVA的保留字,无法使用。(还有一个保留字是const)

3.是否可以继承String类?
String类有关键字final声明,不能被继承。

4.重载和重写的区别?(常见)
区别:

  • 重写实现运行时多态,重载实现编译时多态。
  • 重写发生在子类与父类中,重载发生在一个类中。
  • 重写的规则:方法名和参数列表相同,返回值和抛出异常类型小于或等于父类,访问权限大于或等于父类(两同两小一大)。重载方法名相同,参数列表不用(包括顺序类型个数),与返回值和访问权限无关。
  • 注意:构造方法不能被重写,不能被继承,只能被调用

5.抽象类和接口的区别(内容主要针对jdk1.8之前的)
不同点:

  • 抽象类可以定义构造器,接口不可以
  • 抽象类中可以包括抽象方法(只能被public和protected还有default修饰)和普通方法,接口中只有抽象方法(接口中修饰符默认方法为public abstact ,常量public static final)
  • 抽象类成员权限有四种,接口只能是public
  • 抽象类中的成员变量可以为常量和变量,接口只能是常量
  • 抽象类中可以有静态方法,接口不可以
  • 一个类可以实现多个接口,只能继承一个抽象类

相同点:

  • 都不能实例化
  • 都可以作为引用类型
  • 一个类如果继承了抽象类或者接口,必须实现其中的抽象方法,否则该类要被声明为抽象类
    jdk1.8给接口的方法添加了static和default修饰,必须有方法体且子类可以不重写这类方法

6.阐述静态变量和实例变量的区别
静态变量:被static修饰,也称为类变量,属于类而不属于对象,不管类创建多少变量,静态变量在类中仅有一个拷贝。
实习变量:必须要创建对象才能访问。

7.==和equals的区别(常见)

  • ==是运算符,equals是方法
  • ==用基本数据类型相比较则是比较值,引用类型则是比地址。equals方法比较两个内容是否相等(前提是对equals进行了重写,比如String,Integer,Double等包装类,若未进行重写,也是比地址)

8.break和continue的区别
break:完全结束一个循环,跳出循环体执行后面的语句。
continue:跳过本次循环,执行下一次循环。

9.异常
在这里插入图片描述
(图片是偷来的)
Exception(程序可处理异常)分为两类
RuntimeException(非检查异常也叫运行时异常),不需要我们自己去try catch,编译器不会检查它,不捕获也会编译通过,比如NullPointExcepiton空指针异常,NumberFormatException数字转换异常,ClassNotFoundException找不到类异常。
checkedExcepiton(检查异常也叫非运行时异常),需要用try catch去捕捉,不处理不能通过编译。比如IOException,SQLExcepiton,FileNotFoundExcepiton。
Error(程序不可处理异常): 一般都是虚拟机自身的问题。不用程序处理,比如内存不足,系统崩溃等。

10.throw和throws的区别
throw用在异常体类,由方法体内语句处理。throws用在方法声明,表示由方法调用者处理异常。
执行throw时一定抛出了某种异常,throws只是一种可能性。

11.final,finally,finalize的区别

  • final:用于声明属性方法类,表示属性为常量(要初始化),方法不可覆盖,类不可继承。
  • finally:异常处理中的一部分,表示总是执行。
  • finalize:object的一个方法,在GC时会调用回收对象的此方法,这是一个被动方法,不用我们调用。(扩展一下,执行此方法的标准:1.对象被赋值为null,再也没被调用过 2.给对象重新分配内存空间 3.给对象赋新值)

12.switch支持哪些数据类型
从JAVA5开始引入了Enum,也可以为char,byte,short,int。JAVA7开始可以用String,但是到目前为止long还不行。

13.String,StringBuffer,StringBuilder的区别(常见)

  • String:字符串内容不可被改变
  • StringBuffer:字符串内容可以通过append()方法改变,线程安全。
  • StringBuilder:字符串内容可以通过append()方法改变,单线程下使用,所以效率比StringBuffer高。
  • 补充:在JAVA中无论对字符串进行"+"或者append拼接,实际都用的StringBuffer的append方法,在循环次数较小的时候用StirngBuffer,次数较大或者不确定StringBuilder。

14.什么是序列化?什么时候需要序列化
序列化就是将对象流化,把JAVA对象转为字节序列

  1. 把对象保存到一个文件或者数据库中
  2. 用套接字在网上进行传输数据
  3. 通过RMI传输对象

15.什么是反射?
反射主要是指程序可以访问、检测和修改它本身的一种状态。

16.如何实现对象克隆?

  1. 实现cloneable接口,重写clone()方法
  2. 实现serializable接口(不仅是深度克隆,还可以查出对象是否支持序列化)

17.深拷贝和浅拷贝的区别?
深拷贝是拷贝对象地址和它的值
浅拷贝拷贝引用地址。

18.异常中try,catch,finlly哪个可以省略?
catch和finlly两个中可以省略一个。

19.类的成员变量包括什么,成员方法呢?
类的成员变量:类变量,实例变量
类的成员方法:类方法,实例方法

20.访问修饰符
在这里插入图片描述
21.局部变量需要赋初值吗?
需要。局部变量在创建时只会创建一个引用,并没指向具体的对象,需要赋值以后才可以使用。全局变量(成员变量)可以不赋初值,会有默认值。

22.数组和链表的区别
数组:在内存中连续存储,查找时效率较高,但是因为内存无法改变,数据大是越界,数据小时浪费内存,所以改变时效率低。
链表:动态申请内存空间,增删方便。

23.JVM是什么?JAVA的跨平台是指什么?
JVM是可以执行JAVA字节码的虚拟机进程,JAVA的跨平台时指.class字节码文件的跨平台,字节码文件与JVM无关,JVM会将其解释成对应的机器码来执行,所谓JAVA的跨平台就是在不同平台上安装了JVM。

24.JAVA中各成员的初始化顺序
父类静态成员初始化>父类静态代码块>子类静态成员初始化>子类静态代码块>父类的代码块>父类的构造方法>子类的代码块>子类的构造方法(记住静态在前面就可以)
注意:静态成员和静态代码块只有在类加载的时候执行一次,再次创建实例的时候,不再执行,因为只在方法区存在一份,属于整个类。

25.JAVA的事件处理模型是什么?包括哪些?
JAVA提供的事件处理模型是一种人机交互模型,它有三个基本要素:

  1. 事件源:事件发生的场所,指各个组件,如按钮等,点击按钮其实就是组件上发生的一个事件。
  2. 事件:事件封装了组件上发生的事情,比如按钮单击,按钮松开等等。
  3. 事件监听器:负责监听事件源上发生的特定类型的事件,当事件到来的时候还必须负责处理相应的事件。

26.什么是强引用、软引用、弱引用、虚引用?

  1. 强引用:一个对象赋给一个引用就是强音用,比如new一个对象,一个对象被赋值为一个对象。
  2. 软引用:用SoftReference类实现,一般不会轻易回收,只有内存不够会回收。
  3. 弱引用:用WeekReference类实现,一旦垃圾回收启动,就会回收。
  4. 虚引用:不能单独存在,必须和引用队列联合使用。主要作用是跟踪对象被回收状态。

27.this()和super()的区别,可以同时使用吗?
this用于调用重载的构造器(自己的构造函数),super用于调用父类被子类重写的方法。两者都只能位于构造器的第一行,所以不能同时使用。也不能在static环境中使用。

JAVA集合

在这里插入图片描述
我觉得这张图很详细,唯一就是缺少了一个Queen,Collection集合接口,Map接口
在这里插入图片描述

1.Set和List的区别
Set:无序,不重复,子类HashSet无序,TreeSet默认排序。
List:有序,可重复。

2.HashMap和HashTable,TreeMap的区别
HashMap:线程不安全,无序,键不能重复,值可以重复。键允许一个为null,值可以为null。
HashTable:线程安全,无序,键值不能为null,不可重复。
TreeMap:默认排序,不能重复,不可为null。

3.HashMap和HashSet的区别
HashMap:基于链表的数据结构,即数组和链表的结合体。(如果要对Map进行插入,删除和定位之类操作,用HashMap,如果要遍历,用TreeMap)。
HashSet:底层由HashMap实现,HashSet的值存放在HashMap的Key上,value统一为present。

4.List三个子类的特点
ArrayList:底层是数组,查询快,增删慢。
LinkedList:底层是循环双向链表,增删快,查询慢。
Vector:底层是数组,线程安全,增删慢,查询慢。

5.List,Set,Map的区别

  • List,Set存储单列数据,Map存储键值对双列数据
  • List可重复有序,Set无序不可重复,Map无序不可重复。

6.Collection和Collections的区别
Collection是一个集合接口,Collections是集合类的一个子类。

7.Vector和ArrayList的区别
Vector线程安全,速度慢。
ArrayList速度块,可以使用Collections工具类轻易获取同步列表和只读列表。

8.在Queue中,poll()和remove()有什么区别?
(Queue也是Collection下面的一个接口,图片没画出来)
poll()和remove()都是从队列中取出一个元素,区别在于poll()在获取元素失败会返回空值,但是remove()失败会抛出异常。

9.ArraList如果不声明大小,默认是多少,可以扩充吗?
如果不声明大小,默认是大小为10的数组,每次扩容大小为原来的1.5倍。如果数组指定了大小,就没有扩充。

10.ArrayList和LinkedList的区别(之前也遇到过这个面试题,然后面试官问为什么,我就答不上了,现在追加一下)
ArrayList:底层是动态数组,支持随机访问,查询快,增删慢。(因为需要增删移动数组,例如最坏的情况是删除第一个数组元素,则需要将第2至第n个数组元素各向前移动一位)
LinkedList:底层是循环双向链表,增删快,查询慢。(因为查询要移动指针对链表进行遍历,增删只需要改变指针指向即可)

多线程

1.实现多线程的方式

  1. 继承Thread类,重写run方法,创建Thread子类的实例,调用线程对象的start()方法。
  2. 实现Runnable接口,重写run方法,创建Runnable实现类的实例,调用线程对象的start()方法。
  3. 通过Callable和Future创建线程。

2.多线程流程
在这里插入图片描述
3.多线程中wait()和sleep()方法的区别
wait:使一个线程处于等待状态,等待时会释放掉自身占有的锁资源,通常用于线程交互,用notify/notifyAll方法唤醒。
sleep:使线程睡眠,睡眠时会一直占有锁资源,通常用于暂停执行,有时间限制。(占着CPU去睡觉)

4.Synchronied和volatile关键字的区别(经典)

  • Synchronied可以使用于变量、方法(修饰静态方法的话,给类对象加锁,也叫类锁。修饰非静态方法,给调用该方法的对象加锁,叫对象锁)、类。volatile只能用在变量上。
  • Synchronied保证可见性,原子性。volatile只有可见性。
  • Synchronied会造成线程阻塞,volatile不会。
  • Synchronied锁定变量,只有当前能访问,volatile告诉JVM当前值不确定,需要从内存读取。

5.java中怎么保证多线程安全运行?

  1. 原子性:同一时刻只有一个线程对数据进行操作
  2. 可见性:对主内存的修改,可以及时被其他线程看到
  3. 有序性,指令按顺序执行

6.start()和run()的区别
run()为线程执行体,如果直接调用,就只是一个普通函数。
start()才是真正实现多线程运行的方法,然后Thread调用run(),线程进入运行状态。

7.线程的五个状态
在这里插入图片描述

8.runnable和callable的区别
runnable的run方法返回值为void,callable的call()方法有返回值,配合Future、FurureTask来获取异步结果。

9.什么是死锁?死锁的四个条件?怎么防止死锁?
死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

  • 互斥条件:等待占有资源释放,才能访问。
  • 请求与保持条件:请求获取资源,又不释放自身占有的资源。
  • 不可剥夺条件:获得的资源在未使用完之前,不能被其他进程强行夺走(只能是主动释放)。
  • 循环等待条件: 若干进程间形成首尾相接循环等待资源的关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

如何避免死锁:

  1. 按照一定顺序加锁
  2. 加锁时限,线程尝试获取锁的时候,超时则放弃请求,并且释放自身资源。

10.ThreadLocal是什么?
线程局部变量,局限于线程内部的变量,属于线程自身拥有,是一种线程安全的方式,但:若未被释放容易内存泄漏。

11.什么是线程池?
线程池就是将多个线程对象放到一个容器中,使用时不用new,直接去线程池中拿,节省了开辟线程的时间,提高了代码的执行效率。

12.什么叫线程的回调方法?
程序C调用服务程序S中的A,S又在某时刻反过来调用C中的B,此时,对于C来说,B就叫回调方法。

13.线程池中Submit和execure方法的区别?

  1. 接受参数不同
  2. submit有返回值,execute没有
  3. submit方便Exception处理

14.线程安全的对象有哪些?
Vector、stack、hashtable、enumeration
(简称喂(V)、SHE)

15.线程和进程的区别
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动(就像是我们的正在运行QQ程序,QQ音乐之类的)。(相互独立)
线程:是进程的一个实体,比进程小的可以独立运行的基本单位(可以理解为QQ里面的一个一个的对话框,就是一条条线程)。(内存共享)

还有好多没写,会续更。。。。

猜你喜欢

转载自blog.csdn.net/weixin_43909848/article/details/105640771