JAVA面试之基础篇

7 篇文章 0 订阅
7 篇文章 1 订阅

1.1.JDK和JRE有什么区别

JDK: Java Development Kit 的简称,Java开发的工具包,提供Java开发环境和运行环境.

JRE: Java Runtime Environment 的简称,Java运行环境,为Java运行提供所需环境

具体来说JDK包含JRE,同时还包含了编译Java源码的编译器Javac,还包含了很多Java调试和分析工具.简单来说:如果只需要运行Java程序,只需要安装JRE即可,如果需要编写Java代码,则需要安装JDK

1.2.Java中的几种基本类型,各占多少字节

数据类型:

基本数据类型占字节数:

基本类型大小取值范围
boolean1字节8位    true、false
byte1字节8位有符号整数-128 ~ +127
short2字节16位有符号整数-32768(-2^{15}) ~ +32767(+2^{15}-1)
int4字节32位有符号整数-2147483648(-2^{31}) ~ +2147483647
long8字节64位有符号整数-2^{63} ~ +2^{63}-1
char2字节16位Unicode字符0 ~65535 (2^{16}-1)
float4字节32位浮点数1.4E-45 ~ 3.4E+35,-1.4E-15 ~ -3.4E+38
double8字节64位浮点数4.9E-324 ~ 1.7E+308,-4.9E-324 ~ -1.7E+308

 1.3.==和equals的区别是什么

==: 用来判断两个变量的值是否相等.如果变量是基本类型则直接比较;如果是引用类型,则比较引用类型的首地址值

equals:比较两个对象是否一样,实际上就是刁调用对象equals方法进行比较.equals默认情况下是引用比较,比较的是地址值,但很多类重写了equals方法,比如String、Integer等把它变成了值的比较,所以一般情况下equals比较的是值是否相等

1.4.两个对象的hashCode()相同,equals()一定为true?

显然这个说法是错误的,两个对象的hashCode()相同,equals()不一定为true.在散列表中,hashCode()相等即两个键值对的hash值相等,并不一定得出键值对相等.

1.5.final在Java中的作用

final修饰的类叫最终类,该类不能被继承

final修饰的方法不能被重写

final修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改

1.6.String能被继承吗?为什么

当然不可以!因为String是由final修饰的,而final修饰的类不能被继承.实现细节不允许被改变.平常我们定义的 String str = "abc"(直接赋值);其实和String str =  new String("abc")(通过构造器构造)是存在差异的

 1.7.String str =  "abc"和String str = new String("abc");产生几个对象?

1.前者产生0或者1个对象,后者产生2或者1个对象,这个首先得看字符串常量池,如果字符串常量池中没有,都在常量池中创建一个,如果有前者直接引用,后者还需要在堆内存中创建一个实例对象"abc"

2.对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中.

3.为了提升jvm性能和减少内存的消耗,避免字符串重复创建,项目中还是不要使用 new String()去创建字符串,最好使用String直接进行赋值

1.8.Java中的Math.round(-1.5)等于多少?

等于-1 因为在数轴上取值时,中间值0.5向右取值,所以+0.5向上取整,-0.5直接舍去

1.9.String属于基础的数据类型吗?

显而易见,不属于!基础数据类型一共8种:byte、boolean、char、short、long、int、float、double,而String不属于基础数据类型

1.10.Java操作字符串有哪些类?他们有什么区别?

操作字符串的类有:String、StringBuffer、StringBuilder

String和StringBuffer、StringBuilder的区别在于String声明的是不可变的对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer和StringBuilder是在原有对象基础上进行的操作,所以在经常改变字符串内容的情况下尽量不要用String

StringBuffer和StringBuilder的区别在于,StringBuffer是线程安全的,而StringBuilder是线程不安全的,但是StringBuilder的性能是高于StringBuffer的,所以在单线程的环境下推荐使用StringBuilder多线程的环境下推荐使用StringBuffer.

1.11.String str = "i" 和 String str = new String("i")一样吗?

肯定不一样! 因为内存分配方式不一样.String str = "i"的方式,Java虚拟机会将其分配到常量池中,而String str = new String("i")会被分到堆内存中.

1.12.怎样将字符串反转?

使用StringBuilder或者StringBuffer的reverse()方法

1.13.String常用的方法有哪些?

indexOf()

返回指定字符的索引
charAt()返回指定索引处的字符
replace()字符串替换
trim()去除字符串两端空白
split()

分割字符串,返回一个分割后的字符串数组

getBytes()

返回字符串的byte类型数组
length()返回字符串的长度
toLowerCase()将字符串转成小写字母
toUpperCase()将字符串转成大写字母
substring()截取字符串

equals()

字符串比较

1.14.抽象类一定要有抽象方法吗?

不一定,抽象类可以没有抽象方法的

1.15.普通类和抽象类有什么区别呢?

普通类不能包含抽象方法,抽象类可以包含抽象方法.

抽象类不能直接实例化,普通类可以直接实例化.

1.16.抽象类能用final修饰吗?

不能,定义抽象类就是为了让其他类继承的,如果定义为final该类就不能被继承,这样彼此就会产生矛盾,所以final就不能修饰抽象类.

1.17.接口和抽象类有什么区别呢?

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

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

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

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

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

6.抽象方法只能声明,不能实现 abstract void abc();不能写成  abstract void abc(){};

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

8.如果一个类中有抽象方法,那么这个类就只能是抽象类

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

10.接口可继承接口,并可多继承接口,但是类只能单向继承

1.18.继承和聚合的区别在哪?

继承:指的是一个类(称为子类,子接口)继承另外的一个类(称为父类,父接口)的功能,并且可以增加他自己新功能的能力,继承是类与类或者接口与接口之间常见的关系;在Java中,此类关系通过关键字extends明确标识,在设计时一般没有争议性;

 聚合:关联关系的一种特例,它体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分的关系是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个 整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致 的,只能从语义级别来区分;

 1.19.Java中IO流分几种?

按照功能来分: 输入流(input)、输出流(output)

按照类型来分:字节流和字符流

字节流和字符流的区别: 字节流按8位传输以字节为单位输入输出数据,字符流按16位传输以字符为单位输入输出数据.

1.20.BIO、NIO、AIO的区别是什么?

BIO: Block IO同步阻塞式IO,就是我们平常使用的比较传统的IO,特点模式简单使用方便,但是并发处理能力比较低

NIO: New IO同比阻塞式IO,传统IO的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用.

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

1.21.Files的常用方法有哪些?

方法名实现功能
Files.exists()
检测文件路径是否存在
Files.createFile()
创建文件
Files.createDirectory()
创建文件夹
Files.delete()
删除一个文件或目录
Files.copy()
复制文件
Files.move()
移动文件
Files.size()
查看文件个数
Files.read()
读取文件
Files.write()
写入文件

持续更新哦,下一篇整理一下Java容器的相关面试题吧

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猿学码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值