zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    sqllite小型数据库的使用
    winform打开本地html页面
    【app】自动化必备之adb使用
    【app】自动化环境搭建(Appium)for java
    【app】Hybrid?Native?不知道你就out了!
    589. N叉树的前序遍历
    590. N叉树的后序遍历
    897. 递增顺序查找树
    559. N叉树的最大深度
    108. 将有序数组转换为二叉搜索树
  • 原文地址:https://www.cnblogs.com/Ankermaker/p/10645730.html
Copyright © 2011-2022 走看看