JAVA基础查漏补缺(面向面试场景)

  1. JDK 和 JRE 有什么区别?(知道各其组成OK的)

JDK:开发java程序用的开发包,JDK里面有java的运行环境(JRE),包括client和server端的。
JRE:运行java程序的环境,JVM,JRE里面只有client运行环境,安装过程中,会自动添加PATH。

    2.== 和 equals 的区别是什么?(多和底层存储结构思考理解,目前遇到3家都问了)

java当中的数据类型和“==”的含义:

基本数据类型(也称原始数据类型) byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==,比较的是他们的值

引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。

注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为new一次,都会重新开辟堆内存空间

equals()方法介绍:

JAVA当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,equals的源码是这样写的:

public boolean equals(Object obj) {

    return (this == obj);

}

可以看到,这个方法的初始默认行为是比较对象的内存地址值,一般来说,意义不大。所以,在一些类库当中这个方法被重写了,如StringIntegerDate。在这些类当中equals有其自身的实现(一般都是用来比较对象的成员变量值是否相同),而不再是比较类在堆内存中的存放地址了。 
所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来

我们对上面的两段内容做个总结吧:

 == 的作用:
  基本类型:比较的就是值是否相同
  引用类型:比较的就是地址值是否相同
equals 的作用:
  引用类型:默认情况下,比较的是地址值。
注:不过,我们可以根据情况自己重写该方法。一般重写都是自动生成,比较对象的成员变量值是否相同

来自:https://www.cnblogs.com/smyhvae/p/3929585.html【全面解释】

  3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? 

不对的;从下面去总结:

hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢?

     因为重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢?

      因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出:

1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。

2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!

  4.final 在 java 中有什么作用?

 

final关键字是我们经常使用的关键字之一,它的用法有很多,但是并不是每一种用法都值得我们去广泛使用。它的主要用法有以下四种:

 

1用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值;

 

2用来修饰方法参数,表示在变量的生存期中它的值不能被改变;

 

3修饰方法,表示该方法无法被重写;

 

4修饰类,表示该类无法被继承。

 

上面的四种方法中,第三种和第四种方法需要谨慎使用,因为在大多数情况下,如果是仅仅为了一点设计上的考虑,我们并不需要使用final来修饰方法和类。

  5.java 中的 Math.round(-1.5) 等于多少?

 

列举常用的Math 中的方法:

 

 

 1 public class Demo{
 2     public static void main(String args[]){  
 3         /** 
 4          *Math.sqrt()//计算平方根
 5          *Math.cbrt()//计算立方根
 6          *Math.pow(a, b)//计算a的b次方
 7          *Math.max( , );//计算最大值
 8          *Math.min( , );//计算最小值
 9          */  
10         System.out.println(Math.sqrt(16));   //4.0 
11         System.out.println(Math.cbrt(8));    //2.0
12         System.out.println(Math.pow(3,2));     //9.0
13         System.out.println(Math.max(2.3,4.5));//4.5
14         System.out.println(Math.min(2.3,4.5));//2.3
15         /** 
16          * abs求绝对值 
17          */  
18         System.out.println(Math.abs(-10.4));    //10.4  
19         System.out.println(Math.abs(10.1));     //10.1  
20         /** 
21          * ceil天花板的意思,就是返回大的值
22          */  
23         System.out.println(Math.ceil(-10.1));   //-10.0  
24         System.out.println(Math.ceil(10.7));    //11.0  
25         System.out.println(Math.ceil(-0.7));    //-0.0  
26         System.out.println(Math.ceil(0.0));     //0.0  
27         System.out.println(Math.ceil(-0.0));    //-0.0  
28         System.out.println(Math.ceil(-1.7));    //-1.0
29         /** 
30          * floor地板的意思,就是返回小的值 
31          */  
32         System.out.println(Math.floor(-10.1));  //-11.0  
33         System.out.println(Math.floor(10.7));   //10.0  
34         System.out.println(Math.floor(-0.7));   //-1.0  
35         System.out.println(Math.floor(0.0));    //0.0  
36         System.out.println(Math.floor(-0.0));   //-0.0  
37         /** 
38          * random 取得一个大于或者等于0.0小于不等于1.0的随机数 
39          */  
40         System.out.println(Math.random());  //小于1大于0的double类型的数
41         System.out.println(Math.random()*2);//大于0小于1的double类型的数
42         System.out.println(Math.random()*2+1);//大于1小于2的double类型的数
43         /** 
44          * rint 四舍五入,返回double值 
45          * 注意.5的时候会取偶数    异常的尴尬=。=
46          */  
47         System.out.println(Math.rint(10.1));    //10.0  
48         System.out.println(Math.rint(10.7));    //11.0  
49         System.out.println(Math.rint(11.5));    //12.0  
50         System.out.println(Math.rint(10.5));    //10.0  
51         System.out.println(Math.rint(10.51));   //11.0  
52         System.out.println(Math.rint(-10.5));   //-10.0  
53         System.out.println(Math.rint(-11.5));   //-12.0  
54         System.out.println(Math.rint(-10.51));  //-11.0  
55         System.out.println(Math.rint(-10.6));   //-11.0  
56         System.out.println(Math.rint(-10.2));   //-10.0  
57         /** 
58          * round 四舍五入,float时返回int值,double时返回long值 
59          */  
60         System.out.println(Math.round(10.1));   //10  
61         System.out.println(Math.round(10.7));   //11  
62         System.out.println(Math.round(10.5));   //11  
63         System.out.println(Math.round(10.51));  //11  
64         System.out.println(Math.round(-10.5));  //-10  
65         System.out.println(Math.round(-10.51)); //-11  
66         System.out.println(Math.round(-10.6));  //-11  
67         System.out.println(Math.round(-10.2));  //-10  
68     }  
69 }

