百科问答小站 logo
百科问答小站 font logo



jdk9为何要将String的底层实现由char[]改成了byte[]? 第1页

  

user avatar   basic13 网友的相关建议: 
      

这个特性是JDK9放出来的,主要是为了节约String占用的内存。

众所周知,在大多数Java程序的堆里,String占用的空间最大,并且绝大多数String只有Latin-1字符,这些Latin-1字符只需要1个字节就够了。JDK9之前,JVM因为String使用char数组存储,每个char占2个字节,所以即使字符串只需要1字节/字符,它也要按照2字节/字符进行分配,浪费了一半的内存空间。

JDK9是怎么解决这个问题的呢?一个字符串出来的时候判断,它是不是只有Latin-1字符,如果是,就按照1字节/字符的规格进行分配内存,如果不是,就按照2字节/字符的规格进行分配(UTF-16编码),提高了内存使用率。

举个类似的例子说就是,工厂生产的有多种型号的零件,一批零件必须装入同一种型号的包装发货,零件有大号和小号两种,而且绝大多数都是小号,之前包装的时候不管一批零件是大是小全部放到大号的包装里,造成了空间浪费,现在如果一批里面有大号就全装大号,如果没有大号就全装小号,提升了空间利用率。

这种做法带来的好处是显而易见的:

  • 原本一个仓库装不下的零件,现在可以装下了(用更少的内存跑更大的应用)
  • 原本仓库一天往外运一次,现在可以一天半甚至两天运一次(减少GC次数)

为什么用UTF-16而不用UTF-8呢,这就要从这两个字符集的设计说起了。

UTF-8实际上是对空间利用效率最高的编码集,它是不定长的,可以最大限度利用内存和网络。它是小包装装得下就用小包装,小包装装就看看能不能用大包装装,大包装都装不下就用超大包装。但是这种编码集只适用于传输和存储,并不适合拿来做String的底层实现。这是为什么呢?

因为String有随机访问的方法,所谓随机访问,就是charAt、subString这种方法,随便指定一个数字,String要能给出结果。如果字符串中的每个字符占用的内存是不定长的,那么进行随机访问的时候,就需要从头开始数每个字符的长度,才能找到你想要的字符。试想,如果大小包装混装,你想拿到第N个零件,你必须一个一个数包装盒,数到N,才能找到你要的零件。而如果包装是一样的大小,你就可以通过简单的计算知道你要找的零件距离你有多少远,直接过去拿就行了。

但是又有人会问了,UTF-16也是变长的啊,一个字符可能在UTF-16里面占用4个字节咧。是的,是的,UTF-16是变长的,但这是在现实世界里是这样。在java的世界里,一个字符(char)就是2个字节,从u0000到uFFFF,占4个字节的字符,在java里是用两个char来存储的,而String的各种操作,都是以java的字符(char)为单位的,charAt是取得第几个char,subString取的也是第几个到第几个char组成的子串,甚至length返回的都是char的个数,从来没有哪个方法可以让你“通过下标取出字符串中第几个'现实意义'中的字符”,所以UTF-16在java的世界里,就可以视为一个定长的编码。

还是工厂的例子:如果哪天出现了一个超大的零件咋办?简单,我这就只有大号包装,一个大号的包装都装不下的时候怎么办呢,把超大号的零件切成两份就行了,用两个大号包装去装,出厂也视为两个零件。

关于这种超大零件,可以试着跑以下下面的代码体会下:

因为知乎的字符集并不全,所以贴不出来,需要复制的话可以去这里复制:

gitee.com/yzyang/test/b


user avatar   pansz 网友的相关建议: 
      

这个问题其实,主要取决于你的团队,以及商业模式。

我假定你一个便携小工具是没打算赚大钱的,只是顺带附送的工具,从这个角度出发的话,「不可能专门为了这个项目去培训或者招聘」。

那么结果就很显然了:你的团队成员会什么技术,那就用什么技术。什么方法能立即上手就用它。——其它的因素都是次要的。因为理论上,现在任何技术,都可以用来写桌面应用。所以技术本身不是痛点,痛点是你的团队成员懂什么,最喜欢用什么,那就赶快用上

我很难相信为了一个便携小工具你们会专门让团队学习培训新技术或者专门招一个懂新技术的人来带队。如果是这样的话,那参考其它回答。


user avatar   zi-fei-yu-48-80-48 网友的相关建议: 
      

我是一名基层派出所民警。

可以说当今中国警察普遍羡慕美国警察可以采取暴力手段绝对的镇压不法分子。

但是,不得不说,这次这位美国警察,太过分了,不仅是过分,而且我的理解是那已经构成了犯罪行为。那黑人已经制服了就可以正常上拷带走了,没必要一直压着脖子压那么长时间。没能置身其中不知现场那美国警察的所思所想,反正我个人挺不理解他为啥那样干的。

