java面试题01
1.jdk,jre,jvm的区别?
首先我们从各自的名称入手,jdk的简称是Java Development Kit ,中文意思就是java开发工具包,即我们开发java程序所必须使用到的工具。jre的简称是Java Runtime Environment ,中文意思就是java运行环境,即在运行java程序时所必须使用到的。jvm,用过vmware的小伙伴都知道vm(Virtual Mechinal)是虚拟机的简称,中文意思就是Java虚拟机。
下面我们找到jdk的安装目录:
我们可以看到jre的路径,这说明jdk是包含jre的。(关于各个目录对应的功能,这里只做粗略的解释。bin目录里面主要的就是javac.exe文件,主要作用是编译.java文件,生成jvm可以读取的.class文件。include文件夹下是和jvm进行交互的头文件,lib中则是jvm工作所需要的类库)
我们再找到jre的目录:
再点击bin目录:
在bin目录下,你会发现很多dll动态链接文件,这是应用程序运行过程中必不可少的文件,在点进server你就会发现jvm.dll这个文件。这就说明jre是包含jvm的。
因此我们就可以找到他们三者的关系:jdk包含jre,jre包含jvm。
- JDK 用于开发,JRE 用于运行java程序 ;如果只是运行Java程序,可以只安装JRE,无序安装JDK。
- JDk包含JRE,JDK 和 JRE 中都包含 JVM。
- JVM 是 java 编程语言的核心并且具有平台独立性。
2. ==和equals的区别
首先是"==":
- 在比较基本类型时:比较值是否相同
- 在比较引用数据类型时,比较引用的地址是否相同
然后是equals
equals方法只能用于引用类型。在比较(除了String类型时,其实就是引用了”==“方法)。如下图:
在比较String类型时:
所以在进行String类型比较时,比较的是值是否相同。
3.两个对象的hushcode相同,则equal()为true,对吗?+
hashCode()相等,即两个键值对的哈希值相等。然而哈希值相等,并不一定能得出键值对相等。
关于这个,博主想了很久,最终我的理解就是:
我们把obj比做人,hashcode比做人的名字,内存地址就是人的身份证号码。
名字一样的人不一定是同一个人。身份证一样的人,一定是同一个人!!!!!!
我们可以把hashcode理解为人的名字,名字一样,那么人不一定是同一个人,如果两个名字相同,那么产生了冲突
4.final在java中有什么用
final的意思为最终,在java里的意思就是不可修改
- final修饰常量时,常量必须初始化,初始化之后不可以被修改。(当final修饰局部变量时可以不赋值,一旦被赋值,不可更改)
- final修饰类时,该类不可以被继承,该类被称为最终类。
- final修饰的方法不可以被重写。
5.java中Math.round(-1.5)是多少?
Math.round()意思为向上取整,即在数轴的右方向上离这个数最近的整数。
Math.floor()也为取整,但它是抹除小数,如1.5=>1.0。
6.String属于基本数据类型吗?
不属于
基本数据类型:int,short,bye,long,float,double,boolean,char
7.Java中操作字符串都有哪些
String,StringBuffer,StringBuilder
String声明的是不可变的对象,每一次修改都会指向一个新的内存地址
StringBuffer,StringBuilder都可以在原有对象的基础上进行操作,不会改变引用的地址。
-
关于线程安全
因为String是不可变的,所以线程较为安全
StringBuffer,我们进入StringBuffer类,可以发现:
只能被一个线程访问。
而我们再看StringBuilder,则会发现:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RAnvcCWA-1611037137608)
没有同步锁。
所以StringBuilder线程不安全,但效率更提高。
8.String str =”i“ 和String str = new String(“i”)一样吗?
当然不一样
String str = " i ",如果常量池没有”i“的话,会在常量池里面直接创建”i“,并且直接将引用地址指向”i“。
String str = new String(“i”)会在堆内存中创建一个对象,然后这个对象的引用地址会指向常量池里面的”i“
9.如何将字符串反转
当字符串是String出来的
public class String02 {
public static void main(String[] args) {
String a ="我是陶浩";
char c[] =a.toCharArray();
String b ="";
for (int i = c.length-1; i >=0 ; i--) {
b=b+c[i];
}
System.out.println(b);
}
}
当使用StringBuilder时:
StringBuilder sbu =new StringBuilder("我是陶浩");
System.out.println(sbu.reverse());
运行结果: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zv2fI2DE-1611037137610)
当使用StringBuffer时:
StringBuffer sbf =new StringBuffer("我是陶浩");
System.out.println(sbf.reverse());
运行结果:
10.String类的常用方法有哪些?
String me = "陶浩Tao";
System.out.println(me.isEmpty());//判断字符串是否为空串
System.out.println(me.length());//得到字符串的长度
try {
System.out.println(me.getBytes("UTF-8"));//得到字符串在某种编码格式下的编码
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(me.toLowerCase());//将字符串转化为小写
System.out.println(me.toUpperCase());//将字符串转化为大写
System.out.println(me.charAt(1));//得到字符串在该索引处的字符
System.out.println(me.compareTo("陶浩"));//比较两个字符串的差值
System.out.println(me.replace("陶","tao"));//替换某一个字符
System.out.println(me.trim());//去掉两边的留白
System.out.println(me.split("a").length);//分割字符串
System.out.println(me.substring(1,4));//分割字符串,指定索引
System.out.println(me.indexOf("陶"));//得到指定字符的索引