美文网首页
C 和 Java 中字符串和字符数组的对比

C 和 Java 中字符串和字符数组的对比

作者: you的日常 | 来源:发表于2020-12-26 12:29 被阅读0次

1. C 和 Java 中字符串和字符数组的对比

实现原理

在 C 语言中,字符串和字符数组本质上都是一块连续的内存空间,需要转义0(\0)结束符;
在 Java 中,字符串和字符数组有本质区别,字符串是 String 对象,而字符数组是数组对象,均不需要结束符。如果是数组对象,对象内存区域中有一个字段表示数组的长度,而 String 相当于字符数组的包装类。

java.lang.String
public final class String {
    private final char value[];
    private int hash;
    ...
}

char 类型的数据长度

在 C 语言中,char 类型占 1 字节,分为有符号与无符号两种;
在 Java 中,char 类型占 2 字节,只有无符号类型。

语言 类型 存储空间(字节) 最小值 最大值
Java char 2 0 65535
C char(相当于signed char) 1 -128 127
C signed char 1 -128 127
C unsigned char 1 0 255

2. String & StringBuilder & StringBuffer 的区别

操作效率

String 是不可变的,每次操作都会创建新的变量,而另外两个是可变的,不需要创建新的变量;另外,StringBuffer 的每个操作方法都使用 synchronized 关键字保证线程安全,增加了更多加锁 & 释放锁的时间。因此,操作效率排序为:StringBuilder > StringBuffer > String

线程安全

String 不可变,所以 String 和 StringBuffer 都是线程安全的,而 StringBuilder 是非线程安全的。

类型 操作效率 线程安全
String 安全(final)
StringBuffer 安全(synchronized)
StringBuilder 非安全

3. 为什么 String 设计为不可变类?

如何使得 String 不可变?

《Effective Java》中可变性最小化原则,阐述了不可变类的规则:
1、不对外提供修改对象状态的任何方法;
2、保证类不会被扩展(声明为 final 类或 private 构造器);
3、声明所有域为 final;
4、声明所有域为 private;
5、确保对于任何可变性组件的互斥访问。

为什么设计为不可变类?

1、相比可变类的不确定性,不可变类稳定可靠,适合作为散列表的键;
2、不可变对象本质是线程安全的,不需要同步;
3、风险:创建不可变类的对象代价可能很高,为提高性能使用可变配套类,StringBuilder 和 StringBuffer 可以理解为 String 的配置类。

提示: 反射可以破坏 String 的不可变性。

4. String + 的实现原理

相关文章

  • C 和 Java 中字符串和字符数组的对比

    1. C 和 Java 中字符串和字符数组的对比 实现原理 在 C 语言中,字符串和字符数组本质上都是一块连续的内...

  • Swift--原生字符串

    字符 创建字符串 字符串的拼接 字符串插入、删除和替换 字符串比较 字符 在Java、C、C++和Objectiv...

  • C语言- 字符、字符数组

    字符数组和字符串 C语言中没有字符串这种数据类型,C语言中通过char型数组来替代字符串的功能。C语言中的字符串一...

  • 流程控制与数组(数组)

    数组 定义数组 数组的显示初始化 输出字符串和字符串函数 ANSI C提供了如下常用的标准函数来处理C字符串

  • NDK启航篇——C语言基础(字符串)

    我们写程序肯定会用到字符串,那么C中的字符串怎么写呢? C中的字符串写法 字符串数组存储字符串字符串数组最后要写结...

  • JNI Java与C的相互调用与基本操作

    Java和Jni的类型对照表 引用类型对照表 一.Java调用C函数 1.字符串拼接 2.比较字符串 3. 数组求...

  • 使用C语言使字符串倒序

    C语言中的字符串不行java的一样是一个对象,C中的字符串都是用字符串数组所组成,如果需要手动都字符串倒序的话,需...

  • C语言字符串的基本使用

    字符串基本使用 可以使用数组来保存字符串 字符串变量和普通的字符数组是有一定区别的 C语言规定:字符串必须以\0 ...

  • 字符的最短距离

    给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组...

  • length是属性还是方法?

    在java中,数组有length属性,字符串有length方法; 在js中,数组与字符串都是length属性。

网友评论

      本文标题:C 和 Java 中字符串和字符数组的对比

      本文链接:https://www.haomeiwen.com/subject/doxinktx.html