只能说无论什么地方,无论什么行业,只要是人的社会,都有像样的也有操蛋的吧。

_________此处为分割线 _________

以下为统一答复评论中有些人质疑的我所讲的羡慕二字。

能够出现这种质疑在我料想之中,因为中国警察也有过过分的时代,据我所知就是在七十八十九十年代,就如同地痞流氓,看谁不顺眼就能打谁对老百姓而言没王法可讲,那时候的警察说好听点可以说是威风凛凛说难听点儿是横行霸道。

但我想表明的是,时过境迁,现在的中国警察无论是受舆论约束还是因为法治社会建设制度规范都已经变得逐步文明与规范起来,起码我认为从我们现在开始从公安司法院校毕业参加公务员考试考进来的新一代警察已经具备新的面目,当然不可否认的是在这个行业内目前仍然存有历史的顽疾,仍然存在着臭虫,但我已经讲过无论什么行业都有操蛋的吧,这是个人问题,不是群体问题。相比之下,拍拍良心看,现在的整个警察队伍比照曾经确实过分的年代是不是已经是天地之别,问问曾经真正挨过曾经年代老警察欺负的中老年人就知道了。

为何会说起羡慕,因为警察每天面对的人群,大多是三教九流之辈,没有武力加身,很多事情在处理上警察显得软弱无能,说白了,好人谁没事儿上派出所转悠啊都忙着自己的生活呢,警察打人这句话,我们常常听到,但是但凡有点脑袋的人都能想明白,警察会闲着没事儿干把那在家里消停待着的遵纪守法的人抓起来暴揍一顿吗?

以上言辞不免更会有人质疑,请允许我解释,武力,当然不可滥用,我所说的羡慕不是羡慕美国警察的随意滥用武力,而是在合法范围内准许在对方不听从警察指令时动用武力,现在确实有人民警察法赋予了相关权力,但实践中现在的中国警察并不能或者说不敢执行人民警察法里的所有权力。拿防疫工作举例,卡口的工作人员在让出入的人员扫码登记时,就会有不愿意配合的人,然而这些不愿意配合的人可会知道工作人员的所做所为是为了整个社区的稳定安全,因为这整个社区包括了这名不愿意配合的人啊,在这个时候是否应当对其进行武力控制来保障其他居民的安全呢。同理,警察盘查也好,调查也好,总会有那些不愿意配合的人,自我感觉良好认为自己没问题所以警察不必要对其进行盘查所以就不配合,而警察当看到对方不配合时会以什么视角审视,难道要说谢谢您的不配合吗,万一这不愿配合的人真背着案子呢,那便是对更多的人民群众的不负责任。因此,我要说,民众的素质如果真正达到了人人互相敬重路不拾遗夜不闭户的文明程度,要求警察绝对文明不要有暴力举动,一点问题没有,一味强调了警察不该暴力执法而分毫不过问被执法对象自身是否存在问题,是不是看问题的角度些微的片面了些。

请注意,我说羡慕里的那句话尾巴实际已经表明了,羡慕的是暴力手段对不法分子的镇压,可不是对遵纪守法的百姓也要肆意妄为。例如像给群众办个身份证居住证之类的业务,警察当然应该热心服务。但当面对泼皮无赖时,还要笑脸相迎,得来的只有蹬鼻子上脸,警察都不怕了,您们认为这些无赖还有谁管得了。

列位存有异议的同志们,谢谢您们的教诲。言辞中犀利的同志们,谢谢您们的敦促。

让我知道当警察,需要吾日三省吾身。

还想要质疑甚或是骂的您们,若是能让您舒服,骂两句无妨。我不算您辱骂警察。不过是,道不同不相为谋罢了吧。

_____分割线

2020年6月5日22:53 出警在路上




  

相关话题

  为什么总是有人说 Java 啰嗦,却没人说 C++ 啰嗦? 
  如何看待哔哩哔哩用Go语言重写所有的Java后台工程? 
  如何借助服务器,使两个客户端之间建立网络连接? 
  为什么编程语言都是上下文无关文法,不能采用上下文有关文法吗? 
  编程零基础应当如何开始学习 Python? 
  怎样才能写出 Pythonic 的代码? 
  Java 不能实现真正泛型的原因是什么? 
  如何评价阿里近期发布的Java编码规范? 
  如果我发布了一款编程语言,后缀名是.c,那么这能算是一门新的编程语言吗? 
  如果编程语言有性别?Java、C++、C、C#是男是女?是GAY还是LES? 

前一个讨论
乌克兰军队是不是世界和平的最大威胁?
下一个讨论
如果专升本跟本科没有任何区别了,那对本科考生是不是不太公平了呢?





© 2024-12-23 - tinynew.org. All Rights Reserved.
© 2024-12-23 - tinynew.org. 保留所有权利