如何在Java字符(16位)中存储UTF-8字符(8位)时避免内存浪费.二合一?

我恐怕对一个相当过度饱和的话题的细节有疑问,我搜索了很多,但是找不到明确的答案 – 这个特别明显的 – 重要的,问题:

使用UTF-8将byte []转换为String时,每个字节(8位)变为由UTF-8编码的8位字符,但每个UTF-8字符在java中保存为16位字符.那是对的吗?
如果是,这意味着,每个愚蠢的java字符只使用前8位,并消耗内存的两倍?这也是正确的吗?我想知道这种浪费行为是如何被接受的..

有没有一些技巧有一个8位的伪字符串?这实际上会减少内存消耗吗?
或者,有没有办法存储>两个<一个java 16bit字符中的8位字符可以避免这种内存浪费吗? 感谢任何令人困惑的答案…… 编辑:
嗨,谢谢大家的回答.我知道UTF-8的可变长度属性.但是,由于我的源是8位的字节,我理解(显然是错误的)它只需要8位UTF-8字. UTF-8转换实际上是否会保存您在CLI上看到的“cat somebinary”时看到的奇怪符号?我认为UTF-8只是用于将每个可能的8位字的字节映射到UTF-8的一个特定的8位字.错误?我想过使用Base64,但它很糟糕,因为它只使用了7位..

重新制定的问题:是否有更智能的方法将字节转换为字符串?
可能最喜欢的是将byte []转换为char [],但之后我仍然有16位字.

其他用例信息:

我正在调整Jedis(Nosql Redis的java客户端)作为hypergraphDB的“原始存储层”.因此,jedis是另一个“数据库”的数据库.
我的问题是我必须一直用byte []数据提供jedis,但在内部,> Redis< (实际服务器)只处理“二进制安全”字符串.由于Redis是用C语言编写的,因此char是8位长,AFAIK不是ASCIII,是7位.然而,在Jedis中,java世界,每个字符在内部都是16位长.我还不了解这段代码,但我想jedis然后将这个java 16位字符串转换为符合Redis的8位字符串(([here] [3]).它说它扩展了FilterOutputStream.我希望绕过它字节[]< - >字符串完全转换并使用Filteroutputstream …?)

现在我想知道:如果我不得不一直互换byte []和String,数据量从非常小到可能非常大,那么每个8位字符在java中传递为16位并不会浪费大量内存?

解决方法

Isn’t there some trick to have a pseudo String that is 8 bit?

是的,请确保您拥有最新版本的Java.

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...