##6.java 中操作字符串都有哪些类?它们之间有什么区别?

常用的方法如下:

 1、获取:

  1.1 字符串中包含的字符数,也就是字符串的长度。

  int length():获取长度。

  1.2 根据位置获取该位置上的某个字符。

  char charAt(int index):返回指定索引处的char值。

  1.3 根据字符获取该字符在字符串的位置。

  int indexOf(String str):返回的是str在字符串中第一次出现的位置。

  int indexOf(int ch,int fromIndex):fromIndex指定位置开始,获取ch在字符串中出现的位置。

  int lastIndexOf(int ch):反向索引一个字符出现的位置

 2、判断:

  2.1  字符串中是否包含某一个子串。

  boolean contains(str);

  特殊之处:indexOf(str):可以索引str第一次出现的位置,如果返回-1表示该str不在字符串中存在。所以,也可以用于对指定判断是否包含。

if(str.indexOf("aa")!=-1) 而且该方法既可以判断,又可以获取出现的位置

  2.2 字符中是否有内容。

  boolean isEmpty():原理就是判断长度是否为0.

  2.3 字符串是否是以指定内容开头。

  boolean startsWith(str);

  2.4 字符串是否是以指定内容结尾。

  boolean endsWith(str);

  2.5判断字符串内容是否相同。复写Object类中的equals方法。

  boolean equals(str);

  2.6 判断内容是否相同,并忽略大小写

  boolean equalsIgnoreCase();

 3、转换

  3.1 将字符数组转换成字符串。

  构造函数: String(char[])

    String(char[],offset,count):将字符数组中的一部分转换成字符串。

  静态方法:

   static String copyValueOf(char[]);

   static String copyvalueOf(char[] data, int offset, int count);

  3.2 将字符串转换成字符数组(重点)。

  char[] toCharArray();

  3.3 将字节数组转换成字符串。

   String(byte[])

   String(byte[],offset,count):将字节数组中的一部分转换成字符串。

  3.4 将字符串转换成字节数组

  3.5 将基本数据类型转换成字符串。

  String valueOf(int);

  String valueOf(double);

  特殊:字符串和字节数组在转换过程中是可以指定编码表的。

 4、替换

  String replace(oldchar,newchar);

 5、切割

  String[] split(regex);

 6、截取子串 (获取字符串中的一部分)

  String substring(begin);

  String substring(begin,end);

 7、转换,去除空格,比较

  7.1 将字符串转成大写或者小写。

  String toUpperCase();

  String toLowerCase();

  7.2 将字符串两端的多个空格去除。

  String trim();

  7.3 将两个字符串进行自然顺序的比较。

END BY 2019 4/2 

ADD   BY  Ankermaker 

 

posted @ 2019-04-02 21:59  Ankermaker  阅读(387)  评论(0编辑  收藏  举报