字符串是使用最广泛的Java的类之一。在这里,我列出了一些重要的Java的字符串面试问答。

这将有助于您全面了解String并解决面试中与String有关的任何问题。

Java基础面试问题

Java中的字符串是什么?字符串是数据类型吗?

String是Java中的一个类,并在java.lang包中定义。它不是像int和long这样的原始数据类型。字符串类表示字符串。几乎所有Java应用程序都使用String,关于String我们应该了解一些有趣的事实。的Java 中不可变的字符串状语从句:Java的中的最后的字符串,JVM使用字符串池存储所有字符串对象。

关于字符串的其他一些有趣的事情是我们可以使用双引号和“+”运算符的重载来实例化String对象的方式。

有什么不同的方法来创建字符串对象?

我们可以new像任何普通的Java类一样使用运算符创建String对象,也可以使用双引号创建String对象。String 类中有几个构造函数可用于从char,字节数组,StringBuffer和StringBuilder中获取String。

String str = new String("abc");
String str1 = "abc";

当我们使用双引号创建String时,JVM会在String池中查找是否以相同的值存储了其他String。如果找到,则直接返回该String对象的引用,否则创建一个具有给定值的新字符串对象并将其存储在字符串池中。

当我们使用新的运算符时,JVM将创建字符串对象,但不要将其存储到字符串游泳池中。我们可以使用intern()方法将字符串对象存储到字符串池中,或者如果池中已经存在具有特定值的String,则返回引用。

编写一种方法来检查输入的String是否为回文?

如果字符串的值在反转时相同,则称其为回文。例如,“aba” 是回文字符串。

String类不提供扭转字符串的方法,但StringBufferStringBuilder类有,我们可以用它来检查,如果字符串是回文与否反向方法。

    private static boolean isPalindrome(String str) {
if (str == null)
return false;
StringBuilder strBuilder = new StringBuilder(str);
strBuilder.reverse();
return strBuilder.toString().equals(str);
}

有时,面试官会要求不要使用任何其他类来检查此情况,在这种情况下,我们可以从两端比较String中的字符以找出是否是回文。

    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;
}

写一个方法来从字符串中删除给定的字符?

我们可以使用replaceAll方法将一个字符串的所有出现替换为另一个字符串。需要注意的重要一点是它接受String作为参数,因此我们将使用Characterclass创建String并将其用空String替换所有字符。

    private static String removeChar(String str, char c) {
if (str == null)
return null;
return str.replaceAll(Character.toString(c), "");
}

如何使String大写或小写?

我们可以使用String类toUpperCasetoLowerCase方法以大写或小写形式获取String。这些方法具有一个接受Locale参数并使用该Locale规则将String转换为大写或小写的变体。

什么是String subSequence方法?

Java 1.4引入了CharSequence接口,而String实现了此接口,这是在String类中实现subSequence方法的唯一原因。在内部,它调用String子字符串方法。

如何在Java程序中比较两个字符串?

Java String实现了Comparable接口,它具有两种compareTo()方法变体。

compareTo(String anotherString)方法将String对象与按字典顺序传递的String参数进行比较。如果String对象在传递的参数之前,则返回负整数;如果String对象在传递的参数String之后,则返回正整数。当两个String具有相同的值时,它返回零,在这种情况下,equals(String str)方法也将返回true。

compareToIgnoreCase(String str):此方法与第一个方法类似,只是它忽略大小写。它使用String CASE_INSENSITIVE_ORDER比较器进行不区分大小写的比较。如果该值为零,那么equalsIgnoreCase(String str)还将返回true。

如何将String转换为char,反之亦然?

这是一个棘手的问题,因为String是字符序列,所以我们不能将其转换为单个字符。我们可以使用use charAt方法来获取给定索引处的字符,也可以使用toCharArray()method将String转换为字符数组。

如何将字符串转换为字节数组,反之亦然?

我们可以使用String getBytes()方法将String转换为字节数组,也可以使用String构造函数new String(byte[] arr)将字节数组转换为String。

我们可以在Switch case下使用String吗?

这是一个棘手的问题,用于检查您对当前Java开发的了解。Java 7将Switch case的功能扩展为也使用Strings,早期的Java版本不支持此功能。

如果要为字符串实现条件流,则可以使用if-else条件,如果使用的是Java 7或更高版本,则可以使用Switch用例。

编写程序以打印String的所有排列?

这是一个棘手的问题,我们需要使用递归来查找字符串的所有排列,例如,“ AAB”排列将是“ AAB”,“ ABA”和“ BAA”。

我们还需要使用Set来确保没有重复的值。

写一个函数找出给定字符串中最长的回文?

一个字符串中可以包含回文字符串,并且在给定的字符串中找到最长的回文是一个编程问题。

String,StringBuffer和StringBuilder之间的区别?

