JAVA基础查漏补缺(面向面试场景)
- 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);
}
可以看到,这个方法的初始默认行为是比较对象的内存地址值,一般来说,意义不大。所以,在一些类库当中这个方法被重写了,如String、Integer、Date。在这些类当中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