Java面试题整理Java基础部分

一、JDK和JRE有什么区别

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

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

具体来说JDK其实包含了编译Java源码的编译器Javac,还包含了很多Java程序调试和分析的工具。简单来说,如果你需要运行Java程序,只需要安装JRE就可以了,如果你需要编写Java程序,需要安装JDK。

二、Java中八种基本数据类型,String属于基本数据类型吗

基本数据类型有:

byte:1字节/8位

boolean:1字节/8位

char:2字节/16位

short:2字节/16位

int:4字节/32位

float:4字节/32位

long:8字节/64位

double:8字节/64位

String不属于基本数据类型,而是属于引用数据类型。

三、int和Integer的区别

1、Integer是int的包装类,int则是java的一种基本数据类型

2、Integer变量必须实例化后才能使用,而int变量不需要

3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值

4、Integer的默认值的null,int的默认值是0

四、int a = 2*8怎样运算效率最快

答案:

用移位运算 int a=2<<3;

a就是2乘以8最后结果是16 这是最盛内存 最有效率的方法

解释:

这个方法确实高效率的。

2 的二进制是 10 在 32 位存储器里面是0000 0000 0000 0010

左移三位后变成0000 0000 0001 0000 也就是16

同理:

2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移3位相当于除以 2 的 3 次方)

五、float f = 3.4;是否正确

不正确。3.4 是双精度,将双精度(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f = (float)3.4;或者写成float f = 3.4F。

六、short s1 = 1; s1 = s1+1;有错吗short s1 = 1;s1 += 1;有错吗

对于 short s1 = 1; s1 = s1 + 1; 由于 1 是int类型,因此s1 + 1运算结果也是int型,需要强制转换类型才能废止给short型。而 short s1 = 1; s1 += 1; +=操作符会进行隐式自怼类型转换,是Java语言规定的运算符;Java编译器会对它进行特殊处理,因此可以正确编译。因为s1 += 1;相当于 s1 = (short) (s1 + 1)。

七、int 和 Integer有什么区别

为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。Java为每个原始类型提供了包装类型:

原始类型:boolean,char,byte,short,int,long,float,double

包装类型:Boolean,Charater,Byte,Short,Integer,Long,Float,Double

自动装箱:基本数据类型自动转换为包装类型

自动拆箱:包装类型自动转换为基本数据类型

八、Math.round(11.5)等于多少Math.round(-11.5)等于多少

Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5 然后进行下取整。

九、switch 石佛能作用在 byte 上,是否能作用在 long 上,是否能作用在String上

在Java 5 以前,switch(expr) 中,expr只能是byte、short、char、int。从Java 5开始,Java中引入枚举类型,expr也可以是enum类型,从Java 7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

十、在Java中,如何跳出当前的多重嵌套循环

在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环。(Java中支持带标签的break和continue语句,作用有点类似与C和C++中的 goto 语句,但是就像要避免使用goto一样,应该避免使用带标签的break和continue,因为它不会让你的程序变得更加优雅,很多时候甚至有相反的作用)

十一、实现两个整数变量的交换

方式一:开发中常用的,使用中间变量
public class SwapDemo{
public static void main(String[] args) {
int i = 10;
int j = 20;
int temp;
temp = i; //i = 10; j = 20; temp = 10;
i = j;
//i = 20; j = 20; temp = 10;
j = temp; //i = 20; j = 10; temp = 10;
System.out.println("i=" + i + ";j=" + j);
// "i=20;j=10"
}
}
方式二:不使用中间变量的,"和"实现
public class SwapDemo{
public static void main(String[] args) {
int i = 10;
int j = 20;
i = i + j;
//i = 30; j = 20;
j = i - j;
//i = 30; j = 10;
i = i - j;
//i = 20; j = 10;
System.out.println("i=" + i + ";j=" + j);
// "i=20;j=10"
}
}
方式三:面试中使用的,按位亦或 " ^ "
public class SwapDemo{
public static void main(String[] args) {
int i = 10;
int j = 20;
i = i ^ j;
j = i ^ j;
i = i ^ j;
System.out.println("i=" + i + ";j=" + j);
// "i=20;j=10"
}
}
方式四:一句话实现交换
public class SwapDemo{
public static void main(String[] args) {
int i = 10;
int j = 20;
j = ( i + j ) - ( i = j );
System.out.println("i=" + i + ";j=" + j);
// "i=20;j=10"
}
}

十二、==和equals的区别

==号在比较基本数据类型时比较的是值,而用==号比较两个对象时比较的是两个对象的地址值;

equals()方法存在于Object类中,默认效果和==号的效果一样,也是比较的地址值,然而,Java提供的所有类中,绝大多数类都重写了equals()方法,比如String和Integer等,重写后的equals()方法一般是比较两个对象的值。

十三、hasCode()和equals()的区别

1、hashCode() 方法的租用是获取对象的哈希值,获取对象每个属性的哈希值,最终返回对象的哈希值;

2、equals() 方法默认比较的是两个对象的地址值,而一般使用需要进行重写,比较对象每个属性的hash值是否一致,若完全两个对象的每个属性值都相同则认为是同一个对象,若有一个属性不一致则认为两个对象不相同。

3、一般来说 hashCode 相同的两个对象不见得是一个对象,有可能发生哈希碰撞现象,需要重写hashCode()方法,在方法中,每次计算hash值时,

十四、两个对象的hashCode() 相同,则equals()也一定为true

不对,两个对象的hashCode() 相同,equals() 不一定true。

hashCode() 只是计算对象属性的哈希值,有可能属性不一致,但是刚好哈希值一样,发生哈希碰撞,比如5 + 2 = 7,4 + 3 = 7,但是这两个7并不是同一个7.

十五、Integer常量池问题

Integer i = 100;
Integer j = 100;
System.out.print(i == j); //true
Integer i = 128;
Integer j = 128;
System.out.print(i == j); //false
解析:
Integer 类型维护了一个整数常量池,取值范围 -128 ~ 127.
创建Integer 对象时,如果数值在范围内,直接从常量池中获取,否则需要开辟空间创建新的对象。

十六、char型变量中能不能存储一个中文汉字,为什么

char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一的方法),一个char类型占2个字节(16比特),所以放一个中文史没问题的。

十七、final修饰的作用

1、final 修饰的类叫做最终类,该类不能被继承。

2、final修饰的方法不能被重写。

3、final修饰的变量叫做常量,常量必须初始化,初始化之后值就不能被修改。Java泛型

十八、Java泛型

Java泛型(generics)是JDK 5 中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

十九、泛型的好处

1、类型安全。泛型的主要目标是提高Java程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些泛型就只存在与程序员的头脑中(或者如果幸运的花,还存在于代码注释中)。

2、消除强制类型转换。泛型的一个附带好处是消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

3、潜在的性能收益。泛型为较大的优化带来了可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的JVM的优化带来可能。由于反省的实现方式,支持泛型(几乎)不需要JVM或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时写的代码,只是更能确保类型安全而已。

相关推荐
起名字真南14 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
爬山算法19 分钟前
Maven(28)如何使用Maven进行依赖解析?
java·maven
tyler_download25 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~25 分钟前
qt5将程序打包并使用
开发语言·qt
hlsd#26 分钟前
go mod 依赖管理
开发语言·后端·golang
小春学渗透27 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc
杜杜的man30 分钟前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
亦世凡华、30 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
2401_8574396943 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66644 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节