4,字符和字符串类

2020-1-6

计算机排列字节的方式有大端法(BE)和小端法(LE),数据的加载从地址的低到高,顺序加载。

计算机排列字节的方式有大端法(BE)和小端法(LE),数据的加载从地址的低到高,顺序加载。

//存储的数据为0xABCDEF...

//存储地址有0x100,0x101,0x102...

//大端法对应存储AB,CD,EF...每次顺序拿地址,左右拼接起来。

//小端法对应存储...,EF,CD,AB,每次拿一个都会追加到前边。

//一般不需要考虑

常见编码

ASCII:标准的单字节,美国码。

ISO8859-1:单字节增强码,包容ASCII,欧洲码。

GB2312:中国规定,6763个通用汉字

GBK:中国规定,21886个汉字

GB18030:中国规定,70,244个汉字,向上兼容

Unicode:万国码,范围0x0~0xFFFF,是一种规定,保存方式由UTF-8,UTF-16,UTF-32来实现。

    \u7231:视为Unicode字符,对应中文"爱"=U+7231,

    爱:也视为Unicode字符,有分号结尾

UTF-32:直接保存这16进制编号地址为二进制数。

UTF-16:U+0000~U+FFFF的范围用两个字节,剩下的用四个字节

UTF-8:可变字节。

0x00~0x7F,单字节范围对应ASCII,0XXXXXX

0x80~0x7FF,两个字节,110XXXXX,10XXXXXX

0x800~0x7FFF,三个字节,1110XXX,10XXXXXX,10XXXXXX

//...

//例子,砍六填充到8

//0x7231

//0111,0010,0011,0001

//0111,001000,110001,

//11100111,10001000,10110001,

URL编码:URL只支持字母数字特殊符号以及一些保留字,不包括双引号,要使用Base64进行编码处理。

java中char使用的unicode编码来存储。


Charset.availableCharsets().keySet();//获取java支持的所有编码

StandardCharsets.UTF_8//获取UTF-8等常用的静态字符串,jdk1.6以及以下是没有的

字符串类:本质上用char数组来保存数据,打印出来是双引号包裹的字符串。


String://final修饰,处理都是重新赋值新的字符串,构建以及转化,索引以及查找,比较以及复制,拆分,大小写转化

    //String是引用传递,但值不可以改。

    //String A ="1";引用传向对象B,再修改B的值,d

    //String B = A;

    //String B =B+"2";//其中操作是常量池创建新字符串"12"再修改B的引用。A的引用还是指向"1"

StringBuilder://可变不安全字符串类,默认char数组长度16,

    //追加,//插入,长度,索引,翻转,截取,替换等功能    

StringBuffered://可变安全字符串类,是底层安全的StringBuilder对象

//方法和StringBuider一样

//三者的优选方式:StringBuider最优先,线程安全考虑StringBuffered,简易使用则用String

字符串之间的比较:


//常量池保存唯一的字符串(没有则创建),并返回引用。对字符串的操作都返回新增字符串的地址。

Stringa="1";//a的值为常量池地址,

Stringb=newString("1");//b的值为堆地址

Stringc=String.valueOf(a);//继承,a.toString返回的a对象引用。

//==比较引用指向的地址位置。上边堆地址值肯定不等于常量池地址值。

//equals比较的是字符串的内容。

Stringstr="a"+"b";//编译后,String str = "ab";

finalStringa="a";

Stringb=a+"b";//结果,b =="ab";

Stringc=(newStringBuilder()).append(a).append(b).toString();//String c = a+b;jdk8的编译器自动优化

大批量的字符串拼接效率:


+  //字符串拼接

concat  //String对象的concat方法

StringUtils.join(Object[]objs)//apache.commons的字符串拼接方法,就是用的StringBuilder拼接并且返回String

StringBuffer.append() 

StringBuilder.append()

//StringBuilder>StringBuffer>String对象.concat>+            

字符串转化:


