Java 基础(四):从面试题看String

字符串介绍

String类是java.lang包中的一个类,是我们日常中使用的非常多的一个类,它不是基础数据类型,底层实现是字符数组来实现的:

/** The value is used for character storage. */
    private final char value[];

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

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence

下面我们通过几道面试题来学习String

如何创建一个字符串

一般来说有三种:

  • 通过new关键字通过构造方法去创建
  • 通过双引号“”
  • 通过字符串连接符+和其余字符串进行拼接创建

说说这几种的区别

  1. 当通过new关键字调用无参构造时,仅仅在JVM的堆内存中创建了一个对象
  2. 通过""创建对象的时候,如果字符串常量池存在该字符串,直接返回该字符串对象在字符串常量池的地址,否则创建一个新的字符串对象并存储在字符串常量池。

String s = new String("a") 创建了几个对象

当通过new关键字传入双引号字符串参数时,会先去把该双引号的字符串放入字符串常量池,然后遇到new以后会在堆中再次创建一个字符串对象,这里是创建了两个对象。

+ 的实现原理

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

借这道面试题来聊一下+的原理,这道题的答案是”nullabc“,也许会有些奇怪,但是当你了解了+的原理后也许就不会感到奇怪了,我们使用javap命令去看一下编译器那里把+编译成了什么?

我们在图中被红色框柱的部分可以看出,+的执行的过程其实就是先把 String转换成了StringBuilder后调用append方法完成拼接后再调用toString方法完成字符串的拼接。所以上面的代码也可以转换为

StringBuilder s1 = new StringBuilder(String.valueOf(null));
StringBuilder s2 = new StringBuilder("abc");
s1.append(s2).toString();

关于StringBuilder和StringBuffer

StringBufferStringBuilder 二者都继承了 AbstractStringBuilder ,底层都是利用可修改的char数组(JDK 9 以后是 byte数组)。两者的区别是StringBuilder是线程不安全的,而StringBuffer是线程安全的。性能上来说,StringBuilder要高于StringBuffer

在单线程情况下,如有大量的字符串操作情况,不能使用String来拼接而是使用,避免产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)。这时就需要用到我们的StringBuilder

而在多线程情况下,应当使用StringBuffer来保证线程的安全~

判空

在日常的开发中,我们经常会遇到判断字符串是否为空的需求,这里安利几个工具类中的写法:

// 来自apache下的lang3包中的StringUtils
import org.apache.commons.lang3.StringUtils
....

  //这里是判断是否为null或为空
  String s;
  StringUtils.isNotEmpty(s);

    //这里是用于判断是否为null或为空,或空格,Tab这样的占用符
    StringUtils.isNotBlank(s);

是否相等

关于两个字符串是否相等,我用的最多的是java.util包下的Objects类中的方法 ,实现方法如下:

public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
}

用法也很简单:

Objects.equals(a,b);

公众号

原文地址:https://www.cnblogs.com/viyoung/p/12515175.html

时间: 2024-11-10 07:36:59

Java 基础(四):从面试题看String的相关文章

Java基础四

Java基础四 一.Switch语句 二.if和switch区别 推荐使用if 三.函数 Java中的函数和方法是同一个词 四.数组 4.1.数组常见错误 五.内存机制 六.转换成十六进制 移位 &操作 6.2 查表法求十六进制 查表法很多时候都非常好用,这样就非常好了,真的非常好用 算的时候直接移四位,我喜欢,我觉得以后可以多做移位运算,真的是简单方便 6.3 查表法求星期几

关于Java基础的一些笔试题总结

针对最近腾讯.京东.网易等公司的笔试,遇到一些有关Java基础的问题,在此通过一些例子总结一下,希望能通过这几道题发散,举一反三,借此打牢基础!自己总结,望提出宝贵意见! 一.最近笔试,经常会遇到一些"下面这段代码输出的结果是什么?是否编译出错?"类似的问题,代码如下: public class Test { public int testInt; public float testFloat; public String testString; public boolean test

有关Java基础的一些笔试题总结

针对最近腾讯.京东.网易等公司的笔试,遇到一些有关Java基础的问题,在此总结,希望能通过这几道经典问题题发散,举一反三,借此打牢基础!自己总结,望提出宝贵意见! 一.关于null的一道小题 先开开胃,一道很有意思的笔试题,题目如下: 下面这段代码能正确执行吗?如果能,输出什么? public class NULL { public static void haha(){ System.out.println("haha"); } public static void main(Str

java基础学习--最近几天看韩顺平资料学习心得

/** * 闲扯 */ 入行已经两年了,先是做delphi,然后转战C++,现在做java了. 感觉自己画了一条曲线,慢慢的走上正途了. Delphi做的人越来越少了,C++想要进阶较难.加上工作中的机遇,我选择了java. 由于有一定编程基础,java的入门并没有想象中那么难,初期工具的学习花了一些心血,后来就是按部就班的进阶了. 看了几天韩老师的spring视频,感觉有点吃力,越发觉得自己java基础的薄弱.缺少很多基础知识的储备,因此将韩老师的全套视频下载了下来,希望自己能跟随韩老师的脚步

《Just For Java——基础扎实》——第二节:String

一.String简介 包:java.lang.String,java.lang提供利用 Java 编程语言进行程序设计的基础类. 实现:public final class String  implements java.io.Serializable, Comparable<String>, CharSequence{ } 其中:java.io.Serializable  是序列化有关的接口:   java.lang.CharSequence  是cahr值的一个可读序列: java.lan

java 基础 四种权限修饰符

/** * Java有四种权限修饰符: * public > protected > (default) > private * 同一个类 YES YES YES YES * 同一个包 YES YES YES NO * 不同包子类 YES YES NO NO * 不同包非子类 YES NO NO NO * * 注意:(default)并不是关键字default,而是什么都不写. */ 原文地址:https://www.cnblogs.com/mantishell/p/11801662.h

java基础 题和知识点总结, 关于String s是否默认初始化为null......,new一个对象和类静态域,是不是在内存中不是一个地方

一道笔试题 22. 下面代码的运行结果为:() import java.io.*; import java.util.*; public class foo{ public static void main (String[] args){ String s; System.out.println("s=" + s); } } A 代码得到编译,并输出“s=” B 代码得到编译,并输出“s=null” C 由于String s没有初始化,代码不能编译通过 D 代码得到编译,但捕获到 N

Java基础篇(02):特殊的String类,和相关扩展API

本文源码:GitHub·点这里 || GitEE·点这里 一.String类简介 1.基础简介 字符串是一个特殊的数据类型,属于引用类型.String类在Java中使用关键字final修饰,所以这个类是不可以继承扩展和修改它的方法.String类用处极广泛,在对String对象进行初始化时,和基本类型的包装器类型一样,可以不使用new关键字构造对象.(是真的妖娆...) 2.类构造和方法 String类结构 特点:final关键字修饰,实现Serializable序列化接口,Comparable

Java基础-四要素之一《继承》

继承的概念: 继承在本职上是特殊——一般的关系,即常说的is-a关系.子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法. 继承是所有OOP语言不可缺少的部分,在java中使用extends关键字来表示继承关系.当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类Object进行继承.比如下面这段代码: class Person { public Person() { } } class Man extends Person { public Ma