Java面试208道题(持续更新......)

1、JDK 和 JRE 有什么区别?
JRE是Java Runtime Environment的缩写,顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的,还有所有的Java类库的class文件,都在lib目录下,并且都打包成了jar。
至于在Windows上的虚拟机是哪个文件呢?就是<JRE安装目录>/bin/client中的jvm.dll。
JDK是Java Development Kit的缩写,顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。
2、== 和 equals 的区别是什么?
先分享一波代码,看一看console分别输出的结果是什么!
public static void main(String[] args) {
String s1 = “Java”;
String s2 = “Java”;
String s3 = new String(“Java”);
String s4 = new String(“Java”);

    //1、==两个字符串新建对象之前比较
    System.out.println("s1==s2:"+(s1==s2));
    //2、==字符串与新建对象比较
    System.out.println("s1==s3:"+(s1==s3));
    //3、==两个字符串@新建对象之后比较
    System.out.println("s3==s4:"+(s3==s4));
    //1、equals两个字符串@新建对象之前比较
    System.out.println("s1.equals(s2):"+(s1.equals(s2)));
    //2、equals字符串与新建对象比较
    System.out.println("s1.equals(s3):"+(s1.equals(s3)));
    //3、equals两个字符串@新建对象之后比较
    System.out.println("s3.equals(s4)"+(s3.equals(s4)));
}

在这里插入图片描述
接下来:用一句话总结==和equals的区别
==号比较的是内存地址  ||  equals()比较的是字符串的内容

解析:
  A操作符专门用来比较两个变量的值是否相同,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等
只能用
操作符。
  B  equals方法用来比较两个独立对象的内容是否相同,两条new语句创建了两个对象,然后用s3,s4两个变量分别指向其中的一个对象,这是两个不同的对象,它们的

首地址是不同的,就是说s3,s4中存储的数值是不同的,所以表达式s3==s4将返回false,而两个对象中的内容是相同的,所以s3.equals(4)返回了true。

【字符串的比较基本上都是使用equals方法。
  如果一个类没有自己定义的equals方法,那么ta将继承Object类的equals方法,Object类的的实现代码如下:
     boolean equals(Object o)
     {
    return this==o;
    }

这说明如果一个类没有自己定义的equals方法,ta默认的equals方法,等同于使用s操作符,也就是比较两个变量指向的对象是同一个对象。这时候使用equals和s
    会得到相同的结果!!s1s2和s1.equals(s2)都是true。如果希望写的类能够比较两个实例对象的内容是否相同,则需要覆盖equals方法!!
最后总结:
  1.对于基本数据类型,只有
没有equals()(注意String类型不是基本数据类型),所以很明显值相等就为true。
  2.对于字符串,指比较两者的内存地址,equals()则重写了Object类的equals(),比较的是内容,你可以查看API看看它怎么重写的。对于字符串是存放在方法区的字符串常量池里的,无论定义多少,只要字符串值相等都指同一块内存地址,所以s和equals()结果没区别。
  3.对于实例对象而言,s==比较的依然是内存地址(所以你可以看出无论什么情况,==一直比较的都是内存地址),而equals()默认重写Object类的equals()方法(比较地址)。但是一般我们会自己重写equals(),让它比较值是否相等。
  4.建议:学完“内存地址”和“重写”的内容,再回过头来看这一知识点。

附加总结:
而java的8大基本数据类型分别是:
  数据类型   大小 范围 默认值
  byte(字节)   8 -128 - 127 0
  shot(短整型)  16 -32768 - 32768 0
  int(整型)   32 -2147483648-2147483648 0
  long(长整型) 64 -9233372036854477808-9233372036854477808 0
  float(浮点型) 32 -3.40292347E+38-3.40292347E+38 0.0f
  double(双精度) 64 -1.79769313486231570E+308-1.79769313486231570E+308 0.0d
  char(字符型) 16 ‘ \u0000 - u\ffff ’ ‘\u0000 ’
  boolean(布尔型) 1 true/false false

分类为:
  逻辑类 boolean
  文本类 char
  整数类 byte, short, int, long
  浮点类 double, float。
3、两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不一定!
equls返回为true,则两者的hashcode一定相等,意即相等的对象必须具有相等的哈希码。每当equals方法被覆写,通常需要重写hashCode方法从而
保持对象行为的一致性。而具有相等的hashcode的两个对象equals不一定成立。你可以这样认为也行,hashcode是作为一个对象存储的参考,hash表本身是一种散列表,在数据存储这块,功效比较大,而equals是相当于两对象之间的属性(成员变量)“相等”,意即具有相同的行为(方法)。或许这样讲起来理解比较的费劲。举个例子,比如你定义class A有两个属性,int aA,aB,在定义一个class B也有两个属性,int bA,bB,然后覆写hashcode方法,A类为return aAaB;B类为return bAbB.现在情况已经很显然了,各自实例化一个对象:a,b,假如:a.aA=b.bA,a.aB=b.bB,相等,或者a.aA=b.bB,a.aB=b.bA两个对象a,b的hashcode一定相等,当时你能说两个对象相等吗?显然不能吧,a与b都是不同类的实例。连equals最基本的obj instance of A或是obj instance of B都不成立。如果是同一个类的不同对象,当两者拥有相同hashcode的时候,则一定相等,或者equals成立的时候则hashcode一定为真,这也就是所谓的相等的对象具有行为一致性。
4、final 在 Java 中有什么作用?
final关键字可以用来修饰什么?分别起什么作用?

a) final可以修饰类,这样的类不能被继承。

b) final可以修饰方法,这样的方法不能被重写。

c) final可以修饰变量,这样的变量的值不能被修改,是常量。
5、Java 中的 Math.round(-1.5) 等于多少?
Math.round(11.5) ,首先与 11.5最接近的有两个整数 11 和 12,取较大的那结果是12;
Math.round(-11.5),首先与 -11.5最接近的有两个整数 -11 和 -12,取较大的那结果就是-11;
Math.round(0.5),首先与 0.5最接近的有两个整数 0 和 1,取较大的那结果就是1;
Math.round(-0.5),首先与 -0.5最接近的有两个整数 -1 和 0,取较大的那结果就是0;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值