一、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或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时写的代码,只是更能确保类型安全而已。