• 【Java面试题】-- Java String


    Java String

    2019-11-02  17:40:45  by冲冲


    1、String的内存位置

    String是定义在 java.lang 包下的一个类。它不是基本数据类型。String是不可变的。

    JVM使用字符串池来存储所有的字符串对象。字符串常量池存在于Java的堆内存中。(JDK1.6及以前常量池放置于方法区/永久代,JDK1.7开始放置于堆,JDK1.8方法区放置于JVM之外的本机内存)

    2、问题:该段代码中有几个字符串被创建?

    String str = new String("Cat");

    解析:将会创建1或2个字符串。如果在字符串常量池中已经有一个字符串“Cat”,那么就会创建一个“Cat”字符串。如果字符串常量池中没有“Cat”,那么首先会在字符串池中创建,然后才在堆内存中创建,这种情况就会创建2个对象了。

    3、 比较各种场景的String

    String s1 = "abc";
    String s2 = "abc";
    String s3 = new String("abc");
    String s4 = new String("abc");
    
    System.out.println(s1==s2); //true
    System.out.println(s1==s3); //false
    System.out.println(s3==s4); //false
    
    System.out.println(s1.equals(s3)); //true
    System.out.println(s3.equals(s4)); //true

    4、问题:下面的代码将创建几个字符串对象?

    1 String s1 = new String("Hello");  
    2 String s2 = new String("Hello");

    答案是3个对象.。

    第一,行1 在字符串池中创建“hello”对象。第二,行1在堆内存中创建带有值“hello”的新字符串。第三,行2在堆内存中创建带有值“hello”的新字符串。这里“hello”字符串池中的字符串被重用。

    5、问题:下面的代码输入什么?

    String s1 = "abc";
    String s2 = new String("abc");
    s2.intern();
    System.out.println(s1 ==s2); //false

    String的intern()方法:当intern()方法被调用,如果字符串池中含有一个字符串和当前调用方法的字符串eqauls相等,那么就会返回池中的字符串。如果池中没有的话,则首先将当前字符串加入到池中,然后返回引用。因为该段代码没有分配到S2,S2没有变化,如果该第三行代码为 s2 = s2.intern(),则输入true。

    6、String是线程安全的吗?

    String是不可变类,一旦创建了String对象,我们就无法改变它的值。因此,它是线程安全的,可以安全地用于多线程环境中。

    StringBuffer是线程安全的,使用Synchronized锁。

    StringBuilder是线程不安全的。

    7、下面的代码输入什么?

    String s1 = "abc";
    StringBuffer s2 = new StringBuffer(s1);
    System.out.println(s1.equals(s2));

    输入false,因为s2不是String类型,String的equals方法进行了类型判断。同时s1和s2是两个对象,分别两个堆内存地址。

    8、为什么我们在使用HashMap的时候总是用String做key?

    因为字符串是不可变的,当创建字符串时,它的hashcode被缓存下来,不需要再次计算。因为HashMap内部实现是通过key的hashcode来确定value的存储位置,所以相比于其他对象更快。

    9、判断一个String是否是回文(顺读和倒读都一样的词)

    String str1 = "abcba";
    String str2 = String.valueOf(str.toCharArray().reverse());
    String str2 = new String(str.toCharArray().reverse());
    String str2 = new String(str.split("").reverse());
    // 假设不能使用已有的方法,可以首尾一一对比
    private static boolean isPalindromeString(String str) {
            if (str == null)
                return false;
            int length = str.length();
            System.out.println(length / 2);
            for (int i = 0; i < length / 2; i++) {
                if (str.charAt(i) != str.charAt(length - i - 1))
                    return false;
            }
            return true;
    }

    10、如何让一个字符串变成小写或大写形式?

    使用toUpperCase()方法使得字符串全变成大写,toLowerCase()方法使得字符串全变成小写。

    11、如何比较两个字符串?

    String内部实现了Comparable接口,有两个比较方法:compareTo(String anotherString) 和compareToIgnoreCase(String str)。

    ① compareTo(String anotherString):与传入的anotherString字符串进行比较,如果小于传入的字符串返回负数,如果大于则返回正数。当两个字符串值相等时返回0,此时eqauls方法会返回true。

    ② equalsIgnoreCase(String str):该方法与compareTo方法类似,区别只是内部利用了Character.toUpperCase等方法进行了大小写转换后再进行比较。

  • 相关阅读:
    servlet中如何实现通过Spring实现对象的注入
    异步Socket
    JAVA NIO实现
    【Java并发】
    JAVA实现阻塞队列
    lock与synchronized比较
    线程执行顺序
    ConcurrentHashMap 1.8
    LeetCode 416 分割等和子集
    linux常用指令
  • 原文地址:https://www.cnblogs.com/yadiel-cc/p/11784108.html
Copyright © 2020-2023  润新知