//java内所有的字符串都是unicode字符串。

//ISO-8859-1单字节文件,可以直接转化为unicode和gbk等,常见的全英文文件不受编码影响。

//非单字节文件,必须用对应的编码保存,不然变全乱码文件。

//不同的非单字的字节编号对应的值都不同,GB18030在UTF-8的是不对应的,国标系文件向上兼容。如果想值转化,考虑字符映射表

//字符串的本质就是byte[],大部分不同的数据类型是可以转化的,转化UTF系列是不可逆的。

"".getBytes(encoding);//获取指定编码的字符串,不传编码就拿本地编码

newString(byte[],encoding);//byte[]转化为字符串

        //举个栗子:

        byte[]bytes="我爱你".getBytes(GBK);

        System.out.println("-----转化为IBM855和转回GBK");

        Strings1=newString(bytes,"IBM855");

        Strings2=newString(s1.getBytes("IBM855"),GBK);

        System.out.println(s2);

        System.out.println("-----转化为ISO-8859-1和转回GBK");

        s1=newString(bytes,"ISO-8859-1");

        s2=newString(s1.getBytes("ISO-8859-1"),GBK);

        System.out.println(s2);

        System.out.println("-----转化为UTF-8和转回GBK");

        s1=newString(bytes,"UTF-8");

        s2=newString(s1.getBytes("UTF-8"),GBK);

        System.out.println(s2);

//web服务接收的参数就是乱码,一般是直接过滤器过滤掉非UTF-8编码的请求。

//文件上传功能传递文件名乱码,tomcat会自动用ISO-8859-1转化为String文件名。可选择转化为ISO的byte数组,在转化UTF-8字符串。缺点每次都要处理。

字符串都保存在常量池中,常量池的位置在jdk1.6,1.7,1.8的位置不同。


java.lang.OutOfMemoryError:PermGenspace//永久代内存不足,jdk1.6永久代放在堆外

java.lang.OutOfMemoryError:Javaheapspace//堆内存不足,jdk1.7永久代放在堆中

java.lang.OutOfMemoryError:Metaspace//元空间内存不足,jdk1.8永久代取消,被元空间替换,本地内存中

Unicode字符串的处理与优化:


chara='\uabcd'    //在java中代表一个char

Stringb="\\uabcd"//unicode字符串固定长度6    

Stringc="ꯍ"//unicode字符串固定长度8

//测试中,使用了subString(很低),new StringBuilder,StringBuilder替换指定位置,和char数组。Pattern类(性能低,在600W字节的测试数据中,一秒处理100个左右),  

//最终测试,还是使用了char[]来处理。优点,占用时间最少,空间使用最少(字符串长度600W,目标容器600W和一个长度4的char数组)。    


个人项目的测试与学习

//访问路径:https://github.com/JunOneWolf/test2learn

字符串和unicode的处理:cn.jof.test2020_1_15_testUnicode

//字符串拼接性能检测:cn.jof.test2020_1_16_testStringConcat。

//检测文件的编码工具类:cn.jof.utils.EncodingDetect

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 字符集和编码简介 在编程中常常可以见到各种字符集和编码,包括ASCII,MBCS,Unicode等字符集。确切的说...
    兰山小亭阅读 8,451评论 0 13
  • 字符串和字符 甲串是一系列字符,如的"hello, world"或"albatross"。Swift字符串由Str...
    Fuuqiu阅读 1,024评论 0 0
  • 字符串和字符 [TOC] 字符串是例如 "hello, world" , "albatross" 这样的有序的 C...
    伍哥___阅读 1,082评论 0 0
  • 用心对待宝物:服装仪容 如果打算从事优质的工作,想学到优质的事物,更要打理好自己的外在服装仪容。 在服装仪容上的用...
    麦子整理师阅读 154评论 0 0
  • 默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源。 Memory 内存风险 不允许容...
    Anoyi阅读 4,197评论 1 11