Java基础问题汇总

这篇博客汇总了Java的基础问题,涵盖JDK、JRE、JVM的定义,Java的基本数据类型,运算符,switch结构,成员变量与局部变量的区别,static关键字的使用,封装的意义,面向对象的概念,接口与抽象类的差异,继承的含义,构造方法,防止精度丢失的解决方案,集合与数组的对比,常用集合的特点,以及==和equals的区别,String、StringBuilder与StringBuffer的异同,重载和重写的区别,装箱与拆箱,final和finally的用法,this和super的场景,异常处理,多线程的实现方式,线程生命周期,TreeSet和HashSet的区别,以及TreeMap的去重策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、简述JDK、JRE和JVM
JDK:Java开发工具包,由JVM+核心类库+开发工具组成
JRE:Java的运行环境,包括JVM+核心类库+运行工具
JVM:Java虚拟机,运行Java程序的地方
【注】
核心类库:Java已经写好的一些东西,可以直接拿来用
javac:编译工具,将代码变成class文件
java:运行工具
jdb:调试工具
jhat:内存分析工具
...等等

2、Java的四类八种基本数据类型
整数类型
byte:占用1个字节,-128~127
short:占用2个字节,-32768~32767
int:占用4个字节,-2^31~2^31-1
long:占用8个字节,-2^63~2^63
浮点类型
float:单精度,占用4个字节,可以精确到小数点后7位,数字后加f
double:双精度,占用8个字节,精度是float的2倍
默认浮点类型为double,浮点类型并不能表示一个精确的值,会损失一定的精度
字符类型
char:占用2个字节,可以表示一个字母一个数字
布尔类型
boolean:占用1个字节,只有true和false两个值

3、运算符的种类以及逻辑运算符中&和&&的区别
基本运算符:加+、减-、乘*、除/、取模%
自增自减运算符:++、--
增量运算符:+=、-=、*=、/=、%=
关系运算符:==、!=、<、>、=
逻辑运算符:&、&&、|、||
&表示与(并且),左右两个条件都成立才为真,判断条件时先判断左边的条件再判断右边的条件,不管左边的条件是否成立,左右两边都需要判断
&&和&不同的是,当左边的条件不成立时,不用再判断右边的条件

4、什么是switch结构?其中的参数可以是什么类型?
switch(表达式){
    case 1:
        语句体1;
        break;
    case 2:
        语句体2;
        break;
      ...
    case n:
        语句体n;
        break;
    defalt:
        语句体n+1;
        break;
}
参数可以是byte、short、int、char、string、枚举类型

5、成员变量和局部变量的区别
①在类中声明的位置不同:成员变量直接定义在类中,局部变量声明在方法内、作为形参、代码块内、构造器内部变量
②成员变量可以使用权限修饰符,局部变量不能
③成员变量有初始化值,局部变量没有
④成员变量会加载到堆空间中,局部变量加载到栈空间中

6、static关键字都能修饰什么?有什么特点?
①修饰变量,不需要创建实例就可以直接获取到值
②修饰方法,不需要创建实例就可以通过类调用
③修饰代码块,只需要加载一次
④修饰类,表明该类属于静态内部类

7、什么是封装?为什么要封装?
封装是指将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来对隐藏的信息进行操作和访问
①需要使用对象类型传递数据
②安全性好,避免其他类随意修改自己的成员变量
③隐藏细节,对外提供接口方便实用
④可维护性好,方便重用

8、请详细说明面向对象
把数据及对数据的操作方法放在一起,作为一个相互依存的整体,对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。对象即为人对各种具体物体抽象后的一个概念,人们每天都要接触各种各样的对象,如手机就是一个对象。

9、接口与抽象类的区别
抽象类:父类可能知道子类都有哪些功能,但功能具体怎么实现不清楚,父类只需要提供一个没有方法体的定义即可,在子类中完成方法的具体实现。把没有方法体的方法成为抽象方法,包含抽象方法的类就是抽象类。
接口:抽象方法的集合,通过继承接口的方式,从而来继承接口的抽象方法。
①抽象类可以有默认的方法实现,接口中的方法全是抽象的
②子类使用extends关键字继承抽象类,使用implements来实现接口
③抽象类可以有构造器,接口不能
④抽象方法可以有public、protected和default这些修饰符,接口方法默认修饰符是public,不能使用其他修饰符
⑤抽象类可以有main方法并且可以运行,接口没有main方法
⑥子类可以继承一个类实现多个方法,接口只能继承一个或多个其他接口
⑦在抽象类中添加新方法时,可以给它提供默认的实现,因此不需要改变其他的代码;在接口中添加新方法时,必须改变实现该接口的类