该字符串在Java中是不可变的,并且是最终的,因此,每当我们执行String操作时,它都会创建一个新的String。字符串操作消耗资源,因此java为String操作提供了两个实用程序类-StringBuffer和StringBuilder。

StringBuffer和StringBuilder是可变的类。StringBuffer操作是线程安全的,并且在StringBuilder操作不是线程安全的情况下是同步的。因此,在多线程环境中,我们应该使用StringBuffer,但是在单线程环境中,我们应该使用StringBuilder。

由于没有同步开销,因此StringBuilder的性能比StringBuffer快。

为什么String在Java中是不可变的或final?

字符串有几个好处,因为它是不可变的且是final。

  • 字符串池是可能的,因为字符串在Java中是不可变的。
  • 它提高了安全性,因为任何黑客都无法更改其值,并且它用于存储敏感信息,例如数据库用户名,密码等。
  • 由于String是不可变的,因此在多线程中使用是安全的,并且我们不需要任何同步。
  • 字符串用于java类加载器中,不变性提供了确保类加载器可以加载正确类的安全性。

如何在Java中拆分字符串?

我们可以split(String regex)根据提供的正则表达式将String拆分为String数组。

为什么用Char数组而不是String来首选存储密码?

字符串在Java中是不可变的,并存储在字符串池中。一旦创建,它将一直保留在池中,直到收集到垃圾为止,因此即使我们使用密码完成操作,它也可以在内存中使用更长的时间,并且无法避免。这存在安全风险,因为任何有权访问内存转储的人都可以找到明文形式的密码。

如果我们使用char数组存储密码,则在完成密码设置后可以将其设置为空白。因此,我们可以控制它在内存中的可用时间,从而避免String带来的安全威胁。

您如何检查Java中两个字符串是否相等?

有两种检查两个字符串是否相等的方法–使用“ ==”运算符或使用equals方法。当我们使用“ ==”运算符时,它会检查String的值以及引用,但是在我们的编程中,大多数时候我们只检查String的相等性是否为value。因此,我们应该使用equals方法检查两个String是否相等。

还有另一个函数equalsIgnoreCase可以忽略大小写。

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

什么是字符串池?

顾名思义,字符串池是存储在Java堆内存中的字符串池。我们知道String是Java中的一个特殊类,我们可以使用new运算符以及提供双引号中的值来创建String对象。

String intern()方法有什么作用?

调用intern方法时,如果池已经包含等于equals(Object)方法确定的此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。

此方法始终返回一个与该字符串具有相同内容的字符串,但是保证该字符串来自唯一字符串池。

String在Java中是否是线程安全的?

字符串是不可变的,因此我们无法在程序中更改其值。因此,它是线程安全的,可以在多线程环境中安全使用。

为什么String是Java中流行的HashMap键?

由于String是不可变的,因此其哈希码将在创建时进行缓存,因此无需再次计算。这使其成为Map中密钥的理想候选者,并且其处理速度比其他HashMap密钥对象快。这就是为什么String主要用作Object作为HashMap键的原因。

字符串编程问题

  1. 下面程序的输出是什么?


    package com.journaldev.strings; public class StringTest { public static void main(String[] args) {
    String s1 = new String("pankaj");
    String s2 = new String("PANKAJ");
    System.out.println(s1 = s2);
    } }

    这是一个简单但棘手的程序,它将打印“ PANKAJ”,因为我们将s2字符串分配给s1。不要与==比较运算符混淆。

  2. 下面程序的输出是什么?


    package com.journaldev.strings; public class Test { public void foo(String s) {
    System.out.println("String");
    } public void foo(StringBuffer sb){
    System.out.println("StringBuffer");
    } public static void main(String[] args) {
    new Test().foo(null);
    } }

    上面的程序不会编译错误,因为“方法foo(String)对于Test类型是不明确的”。

  3. 下面的代码片段的输出是什么?


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

    因为我们使用_new_运算符创建String,所以它将打印false,因此它将在堆内存中创建,并且s1,s2都有不同的引用。如果我们使用双引号创建它们,则它们将成为字符串池的一部分,并且将显示true。

  4. 下面的代码片段将输出什么?


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

    因为s2不是String类型,它将打印false。如果查看String类中的equals方法实现,则会发现使用instanceof运算符进行检查以检查传递的对象的类型是否为String?如果不是,则返回false。

  5. 下面程序的输出是什么?


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

    这是一个棘手的问题,输出将为false。我们知道intern()方法将从字符串池中返回String对象引用,但是由于我们没有将其分配回s2,因此s2中没有变化,因此s1和s2都有不同的引用。如果将第3行中的代码更改为,s2 = s2.intern();则输出为true。

  6. 在下面的代码片段中创建了多少个String对象?


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

    答案是:3。

    第一行,字符串池中的“Hello”对象。

    第二行–第1行,堆内存中值为“Hello”的新字符串。

    第三行–第2行,堆内存中值为“Hello”的新字符串。在这里,字符串池中的“Hello”字符串被重用。

