byte转string中文乱码(c#字符串转byte数组提示输入字符串格式错

健康新闻 2023-05-01 10:07健康生活www.xingbingw.cn

  byte转string中文乱码(c#字符串转byte数组提示输入字符串格式错误),新营销网红网本栏目通过数据整理汇集了byte转string中文乱码(c#字符串转byte数组提示输入字符串格式错误)相关信息,下面一起看看。

  一、字符串的基础1、创建字符串的方式

   String test=" abc字符串测试=新字符串(“ABC”);2.String类是不可变的。

   String类用final关键字修饰,表示String类不能继承,默认情况下其成员是final;字符串一旦创建,就不能修改。实例字符串的值由字符数组存储。不可变类的好处。

  作为HashMap的关键因为字符串是不可变的,所以创建字符串的时候hash就已经计算好了,所以使用字符串的hash代码效率更高,不用每次都重新计算。线程安全因为字符串是不可变的,所以无论多线程访问锁定如何,它都必须是线程安全的。串池的需要。3.字符串类是常用的

   Int length():返回字符串的长度。

   Int of (int ch,int fromIndex)/int index of(string str,int from index):从from索引中查找ch字符/str字符串第一次出现的位置。

   Int lastindexof (int ch,int from index)/int lastindexof(string str,int from index):查找ch字符/str字符串在该字符串中出现的位置。

   String substring (int beginIndex,int endIndex):截取从开始索引(含)到结束索引(不含)的字符串。

   String():删除字符串中的前导和尾随空格。

   Boolean equals(Object anObject):覆盖对象中的等号,如果字符串相同,则返回true。

   Tollowercase():将字符串转换为lowercase。

   String toUpperCase():将字符串转换为大写。

   Char charAt(int index):获取字符串中指定位置的字符。

   String [] split (string regex,int limit):将一个字符串拆分成子字符串,并返回一个字符串数组。

   String replace (char oldChar,char newChar):在字符串序列中用新字符替换旧字符。

   Byte[] getBytes():将这个字符串转换成一个字节数组。

  二、字符串高级1、字符串常量池

  字符串的分配和其他对象的分配一样,需要大量的时间和空间,字符串被大量使用。为了提高JVM的性能,减少内存开销,在实例化字符串时做了一些优化使用字符串常量池。每当创建一个字符串常量时,JVM将检查字符串常量池。如果字符串已经存在于常量池中,它将直接返回常量池中的实例引用。如果常量池中不存在该字符串,它将被实例化并放入常量池中。由于字符串的不变性,常量池中不能有两个相同的字符串。

  字符串池在jdk1.7之前就存在了,从1.7开始就放入堆中了。

   2.String test="abc "和new String("abc ")之间的区别

   Test="ABC ":,检查这个字符串是否存在于字符串常量池中。如果存在,会直接返回字符串常量池中该字符串的引用。如果它不存在,它将把这个字符串添加到常量池中,然后返回这个引用。

   New String("abc "):直接在堆中创建一个字符串,并返回新创建的字符串的引用。每一个创作都是一个新的对象。

  例子如下

   3、实习生()

  使用双引号创建的字符串对象将直接存储在字符串常量池中。new创建的String对象可以使用string提供的intern。实习生是本地人。intern会从字符串常量池中查询当前字符串是否存在,如果存在则直接返回当前字符串;如果不存在,当前字符串将被放入常量池,然后返回。

  例子如下

   4.字符串拼接

  当使用" "拼接字符串时,JVM将隐式创建一个StringBuilder对象,每个拼接将隐式创建一个StringBuilder对象。大量字符串拼接时,堆内存中会创建大量StringBuilders,肯定会造成效率的损失。所以对于大量的字符串拼接,一般建议使用StringBuilder(线程不安全)或者StringBuffer(线程安全)。

  看看两者的效率,如下所示

  运行

  结果我们可以看到,用“”拼接100,000个字符串需要13,684毫秒,而用StringBuilder拼接字符串需要1毫秒。效率显而易见。

  当“”的两端都是编译时确定的字符串常量时,编译器会进行相应的优化,直接拼接两个字符串常量。

  请看下面的例子

  编译后的类文件如下

  如果这两个可见的字符串总是亮的,它们将被合并,并直接在编译器中优化。

   5

  、StringBuilder和StringBuffer拼接字符串

  StringBuilder为了解决使用”+“大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add ,可以将字符串添加到已有序列的末尾或指定位置,实际上底层都是利用可修改的char数组(JDK 9 以后是 byte数组)来存储的,当前容量不足时触发扩容机制。

  StringBuffer和StringBuilder的机制一样,唯一不同点是StringBuffer内部使用synchronized关键字来保证线程安全,保证线程安全不可避免的产生了一些额外的开销,如果不要求线程安全的情况下还是建议优先使用StringBuilder。

  StringBuilder和StringBuffer都是继承AbstractStringBuilder抽象类,里面实现了字符串拼接的具体逻辑,我们来看一下

  数据都是保存在char[]里面,当容量不足时进行数组的扩容

  从源码可以看到,当需要容量不足时触发扩容机制,扩容为原来的2倍+2的容量,最大数组扩容容量为MAX_ARRAY_SIZE = Integer.MAX_VALUE – 8,Integer.MAX_VALUE为2的31次方-1。扩容完后把老的数组里面的数据拷贝到新的数组里面。

  6、String字符串长度限制

  要回答这个问题要分两个阶段看,分别是编译期和运行期。不同的时期限制不一样。

  编译期

  我们所能想到的是String源码中定义,存储String字符的char数组最大是Integer.MAX_VALUE为2的31次方-1,那么也就是说可以存储2147483647个字符,分析到这时是不是以为大功告成了,其实不然,我们忽略了一点。

  我们编译java文件为class文件的时候是把字符串放在class的常量池中的,JVM对常量池的容量有严格的限制,JVN规定,字符串是由CONSTANTUtf8info类型的结构,CONSTANTUtf8_info的定义如下

  其中u1、u2是无符号的分别代表1个字节和2个字节,那么我们只需要看length最多允许两个字节的长度,理论上允许的的最大长度是2^16=65536。而 java class 文件是使用一种变体UTF-8格式来存放字符的,null 值使用两个 字节来表示,只剩下 65536- 2 = 65534个字节。

  所以,在Java中,所有需要保存在常量池中的数据,长度最大不能超过65535,这也包括字符串的定义。

  运行期

  上面提到的这种String长度的限制是编译期的限制,也就是使用String str= “”;这种字面值方式定义的时候才会有的限制。

  String在运行期的限制,其实就是我们前文提到的那个Integer.MAX_VALUE ,这个值约等于4G,在运行期,如果String的长度超过这个范围,就会抛出异常。

   相关文章

  粤语歌曲网(经典粤语歌曲汇总)

  北京奥特莱斯(来北京必逛的12个商场)

  豪杰超级解霸(还记得豪杰超级解霸吗?)

  龚自珍的资料(清代诗人龚自珍一生功绩简介)

  象牙塔是什么意思(“象牙塔”里怎么了?)

  水色风信子(水培风信子容易养)

  婧字怎么读

  虞姬是哪里人(古代著名美人虞姬到底是哪里人?)

  公办三本院校(我们还有哪些“三本”?)

  电子酒柜(酒柜最全选购指南)

  德州景点(德州市景区景点62个)

  玉兰油官方网(OLAY发布高端臻粹系列)

  更多byte转string中文乱码(c#字符串转byte数组提示输入字符串格式错误)相关信息请关注本文章,本文仅仅做为展示!

Copyright@2015-2025 www.xingbingw.cn 性病网版板所有