10、什么继承
如果多个类中存在大量重复的信息(例如属性:姓名,年龄)我们可以将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。子类继承父类的属性和行为,使得子类对象可以直接具有与父类相同的属性、相同的行为,子类可以直接访问父类中非私有的属性和行为。

11、什么是构造方法?是否可以被重写?为什么?
构造方法是用来实现类的实例化,它分为有参构造和无参构造。
不能被重写,因为构造方法不能被继承。

12、防止精度缺失可以用什么?
使用Bigdecimal进行计算

13、集合与数组的区别
①数组声明了它容纳的元素的类型,而集合不声明
②数组是静态的,具有固定的大小,而集合是可以动态扩展容量的
③数组存放的类型只能是一种,集合可以存放多种类型的数据

14、都有哪些集合以及它们各自的特点
List:存放对象有序,可以重复;
Set:存放的对象是无序的,内容不能重复;
Map:集合中存储键值对,键不能重复,值可以;

15、==和equals的区别
==符号如果比较的是基本数据类型,则比较的是其存储的值是否相等;如果比较的是引用数据类型,则比较的是所指向对象的地址值是否相等(是否是同一个对象)。
equals方法对于字符串来说是比较内容的,而对于非字符串比较的是其指向的对象是否相同。

16、String,StringBuilder与StringBuffer的区别
String是不可变的,一旦string对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁;
StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建后,通过其提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。StringBuffer对象是一个字符序列可变的字符串,它没有重新生成一个对象,而且在原来的对象中可以连接新的字符串;
StringBuilder类也代表可变字符串对象,实际上StringBuilder和StringBuffer基本类似,两个类的构造器和方法也基本相同,不同的是,StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。

17、重载和重写是什么?
重载:在一个类中允许有多个同名方法,只要它们的参数个数或者参数类型不同即可;
重写:发生在子类和父类之间,父类中声明方法不用写方法体,具体怎么实现在子类中定义。

18、包装类拆箱装箱是什么意思?
装箱是将值类型装换成引用类型的过程;拆箱就是将引用类型转换成值类型的过程。

19、final和finally的区别
final:java中的关键字,修饰符,只能被赋值一次;
finally:java中的一种异常处理机制,用在try,catch后。

20、this和super都能用到哪些地方?
Java关键字this只能用于方法体内,当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。因此,this只能在类中的非静态方法中使用,静态方法和静态代码块中绝对不能出现this。
super关键字和this作用类似,让被屏蔽的成员变量或者成员方法变为可见,或者说用来引用被屏蔽的成员变量和成员方法。不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)。

21、什么是异常?throw和throws的区别
程序在运行过程中发生由于外部问题(如硬件错误、输入错误等)导致的程序异常事件。
在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接收参数。那么,当调用方法使用接收到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。
①throw代表动作,表示抛出一个异常的动作;throws代表一种状态,表示方法可能有异常抛出;
②throw用在方法实现中,而throws用在方法声明中。
③throw只能用于抛出一种异常,而throws可以抛出多个异常。

22、请说出5个异常类型、说出几种常见的异常
NullPointerException: 空指针异常,这个异常是经常会发生的,属于运行时异常。
ClassCastException: 类型强制转换异常,Java的一些语法知识不太熟悉的时候会发生的异常。
ArrayIndexOutOfBoundsException:数组下标越界异常,特别常见的一个异常,粗心的程序员都会犯的错误。
ArithmeticException:算术运算异常。
NumberFormatException: 数字格式异常。

23、什么是线程,多线程的三种实现方式,多线程的生命周期
线程是操作系统能够进行运算调度的最小单位。
①继承Thread类;
②实现Runnable接口;
③使用ExecutorService、Callable、Future实现有返回结果的多线程。

多线程之(线程的生命周期) - 简书

24、TreeSet和HashSet的区别
相同点:单例集合,数据不可重复。
不同点①:底层使用的储存数据结构不同,Hashset底层使用的是HashMap哈希表结构储存,而Treeset底层用的是TreeMap树结构储存;
不同点②:储存的数据保存唯一方式不用,Hashset是通过复写hashCode()方法和equals()方法来保证的,而Treeset是通过Compareable接口的compareto方法来保证的;
不同点③:hashset无序,Treeset有序。

25、TreeMap如何去重
TreeMap的去重有两种方式
①实现Comparable 并重写compareTo方法
②单独写一个比较器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值