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等方法进行了大小写转换后再进行比较。

【Java面试题】-- Java String的更多相关文章

  1. java面试题之----String的intern

    When---什么时候需要了解String的intern方法: 面试的时候(蜜汁尴尬)!虽然不想承认,不过面试的时候经常碰到这种高逼格的问题来考察我们是否真正理解了String的不可变性.String ...

  2. [ Java面试题 ]Java 开发岗面试知识点解析

    如背景中介绍,作者在一年之内参加过多场面试,应聘岗位均为 Java 开发方向. 在不断的面试中,分类总结了 Java 开发岗位面试中的一些知识点. 主要包括以下几个部分: Java 基础知识点 Jav ...

  3. JAVA面试题:String 堆内存和栈内存

    java把内存划分为两种:一种是栈(stack)内存,一种是堆(heap)内存 在函数中定义的一些基本类型的变量和对象的引用变量都在栈内存中分配,当在一段代码块定义一个变量时,java就在栈中为这个变 ...

  4. Java面试题:String、StringBuilder、StringBuffer区别

    String:不可变字符序列. StringBuilder:可变字符序列.效率高.线程不安全,适合单线程. StringBuffer:可变字符序列.效率低.线程安全,适合多线程. 效率从高到低:Str ...

  5. JAVA面试题——JAVA基础篇

    1.JAVA多态的实现方式:继承.重载.覆盖 2.JAVA有8种基本数据类型:byte.short.int.long.float.double.boolean.char 3.final.finally ...

  6. Java面试题-Java中的锁

    1. 如何实现乐观锁(CAS)?如何避免ABA问题? 答:1)读取内存值的方式实现了乐观锁(比如:SVN系统),方法:第一,比较内存值和期望值:第二,替换内存值为要替换值.        2)带参数版 ...

  7. JAVA面试题——JAVA编程题1(2015.07.22——湛耀)

    实现代码很简单:   package com.xiaozan.shopping;   import java.util.Arrays;   public class ShoppingCart {    ...

  8. Java 面试题 —— java 源码

    1. 静态工厂方法 静态工厂方法不必在每次调用它们的时候都创建一个新的对象: Boolean.valueOf(boolean): public final class Boolean { public ...

  9. Java面试题-Java容器

    一.Java容器分类 Java容器划分为两个概念Collection.Map Collection: 一个独立元素的序列,这些元素都服从一条或多条规则.List必须按照插入的顺序保存元素,不关心是否重 ...

  10. JAVA面试题——JAVA编程题1(2015.07.22)

    实现代码很简单:   package com.xiaozan.shopping;   import java.util.Arrays;   public class ShoppingCart {    ...

随机推荐

  1. 题解 [HAOI2016]字符合并

    题目传送门 Description 有一个长度为 \(n\) 的 \(01\) 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数. 得到的新字符和分数由这 k 个字符确定.你需要 ...

  2. L1-017 到底有多二 (15 分) java解题

    1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String args[]){ 5 doub ...

  3. pycharm安装pika提示CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com>

    1. 问题描述: pycharm安装第三方库时提示CondaHTTPError: HTTP 000 CONNECTION FAILED. 2. 错误原因:默认镜像源访问速度过慢,会导致超时从而导致更新 ...

  4. 新產品SWOT分析實例

    推出新产品需要解决四个行销支柱: 价格 产品 促销 销售地点 要分析这些方面,请检查您的优势.劣势.机会和威胁,以帮助您在运行第一个广告或举行第一次促销之前将风险降至最低,并最大限度地利用资源.SWO ...

  5. 吴恩达深度学习课后习题第5课第1周第3小节: Jazz Improvisation with LSTM

    目录 Improvise a Jazz Solo with an LSTM Network Packages 1 - Problem Statement 1.1 - Dataset What are ...

  6. UltraSoft - Beta - Scrum Meeting 1

    Date: May 17th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 维护Beta阶段文档 Liuzh 前端 增加删除操作按钮 Kkkk 前端 查询增加 ...

  7. 【二食堂】Alpha - Scrum Meeting 1

    Scrum Meeting 1 例会时间:4.10 8:00 - 8:30 进度情况 组员 上周进度 明日任务 李健 1. 在Anaconda3中搭建了python和django的环境issue1. ...

  8. OO课第三单元总结

    一.梳理JML语言的理论基础 (1)理论基础 JMl的出现很大程度上一为了行为接口的规范化,用这种语言来指定特定模块的特定功能.JML的核心部分分为三个部分:前置条件(requires).后置条件(e ...

  9. 启动Dubbo项目注册Zookeeper时提示zookeeper not connected异常原理解析

    文/朱季谦 遇到一个很诡异的问题,我在启动多个配置相同zookeeper的Dubbo项目时,其他项目都是正常启动,唯独有一个项目在启动过程中,Dubbo注册zookeeper协议时,竟然出现了这样的异 ...

  10. 热身训练4 Eighty seven

    Eighty seven 简要题意: n个卡片,其中第i个卡片的数值为$a[i]$.一共q次询问,每次询问将删去其中3个卡片(可能删除若干相同的卡片)后,问能否选出10个卡片,数值之和等于87. n≤ ...