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中的几种基本类型,各占多少字节
数据类型:
基本数据类型占字节数:
基本类型 | 大小 | 取值范围 |
---|---|---|
boolean | 1字节8位 | true、false |
byte | 1字节8位有符号整数 | -128 ~ +127 |
short | 2字节16位有符号整数 | -32768() ~ +32767() |
int | 4字节32位有符号整数 | -2147483648() ~ +2147483647 |
long | 8字节64位有符号整数 | ~ |
char | 2字节16位Unicode字符 | 0 ~65535 () |
float | 4字节32位浮点数 | 1.4E-45 ~ 3.4E+35,-1.4E-15 ~ -3.4E+38 |
double | 8字节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容器的相关面试题吧