我希望这里列出的问题对你的Java面试有所帮助。


“不积跬步,无以至千里”,希望未来的你能:有梦为马 随处可栖!加油,少年!

关注公众号:「Java 知己」,每天更新Java知识哦,期待你的到来!

  • 发送「Group」,与 10 万程序员一起进步。
  • 发送「面试」,领取BATJ面试资料、面试视频攻略。
  • 发送「玩转算法」,领取《玩转算法》系列视频教程。
  • 千万不要发送「1024」...

Java字符串面试问答的更多相关文章

  1. Java多线程面试问答

    今天,我们将讨论Java 多线程面试问答. 线程是Java面试问题中的热门话题之一.在这里,我从面试的角度列出了大多数重要的Java多线程面试问题,但是您应该对Java线程有足够的知识来处理后续问题. ...

  2. 21个Java Collections面试问答

    Java Collections框架是Java编程语言的核心API之一. 这是Java面试问题的重要主题之一.在这里,我列出了一些重要的Java集合面试问题和解答,以帮助您进行面试.这直接来自我14年 ...

  3. Java最新面试问答整理

    Q:JDK和JRE区别? JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆Java工具和Java基 础的类库.通过JDK开发人员将源码文件(java文件)编译成字节码文件(class文 ...

  4. Java字符串面试(二)

    先看下面2个程序 public static void main(String[] args) { String a = "a1"; String b = "a" ...

  5. Java多线程并发面试问答

    Java并发面试问答 什么是原子操作?Java并发API中的原子类是什么? 原子操作在单个任务单元中执行,而不受其他操作的干扰.在多线程环境中,原子操作是必需的,以避免数据不一致. int++不是原子 ...

  6. java异常面试常见题目

    在Java核心知识的面试中,你总能碰到关于 处理Exception和Error的面试题.Exception处理是Java应用开发中一个非常重要的方面,也是编写强健而稳定的Java程序的关键,这自然使它 ...

  7. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  8. [转] JAVA多线程和并发基础面试问答

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  9. JAVA多线程和并发基础面试问答

    转载: JAVA多线程和并发基础面试问答 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对 ...

随机推荐

  1. Mac录制或保存视频后如何放大?

    想要在录制和拍摄视频后在喜欢的场景(例如Mark)中放大视频吗?本文将向您展示如何放大视频并通过裁剪视频和“平移和缩放”效果来制作Ken Burns效果.Filmora9是一款功能强大的视频编辑器,具 ...

  2. Shell—脚本编程进阶

    shell脚本进阶之条件语句 条件选择if语句 https://www.runoob.com/?s=shell&page=1 https://www.cnblogs.com/flylinux/ ...

  3. [C]副作用和序列点

    概述 副作用: <C语言核心技术>对副作用的描述: 表达式内包含了一串的常量.标识符.运算符(指示的运算方式).表达式的目的可以是获得结果值,或者得到运算的副作用(side effect) ...

  4. vue element-ui父列表和子列表同时出现时的bug

    在项目中遇到这样的问题 当第一个父列表下的子列表选择了1,切换到第二个父列表的时候,也会默认选择1 我最开始是计划通过修改子列表的default-active为-1,结果不行 后来发现出现这个问题的原 ...

  5. hibernate-positional-parameter-does-not-exist-1-in-query

    经过bug的排查,问题出在,scsj字段的赋值上; 通过字符串在数据库端生成即可:

  6. Eclipse alt+/语法不提示的解决方法

    最近公司电脑上的Eclipse没有了自动提示功能,也不是全部不提示,大多数情况下按下“alt+/”键还会产生提示,但是当我在java项目中邪main方法和syso的时候,“alt+/”则会失效,今天在 ...

  7. python的安装以及前景

    1.检查软件是否安装:在cmd命令行上输oython 假如环境已经配置好环境变量 则会显示为python的inf: 2.下载并安装python 打开python官网:https://www.pytho ...

  8. Python Weekly 419

    文章,教程或讲座 如何用 Dropbox Security 构建用于日志系统的威胁检测和事件响应的工具 https://blogs.dropbox.com/tech/2019/10/how-dropb ...

  9. Python进程池multiprocessing.Pool的用法

    一.multiprocessing模块 multiprocessing模块提供了一个Process类来代表一个进程对象,multiprocessing模块像线程一样管理进程,这个是multiproce ...

  10. Kafka与RabbitMQ对比

    Infi-chu: http://www.cnblogs.com/Infi-chu/ Kafka是LinkedIn在2012年发布的开源的消息发布订阅系统,他主要用于处理活跃的流式数据.大数据量的数据 ...