java面试题01

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的安装目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ffeIulEL-1611037137596)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210119114314741.png)]

我们可以看到jre的路径,这说明jdk是包含jre的。(关于各个目录对应的功能,这里只做粗略的解释。bin目录里面主要的就是javac.exe文件,主要作用是编译.java文件,生成jvm可以读取的.class文件。include文件夹下是和jvm进行交互的头文件,lib中则是jvm工作所需要的类库)

我们再找到jre的目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GLM2BFkR-1611037137600)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210119115400592.png)]

再点击bin目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-034Ne1dv-1611037137601)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210119115538235.png)]

在bin目录下,你会发现很多dll动态链接文件,这是应用程序运行过程中必不可少的文件,在点进server你就会发现jvm.dll这个文件。这就说明jre是包含jvm的

因此我们就可以找到他们三者的关系:jdk包含jre,jre包含jvm

  1. JDK 用于开发,JRE 用于运行java程序 ;如果只是运行Java程序,可以只安装JRE,无序安装JDK。
  2. JDk包含JRE,JDK 和 JRE 中都包含 JVM。
  3. JVM 是 java 编程语言的核心并且具有平台独立性。
2. ==和equals的区别

首先是"==":

  1. 在比较基本类型时:比较值是否相同
  2. 在比较引用数据类型时,比较引用的地址是否相同

然后是equals

equals方法只能用于引用类型。在比较(除了String类型时,其实就是引用了”==“方法)。如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zSMu9wwi-1611037137603)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210119123730267.png)]

在比较String类型时:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3WOP5D5V-1611037137605)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210119124104900.png)]

所以在进行String类型比较时,比较的是值是否相同。

3.两个对象的hushcode相同,则equal()为true,对吗?+

hashCode()相等,即两个键值对的哈希值相等。然而哈希值相等,并不一定能得出键值对相等。

关于这个,博主想了很久,最终我的理解就是:

我们把obj比做人,hashcode比做人的名字,内存地址就是人的身份证号码。

名字一样的人不一定是同一个人。身份证一样的人,一定是同一个人!!!!!!

我们可以把hashcode理解为人的名字,名字一样,那么人不一定是同一个人,如果两个名字相同,那么产生了冲突

4.final在java中有什么用

final的意思为最终,在java里的意思就是不可修改

  1. final修饰常量时,常量必须初始化,初始化之后不可以被修改。(当final修饰局部变量时可以不赋值,一旦被赋值,不可更改)
  2. final修饰类时,该类不可以被继承,该类被称为最终类。
  3. 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类,可以发现:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lSxMgiil-1611037137607)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210119133719600.png)]

只能被一个线程访问。

而我们再看StringBuilder,则会发现:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RAnvcCWA-1611037137608)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210119134024478.png)]

没有同步锁。

所以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);
    }
}

(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210119135246377.png)]

当使用StringBuilder时:

StringBuilder sbu =new StringBuilder("我是陶浩");
        System.out.println(sbu.reverse());

运行结果: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zv2fI2DE-1611037137610)(file://C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210119135246377.png?lastModify=1611035695)]

当使用StringBuffer时:

StringBuffer sbf =new StringBuffer("我是陶浩");
        System.out.println(sbf.reverse());

运行结果: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gHpYGpeP-1611037137611)(file://C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210119135246377.png?lastModify=1611035695)]

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("陶"));//得到指定字符的索引

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值