每日六道java新手入门面试题,通往自由的道路第二天

 更新时间:2021年07月01日 09:46:06   作者:太子爷哪吒  
这篇文章主要为大家分享了最有价值的6道java面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,对hashCode方法的设计、垃圾收集的堆和代进行剖析,感兴趣的小伙伴们可以参考一下

1. 你可以讲下你对String类有什么其他的了解吗?

在看String的源码过程中,可以发现String 内部实际存储结构为 char数组,在String中有几个比较重要的构造函数:

// 默认的无参构造
public String() {
        this.value = "".value;
}
// 以String为参数的构造方法
public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}
// 以char[] 为参数构造方法
public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}
// 以StringBuffer 为参数的构造方法
public String(StringBuffer buffer) {
    synchronized(buffer) {
        this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
    }
}
// 以StringBuilder 为参数的构造方法
public String(StringBuilder builder) {
    this.value = Arrays.copyOf(builder.getValue(), builder.length());
}

而在String类中有我们比较常见的方法如equals方法,用于比较两个字符串是否相等。它其实重写了Object类的equals方法,它具体的比较过程如下:

  • 先判断两者对象的引用是否相同。如果相同就会直接返回true。
  • 而如果不同的话,则会先判断需要对比的值是否为 String 类型,如果不是则直接返回 false。
  • 而如果是String类型,就会去会循环对比两个字符串中的每一个字符,当所有字符都相等时返回 true,否则则返回 false。

具体源码如下:

public boolean equals(Object anObject) {
    // 对象引用相同直接返回 true
    if (this == anObject) {
        return true;
    }
    // 判断需要对比的值是否为 String 类型,如果不是则直接返回 false
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            // 把两个字符串都转换为 char 数组对比
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            // 循环比对两个字符串的每一个字符
            while (n-- != 0) {
                // 如果其中有一个字符不相等就 true false,否则继续对比
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

而在String类中,也有一个与equals() 比较类似的方法 equalsIgnoreCase(),它主要是用于忽略字符串的大小写之后进行字符串对比。

当然,String类中也有很多我们常见常使用的方法:

  • compareTo() :比较两个字符串
  • indexOf():查询字符串首次出现的下标位置
  • lastIndexOf():查询字符串最后出现的下标位置
  • contains():查询字符串中是否包含另一个字符串
  • toLowerCase():把字符串全部转换成小写
  • toUpperCase():把字符串全部转换成大写
  • length():查询字符串的长度
  • trim():去掉字符串首尾空格
  • replace():替换字符串中的某些字符
  • split():把字符串分割并返回字符串数组
  • join():把字符串数组转为字符串

这些都是我们都可能在实际应用中使用的方法。

2. == 和 equals 的区别

  • == :
    • 对于基本数据类型来说,是用于比较 “值”是否相等的;
    • 而对于引用类型来说,是用于比较引用地址是否相同的。
  • equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
    • 情况 1:类没有覆盖 equals() 方法时,它默认的 equals 方法(从 Object 类继承的)就是使用操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用 equals 和使用会得到同样的结果,就会去比较引用地址是否相同的。
    • 情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

3. String s= new String(“nz”)创建了几个字符串对象?

String 常见的创建方式有两种:new String() 的方式和直接赋值的方式。

  • 直接赋值的方式会先去字符串常量池中查找是否已经有此值,如果有则把引用地址直接指向此值,否则会先在常量池中创建,然后再把引用指向此值;
  • 而 new String() 的方式一定会先在堆上创建一个字符串对象,然后再去常量池中查询此字符串的值是否已经存在,如果不存在会先在常量池中创建此字符串,然后把引用的值指向此字符串。

所以会创建两个对象,一个是字符串常量池中的对象"nz",还有一个new创建在堆中的字符串对象s。然后引用的值指向到该字符串常量池的对象。

让我们简单测试下:

public static void main(String[] args) {
    String s1 = "nz";
    String s2 = new String("nz");
    System.out.println(s1 == s2);  // false
    System.out.println(s1.equals(s2)); // true
}

4. 你可以讲下JVM的运行时数据区或者说内存结构吗?

我们可以分为线程私有和线程共享的两种情况

线程私有:程序计数器,本地方法栈,虚拟机栈

线程共享:堆和方法区

  • 程序计数器:它占用了很小的一块内存空间,记录的是我们当前线程的一个执行的行数。因为线程它可能不断的切换,如何保证到当前线程时,它执行到哪里呢,就是靠程序计数器来实现的。该内 存区域是唯一一个 Java 虚拟机规范没有规定任何 OOM 情况的区域。
  • 虚拟机栈:当jvm执行方法时,会在此区域创建栈帧入栈,它存储方法的各种信息比如局部变量表,操作数栈,动态连接,方法放回地址这些信息。
  • 本地方法栈:它也虚拟机栈类似,但是它主要为native方法服务,例如java需要使用c语言的接口服务时。
  • 堆: 也叫 Java 堆或者是 GC 堆,它是一个线程共享的内存区域,也是 JVM 中占用内存最大的一块区域,几乎所有对象都储存在这里分配内存,也是垃圾回收期主要的管理区域。
  • 方法区:存储一些被虚拟机加载的类信息,常量,静态变量,编译器编译后的代码等数据。

5. 类加载过程

系统加载Class类型文件的主要步骤有加载–>连接–> 初始化,连接又可以分为验证–>准备–>解析

  • 加载:根据类的全限定名来获取类的二进制字节流,在内存中生成一个代表该类的Class对象
  • 验证:主要验证检查class文件的正确性,比如文件格式,元数据,字节码,符号引用的验证。
  • 准备:主要就是为类变量分配内存并设置类变量初始的一个阶段。
  • 解析:虚拟机将常量池内的符号引用替换成直接引用的一个过程。
  • 初始化:它是类加载的最后一步,就是真正执行类中定义的Java程序代码的过程。

6. 而其中类加载器是什么,那有哪些呢?

对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立在 JVM 中的唯一性,每一个类加载器,都有一个独立的类名称空间。而类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象。

主要有一下四种类加载器:

  • 启动类加载器(BootstrapClassLoader)用来加载java核心类库,无法被java程序直接引用。
  • 扩展类加载器(ExtensionClassLoader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
  • 应用程序类加载器(ApplicationClassLoader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader()来获取它。一般情况,如果我们没有自定义类加载器默认就是用这个加载器。
  • 用户自定义类加载器,我们可以自行去通过继承 java.lang.ClassLoader类的方式实现。

而对于一个类加载的过程中,如果一个类加载器收到类加载的请求的时候,它首先不会自己去加载这个类,而是把这个请求委派给自己的父类加载器去完成,一直到顶层的启动类加载器时,只有当父加载无法完成这一加载请求时,就会往下一层一层的尝试去加载类。这种模式就是双亲委派模式,这中模式的好处可以使类有了层次划分,也保障安全。

总结

本篇文章就到这里了,如果这篇文章对你也有所帮助,希望您可以多多关注脚本之家的更多内容!

相关文章

  • Spring Boot使用Log4j2的实例代码

    Spring Boot使用Log4j2的实例代码

    这篇文章主要介绍了Spring Boot使用Log4j2的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • springboot3整合远程调用的过程解析

    springboot3整合远程调用的过程解析

    远程过程调用主要分为:服务提供者,服务消费者,通过连接对方服务器进行请求交互,来实现调用效果,这篇文章主要介绍了springboot3整合远程调用,需要的朋友可以参考下
    2023-06-06
  • java实现微信公众号发送模版消息

    java实现微信公众号发送模版消息

    这篇文章以订单推送为例,主要为大家详细介绍了java实现微信公众号发送模版消息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Spring如何配置文件动态读取pom.xml中的属性

    Spring如何配置文件动态读取pom.xml中的属性

    在项目开发中,经常需要将pom.xml中的属性动态传递给Spring配置文件,实现这一需求,可通过Maven的资源过滤功能,配置占位符替换,具体方法包括:在pom.xml中启用filtering,然后在Spring配置文件中通过${property}方式引用属性
    2024-10-10
  • SpringMVC如何在生产环境禁用Swagger的方法

    SpringMVC如何在生产环境禁用Swagger的方法

    本篇文章主要介绍了SpringMVC如何在生产环境禁用Swagger的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Kryo序列化及反序列化用法示例

    Kryo序列化及反序列化用法示例

    这篇文章主要介绍了Kryo序列化及反序列化用法示例,小编觉得挺不错的,这里分享给大家,需要的朋友可以参考下。
    2017-10-10
  • MyBatis批量添加数据2种实现方法

    MyBatis批量添加数据2种实现方法

    这篇文章主要介绍了MyBatis批量添加数据2种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    这篇文章主要介绍了mybatis使用char类型字段查询oracle数据库时结果返回null问题的解决方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • 一文教会你使用Java中的枚举Enmu

    一文教会你使用Java中的枚举Enmu

    枚举是 Java 中的一种特殊类型,它用于表示一组固定值,这篇文章就是来和大家讲讲枚举的作用与具体使用,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • Spring Boot 自动配置之条件注解浅析

    Spring Boot 自动配置之条件注解浅析

    这篇文章主要介绍了Spring Boot 自动配置之条件注解浅析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02

最新评论