Jared's blog Jared's blog
首页
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • Java
  • 数据库SQL
  • 设计模式
  • 集成开发环境
  • Linux系统
  • 代码管理
  • 项目管理
  • 后端

    • 中间件
    • Spring家族
    • 服务器软件
    • 数据库
    • 搜索引擎
    • 分布式&微服务
    • 容器化
  • 前端

    • 基础
    • 模板框架
    • 组件化框架
  • 运维知识
  • 部署工具
架构与模型
  • 在线教育
  • 电商
  • 疑惑日志
  • 随笔
  • 友链
  • 书籍
  • 娱乐
  • Github (opens new window)
  • Gitee (opens new window)
  • CSDN (opens new window)

Jared H

💻🤣😜
首页
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • Java
  • 数据库SQL
  • 设计模式
  • 集成开发环境
  • Linux系统
  • 代码管理
  • 项目管理
  • 后端

    • 中间件
    • Spring家族
    • 服务器软件
    • 数据库
    • 搜索引擎
    • 分布式&微服务
    • 容器化
  • 前端

    • 基础
    • 模板框架
    • 组件化框架
  • 运维知识
  • 部署工具
架构与模型
  • 在线教育
  • 电商
  • 疑惑日志
  • 随笔
  • 友链
  • 书籍
  • 娱乐
  • Github (opens new window)
  • Gitee (opens new window)
  • CSDN (opens new window)
  • 数据结构与算法

  • 计算机网络

  • 操作系统

  • Java

    • 语言基础

      • 面向对象
      • 关键字
      • 运算符
      • 抽象类
      • 接口
      • 类型
      • String
        • String、String StringBuffer 和 StringBuilder 的区别是什么?
        • equals与==的区别
          • ==
          • equals
      • 异常
      • 反射
      • 注解
      • 内部类
      • 泛型
      • 序列化
      • 复制
    • 集合

    • 并发、多线程

    • JVM

    • 工具

    • IO

    • 新特性

    • http通信流程图
  • 数据库-SQL

  • 设计模式

String

# 7. String

  1. 做成员变量(字段/属性/类变量)时,如果只写String str;那么默认赋值为null。

    做局部变量(方法里的变量)时,如果只写String str;是不会默认赋值null的,这里仅声明了一个str变量, 在栈内存中有定义,但没有任何值,null其实也是一种值。此时任何调用str的操作,编译时就均会报错,是error, 不是异常。null的话,你屏幕输出(toString方法)的结果为字符串null,但其它调用str的操作,编译可通过, 运行时会空指针异常,此时是异常。

  2. String str = ""; 这个跟"abc"、"中国",本质上这都一样,只是空串,长度为0罢了。 ""是空字符串,但是也是字符串,没有什么东西。而null是空的意思,什么都没有,没有地址。

 if (str == null || str == "") {}//字符串判断空的写法
1

# String、String StringBuffer 和 StringBuilder 的区别是什么?

String是只读字符串,它并不是基本数据类型,而是一个对象。从底层源码来看是一个final类型的字符数组,所引用的字符串不能被改变,一经定义,无法再增删改。每次对String的操作都会生成新的String对象。

private final char value[];
1

每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法 拼接+后面的字符。

StringBuffer和StringBuilder他们两都继承了AbstractStringBuilder抽象类,从AbstractStringBuilder抽象类中我们可以看到

/** 
 * The value is used for character storage. 
 */
char[] value;
1
2
3
4

他们的底层都是可变的字符数组,所以在进行频繁的字符串操作时,建议使用StringBuffer和StringBuilder来进行操作。 另外 StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

# equals与==的区别

# ==

== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。

  1. 比较的是操作符两端的操作数是否是同一个对象。

  2. 两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。

  3. 比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如:

    int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。

# equals

equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object 类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的 equals 方法返回的却是 == 的判断。

总结:

所有比较是否相等时,都是用equals 并且在对常量相比较时,把常量写在前面,因为 object 可能为 null 。推荐安装阿里插件来排查老代码使用“==”,替换成equals

上次更新: 2022/04/01, 15:14:40
类型
异常

← 类型 异常→

Theme by Vdoing Copyright © 2020-2022 Jared H
粤ICP备20046800号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×