我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何在Java中使用String保存字符串

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何在Java中使用String保存字符串

本篇文章给大家分享的是有关如何在Java中使用String保存字符串,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

String 真的是 Immutable 的吗

Java 中的 Unicode 字符串会按照 Latin1(所有的字符都小于 0xFF 时)或者 UTF16 的编码格式保存在 String 中,保存为 byte 数组:

private final byte[] value;

通常所说的 Immutable 都是指 final bytes 在 String 初始化后就不会修改,所有字符串的相关操作都是不会修改原数组而是创建新的副本。

但是数组元素理论上是可以修改的,比如下面通过反射的方式,将字符串常量 abc 修改为 Abc:

public static void main(String[] args) {     setFirstValueToA("abc");        String replaced = new String("abc");        System.out.println(replaced); // Abc    }        private static void setFirstValueToA(String str) {        Class<String> stringClass = String.class;        try {            Field value = stringClass.getDeclaredField("value");            value.setAccessible(true);            byte[] bytes = (byte[]) value.get(str);            bytes[0] = 0x41; // A         } catch (NoSuchFieldException | IllegalAccessException e) {            e.printStackTrace();        }    }

字符串数组如何保存为字节数组

通过如下代码测试几个字符串数组:

public static void main(String[] args) {        printString("abc");        printString("中文");        printString("abc中文");        printString("abc");    }    private static void printString(String str) {        System.out.println("======>" + str);        // return the UTF-16 char[] size        System.out.println("length: " + str.length());        // Use default Encoding (UTF-8)        System.out.println("getBytes: " + str.getBytes().length);        // Convert UTF-16 char[] to char        System.out.println("codePointCount: " + str.codePointCount(0, str.length()));        // Get the UTF-16 char[]        System.out.println("toCharArray: " + str.toCharArray().length);        // The UTF-16 char[] to bytes        System.out.println("internal value: " + getStringInternalValueLength(str));    }

结果如下:

如何在Java中使用String保存字符串

internal value

首先解释下 String 的 value 字段计算方式:

  • 所有字符都小于 0xFF 时,采用 Latin1 Character Encoding 来保存 Unicode code point,也就是每个字符都用一个 byte 来保存。比如“ABC”

  • 上述条件不满足时,采用 UTF-16 Character Encoding 来保存,也就是每个字符都用 2 个或者 4 个 byte 来保存。

Unicode 是 Coded Character Set,将几乎所有的人类文字映射到 code point 符号,通常格式为 U+xxxx,xxxx 为 16 进制整数,表达范围为 U+0000~U+10FFFF。code point 符号是文字的规范化标记,但是实际保存时肯定还是要保存为字节数组的。这些不同的保存方式就是 Character Encoding,比如 UTF-8,还有 Java String 内部采用的 UTF-16。

UTF-16 是一种将 Unicode code point 表达成字符数组的编码方式,对于 U+0000~U+FFFF,直接按照 2 个字节保存(细分的话还有大端字节序和小端字节序的区别);对于 U+10000~U+10FFFF,会先转化为一对 U+D800~U+DFFF 范围内的 code point(surrogate pair),再将这两个 code point 按照前面的规则保存。之所以选择这个范围,是因为这个 Unicode 区间还没有被分配有效的字符,因此可以和前面的规则区分。

“中文”这两个汉字的 Unicode code point 非别为 U+4E2d、U+6587,大于 0xFF,所以保存 byte 长度为 4;"abc中文" 中存在不满足条件的字符,所以全部用 UTF-16 保存,它们都是 2 个 byte 的,所以长度为 10。

“☺” 的 Unicode code point 为 U+1F60A,根据 UTF-16 规范,U+10000~U+10FFFF 需要转化为 surrogate pair 之后再保存成 byte, 转换后为 U+D83D、U+DE0A,因此 "abc" 的字节长度为 10。

toCharArray()

Java 中 char 的大小为 2 个字节,刚好可以表示一个 U+0000~U+FFFF 的 Unicode 符号。

Latin1 编码时,char 数组为 byte 数组的填充,高字节为 0;UTF-16 编码时,相当于转化过 surrogate pair 后的 Unicode 编码数组,其中 0xD800~0xDFFF 范围内的为 surrogate 字符。

“abc” 时为 Latin1 编码,所以 char 数组大小等于 bytes 数组;“abc中文” 时为 UTF-16 编码,所以 char 数组大小等于 bytes 数组的一半。

codePointCount()

toCharArray 方法将转化后的 surrogate pair 也算在内,因此实际长度可能大于字符长度。而 codePointCount 就能去除 surrogate pair 的影响,返回初始的字符长度,它会将连续两个 surrogate pair 只计数一次。

String.length

该方法就是 toCharArray 数组的长度,受到 surrogate pair 的影响,可能大于字符长度。

str.getBytes().length

String 内部是通过 UTF-16 编码保存的字节数组,当通过 getBytes 方法返回时,是需要指定 Encoding 的,默认采用 UTF-8,因此会将 UTF-16 的字节数组转化为 UTF-8 的字节数组,每个 Unicode 符号在 UTF-8 编码后长度为 1~4 字节。

System.out.println("abc".getBytes(UTF_8).length); // 3        System.out.println("中".getBytes(UTF_8).length); // 3        System.out.println("文".getBytes(UTF_8).length); // 3        System.out.println("".getBytes(UTF_8).length); // 4

Java可以用来干什么

Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开发;5. 企业级应用开发;6. Java大数据开发;7.游戏开发等。

以上就是如何在Java中使用String保存字符串,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何在Java中使用String保存字符串

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在Java中使用String保存字符串

本篇文章给大家分享的是有关如何在Java中使用String保存字符串,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。String 真的是 Immutable 的吗Java 中的
2023-06-15

在 Java 中如何使用 String 移除字符串?(java中怎么用string移除字符串)

在Java编程中,字符串是一种常见的数据类型,经常需要对字符串进行各种操作,其中移除字符串中的特定部分是一个常见的需求。在Java中,可以使用多种方法来移除字符串中的内容。一、使用replace()方法r
在 Java 中如何使用 String 移除字符串?(java中怎么用string移除字符串)
JavaString2024-12-22

如何在 Java 中输出 string 字符串?(java怎么输出string字符串)

在Java编程中,输出字符串是一项基本操作。以下是详细的步骤来实现Java中输出string字符串。一、了解字符串的基本概念在Java中,字符串是由字符组成的序列。String是Java中用于表示字符串的数
如何在 Java 中输出 string 字符串?(java怎么输出string字符串)
JavaString2024-12-13

如何在Java中分割String字符串

这篇文章主要介绍“如何在Java中分割String字符串”,在日常操作中,相信很多人在如何在Java中分割String字符串问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何在Java中分割String字符串
2023-06-15

如何在 Java 中删除指定字符串?(java string删除指定字符串)

在Java编程中,经常会遇到需要删除字符串中指定部分的情况。本文将详细介绍在Java中如何删除指定字符串的方法。一、使用replaceAll方法Java的String类提供了replaceAll方法,它可以
如何在 Java 中删除指定字符串?(java string删除指定字符串)
JavaString2024-12-17

如何在 Java 中优雅地分割 String 字符串

相信很多同学都知道,String 类中的 split 方法可以进行字符串分割,然而日常使用起来却仅限于 str.split( \"-\"),其中 \"-\"为分隔符。其实 split 方法的功能非常强大,可以更优雅地使用它分割字符串。

如何利用 Java 的 String 类来对字符串进行处理?(如何使用Java的String类处理字符串)

在Java编程中,字符串是一种非常常见且重要的数据类型。而Java的String类提供了丰富的方法和功能,用于处理各种字符串操作。本文将详细介绍如何使用Java的String类来处理字符串。一、String类的基本概念
如何利用 Java 的 String 类来对字符串进行处理?(如何使用Java的String类处理字符串)
Java2024-12-15

如何在 Java 中提取字符串中的字符?(java如何提取字符串中的字符)

在Java编程中,提取字符串中的字符是一项常见且重要的操作。以下是详细的步骤和示例代码,帮助你轻松掌握在Java中提取字符串中字符的方法。一、使用charAt()方法Java中的String类提供了charA
如何在 Java 中提取字符串中的字符?(java如何提取字符串中的字符)
Java2024-12-22

Java 中如何对 String 字符串进行排序?(java怎么对string字符串排序)

在Java编程中,对字符串进行排序是一个常见的操作。字符串排序可以帮助我们按照字母顺序、特定的规则或自定义的逻辑对字符串进行排列。以下是在Java中对String字符串进行排序的两种常见方法:一、使用Arrays.sort()方法
Java 中如何对 String 字符串进行排序?(java怎么对string字符串排序)
JavaString2024-12-14

如何利用 Java String 类进行字符串分割?(Java String类如何实现字符串分割)

在Java编程中,String类是处理字符串的重要工具,其中字符串分割是一个常见的操作。本文将详细介绍JavaString类如何实现字符串分割。一、字符串分割的概念字符串分割是将一个字符串按照指定的分隔符拆分成多个子
如何利用 Java String 类进行字符串分割?(Java String类如何实现字符串分割)
Java2024-12-19

如何在Java中创建一个String字符串对象

这篇文章将为大家详细讲解有关如何在Java中创建一个String字符串对象,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java中字符串对象创建有两种形式,一种为字面量形式,如String
2023-05-31

Java 中如何使用 return 语句返回字符串?(java如何return字符串)

在Java编程中,return语句是用于从方法中返回一个值的关键语句。当一个方法执行到return语句时,它会立即终止方法的执行,并将指定的值返回给调用该方法的地方。在本文中,我们将重点关注如何使用return语句返回字符串。一、基本概念
Java 中如何使用 return 语句返回字符串?(java如何return字符串)
Java2024-12-21

Java中如何实现String字符串分割

今天小编给大家分享的是Java中如何实现String字符串分割,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。Java中实现String字符串分割的3种方法方法1:split(stri
2023-08-03

在Python中如何存储字符串

这篇文章主要介绍“在Python中如何存储字符串”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“在Python中如何存储字符串”文章能帮助大家解决问题。unicode 的三种编码从Python3开始,
2023-06-30

如何在 Java 中去掉字符串中的某些字符?(java怎么去掉string中的某些字符)

在Java编程中,经常会遇到需要去掉字符串中某些特定字符的情况。这是一个常见的字符串处理需求,下面我们将详细介绍在Java中如何实现这个功能。一、使用循环遍历字符串并逐个判断字符在Java中,我们可以通过循环遍历字符
如何在 Java 中去掉字符串中的某些字符?(java怎么去掉string中的某些字符)
JavaString2024-12-19

如何在 Java 中高效地使用 substring()函数来截取字符串?(如何在Java中使用substring()函数截取字符串)

在Java编程中,字符串是一种常见的数据类型,而substring()函数是Java中用于截取字符串的重要工具。它允许我们从一个字符串中提取出指定位置的子字符串,为字符串的处理提供了很大的便利。下面我们将详细介绍如何在Java中使用substring()函数截取字符串。
如何在 Java 中高效地使用 substring()函数来截取字符串?(如何在Java中使用substring()函数截取字符串)
Java2024-12-19

如何使用 Java 字符串的 replace 方法?(java字符串replace怎么使用)

在Java编程中,字符串是一种常见的数据类型,而字符串的replace方法是处理字符串的常用工具之一。它允许我们在字符串中查找指定的子字符串,并将其替换为新的字符串。本文将详细介绍Java字符串的replace方法的使用方法,包括基本用法、参数详解以及一些常见的应用场景。
如何使用 Java 字符串的 replace 方法?(java字符串replace怎么使用)
Javareplace2024-12-20

java中如何使用substring截取字符串

在Java中,可以使用substring方法来截取字符串。substring方法有两种重载形式:1. substring(int beginIndex):从指定的索引位置开始截取字符串,截取到字符串的末尾。2. substring(int
2023-08-24

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录