范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Java中的字符串相关知识整理

  字符串为什么这么重要
  写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生。每学一门编程语言就会与字符串这个关键词打不少交道。看来它真的很重要。
  字符串就是一系列的字符组合的串,如果写过C/C++的应该就了解,在字符串的操作上会有许多操作的函数与类,用于简化代码的开发。一方面是因为字符串在代码中会频繁用到,另一方面是因为字符串的操作非常麻烦。
  最初我知道String的特殊待遇就是在delphi中,因为String在delphi里是一个关键字存在,与其他的基本类型是不一样的。那时就了解到了许多相关的知识。在java/.net也都对string做了专门的处理,可见重要性。
  正因为字符串在程序中用的多,而且操作也多这就会带来内存占用与性能的问题,所需要特殊的关照一下,想象一下一个日志记录系统一天时间得用上多少字符串变量。 了解一下java中的String
  java中提供了String类支持字符串的功能,毕竟字符串本质就是一堆字符的组合,那么就来看看它有什么特点吧。 String的特点
  String把字符串还是存放在一个char数组中的,数据的操作围绕它展开,但有点特别的地方,代码如下 private final char value[];
  可以发现这个char value[]是加了final的,也就是说一旦创建了值就不可变。这样就会导致每一次创建String只会有一个值,再对其进行字符串操作也必须生成新的值。java对这个处理使用了字符串常量池的概念。就是把字符串丢到一个池里,如果相同就用相同的。当然这也有个前提,就是要用下面的方式 String s = "abc";
  这样做的时候jvm会在编译期就确定了,在运行时会先在常量池里查找是否有"abc",没有就添加并返回,有的话返回常量池的对象。这样做的好处是对于相同的字符串就不需要重复创建啦。 但是如果使用下面的代码 String s1 = new String("abc");
  这个时候情景就变了,这里jvm会在堆栈里创建一个对象s1,只不过s1里的value也是指向"abc"的。后面在看字符串比较的时候会发现区别。 字符串比较 看一段代码: String s = "abc";  String s1 = "abc";  if (s == s1) {      System.out.println("s == s1");  }
  问:这时s==s1吗?
  答案是相等的,为什么呢?其实jvm会在s1创建时去常量区查找是否有相同值的字符串,如果有就返回给s1,这样s1就和s指向了同一个字符串,所以是相等的。
  但是还有一种情况就不一样, String s = "abc";  String s3 = new String("abc");  if (s == s3) {  	System.out.println("s == s3");  }  else {      System.out.println("s != s3");  }
  这个时候应该print出s != s3,这是因为new一个String对象后确实会创建一个新的变量。所以使用==比较的话自然就返回false了。
  用到equals比较呢? String s = "abc";  String s2 = new String("abc");  if (s.equals(s2)) {  	System.out.println("s = s2");  }  else {      System.out.println("s != s2");  }
  打印是s = s2,因为==是用于比较两个地址,而equals是用于比较两个变量的值。可以看一下equals的代码 public boolean equals(Object anObject) {      if (this == anObject) {          return true;      }      if (anObject instanceof String) {          String anotherString = (String)anObject;          int n = value.length;          if (n == anotherString.value.length) {              char v1[] = value;              char v2[] = anotherString.value;              int i = 0;              while (n-- != 0) {                  if (v1[i] != v2[i])                      return false;                  i++;              }              return true;          }      }      return false;  }
  在equals中,先是比较是否地址相同,如果不相同比较value,因为value都是"abc"自然就返回true。 intern方法
  String里有一个intern方法,我们可以先试一下面的代码。 String s = "abc";  String s3 = new String("abc");  if (s.intern() == s3.intern()) {  	System.out.println("s.intern = s3.intern");  }  else {      System.out.println("s.intern != s3.intern");  }
  还是上面的s和s3,如果使用各自的intern方法返回的值比较则会输出s.intern = s3.intern。找了找资料结合注释了解到,这个intern方法其实是从字符串常量池里返回当前字符串,如果当前字符串已经存在了则返回当前字符串,如果当前字符串不存在,则将当前字符串放入常量池再返回。
  有了这个解释就明白了,s和s3都通过intern返回的那么都是常量池里的"abc"咯,所以intern比较时是相等的。 认识一下StringBuffer和StringBuilderStringBuffer和StringBuilder哪一个是线程安全的?
  面试时遇到的这个问题,我突然有点懵,没太注意过这两个类,而且印象中java里只有一个StringBuffer呀?回来看了一下代码原来StringBuffer是线程安全的,也就是在字符串操作的方法上都有synchronized。
  于是打开代码注释发现是Jdk1.5才开始有的StringBuilder,而且在后面版本加了个不加锁的类,看样子是解决非并发场景下的效率问题,不加锁对于操作大字符串还是有性能提升的。出于好奇看了一下这两个类的代码,与String真有些类似,只不过这时的chat[] 已经是不带final的咯,这样就避免了String类操作时产生一堆字符串对象的问题。 char[] value;StringBuffer和StringBuilder的作用
  既然已经有了String,那这两个家伙有什么用呢?其实问题还是要和String的原理有关系。因为String是通过常量池管理的,这样解决的是相同字符串重复创建的问题,但大部分字符串都是不一样的,特别是在做字符串拼接操作时,如果用String的+进行拼接就会产生大量的字符串常量,非常的消耗性能与空间。
  为解决这个问题就用到StringBuffer,本质上也就是通过一个可变的字符序列,在字符串操作时不需要生成新的对象,从而提升内存使用。
  看看StringBuffer是怎么提升这个拼接性能的吧。 查看StringBuffer/StringBuilder的代码(JDK1.5+)发现它们都继承于AbstractStringBuilder。很多的代码其实都是在AbstractStringBuilder里完成的。因为这个问题由拼接引出的,在此我们就主要关注一下append方法吧。 public AbstractStringBuilder append(String str) {      if (str == null)          return appendNull();      int len = str.length();      ensureCapacityInternal(count + len);//确定容量      str.getChars(0, len, value, count);//取出str的字符放入到value数组中      count += len;//count累加      return this;  }
  代码还是比较清楚的,整个过程最重要的就是使用String的getChars方法将str的值写入到当前对象的value中。而String的getChars方法如下: public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {      if (srcBegin < 0) {          throw new StringIndexOutOfBoundsException(srcBegin);      }      if (srcEnd > value.length) {          throw new StringIndexOutOfBoundsException(srcEnd);      }      if (srcBegin > srcEnd) {          throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);      }      System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);  }
  可以看出最终是做了一个数组的复制,因为在AbstractStringBuilder中的value是个可变的char数组,这样的话对于字符串操作只需要在char数组上进行即可。不会像String那样生成新对象,所以说自然就变的高效了。

你笔记本选对了吗?选笔记本看这一篇就够了(二)市面上的笔记本品牌型号繁多!对于不懂电脑的小白来说选笔记本是个很头疼的问题!下面就跟着我了解笔记本其中的几大核心部件!之前已经简单讲解过处理器,这次给大家分享下选择笔记本显卡的注意双7降临,灭了矿工的威风,intelNVIDIA这一套终于可以入手了我国重拳砸向挖矿,一夜暴富终成泡影,挖矿不成只好挖煤!不过这一切仿佛黄大厨早有洞悉?自五月初便开始发布锁算力的RTX3070Ti和3080Ti,过早地布局矿卡后事,让人不得不怀疑大预算2000元左右,标配8G内存,哪款5G手机性价比最高?感谢邀请预算2000元左右,标配8G内存,哪款5G手机性价比最高?题主问题的核心是预算2000元左右,标配8G内存,哪款5G手机性价比最高?我个人用的是iQOOneo5这款手机,价家里都装备上小米家电是怎样一种体验?作为一名家电行业的测评人,光今年我就已经测过很多小米旗下的产品,有小米空调,小米电动牙刷,小米智能门锁小米吹风机等还有很多小米生态链产品,比如鹿客指纹锁素士吹风机石头扫地机器人等。机械硬盘存储数据,不通电静电袋储存,可以储存多少年?我的看法机械硬盘长期不用比经常用寿命和性能要好很多很多!机械硬盘通电次数和运转时长决定它的寿命。另外,电源质量也很关键!环境温度不能太高!其次,机械硬盘忌讳在读写中突然掉电。还忌讳闭环抓手赋能,入侵兰州拉面?作者丨顾见监制丨阑夕投后估值50亿元的中式糕点连锁品牌墨茉点心融资上亿计划5年加盟店破万夸父炸串拿到红杉资本10亿元投资意向书的兰州牛肉面品牌马记永仿佛一夜之间,街头最寻常不过的餐iOS14。7第五个预览版2021年7月9日,与iOS14的上一个预览版时隔9天,苹果推出了iOS14。7Beta5的更新。已经更新至iOS15预览版的设备无法检查到本次更新。本次更新只是错误修复和改进,没vivoX70有望9月发布,NEX新机或跳票明年近期vivo方面已经官宣旗下S10系列机型将会在7月15日正式发布。而根据以往爆料来看,vivo旗下X70NEX系列新机均有更新计划。近日,也有数码博主爆料了上述两款机型的发布时间iPhone13系列外观图惊现,颜值增高且协调,相机将大幅提升从目前我们看到的各种iPhone13外观爆料图来看,我们预计iPhone12不会发生巨大变化至少从设计的角度来看是这样。从国外大神的最新爆料看,新的iPhone13系列外观还是有所为什么小米卖的最好的是便宜廉价低端的红米系列?我认为主要有几个原因,第一,小米是年轻的互联网品牌,消费群体主要是学生等年轻人和老年人,而这两个群体没必要用太好的手机,普通的就可以了,那考虑的也无非就是魅蓝和红米。第二,最近魅族全新RAM1500纯电动版将于2024年正式上市近日,根据Stellantis集团官方消息,其旗下全新RAM1500纯电动车型将于2024年正式量产上市。并公布了该车的预告图。RAM1500纯电动车型将基于STLAFrame非承
突破5000万!华为再次迎来好消息,操作系统打破世界新纪录点击关注,每天精彩不断!导读突破5000万!华为再次迎来好消息,操作系统打破世界新纪录!华为作为中国第一大的民营科技企业,实力自然是比较雄厚的,在任正非的带领下,这些年来华为一直都中兴Axon305G搭载新一代摄像头,将于9月海外上市中兴Axon30手机搭载第二代屏下摄像头已于8月3日在中国正式发售,据悉Axon30将会在9月9日海外发售,主要发售地区为欧洲北美亚太非洲以及中东地区。中兴Axon305G搭载6。百度发布昆仑芯2代AI芯片,采用7nm工艺,出道即量产8月18日,百度创始人董事长兼CEO李彦宏在百度世界大会上宣布第2代自研AI芯片昆仑芯2(又称昆仑2),正式量产。值得一提的是,本次不是宣布流片成功,而是直接宣告量产。AI(人工智什么时候iPhone也变得会卡了?在我印象中,iPhone手机是不太会卡的,这里的卡指的是卡顿不丝滑,但不排除一年也许会有一两次直接死机的情况,这种情况一般称之为意外,不能叫卡。仔细回想,好像是更新至iOS11以上深度山寨机永远有市场是杂牌,还是骗子?记者陆柯言2021年,山寨机仍然活着。一场快手直播,炸出了不少陈年的手机品牌。天语糖果酷派纽曼,这些活在记忆中的手机品牌纷纷挤进了直播间,等到人们因为情怀和性价比买单时,却发现它们微测检测蓝牙耳机出口美国需要办理什么认证?随着智能化的发展,智能蓝牙耳机逐渐成为大众人群的必备物品,越来越受人欢迎,逐渐成为市场的宠儿。接下来,微测检测为您整理了蓝牙耳机出口美国所需要的认证要求。蓝牙耳机出口美国需要满足的Android掌机Odin开始众筹,提供天玑900和骁龙845两种版本如今手游已经是掌上游戏市场的最主要部分了,一般玩家可能用触屏来打手游就满足了,但还是有不少相对传统一点的玩家,喜欢实体物理按键,又或者是有玩模拟经典游戏的需要,这时候可能最便宜的方oppofindx3华为p50mate40和荣耀magic3之间,买哪款好?如果非要在这四款手机中选择一款手机进行购买,小芳我个人会更加倾向于oppofindx3这款手机会更多一些。我给到的理由有以下几点,大家不妨参考一下。理由一首先我们先来看一下这四款手飞利浦颈挂式商务降噪耳机N7506火热抢购中不要错过哟这两年的耳机市场上,颈戴式蓝牙耳机开始多了起来,这种耳机的优势在于能够将大部分耳机的重量都集中于项圈部分,使得耳机的佩戴舒适性得到了进一步提升,而不会像一般的蓝牙耳机那样,主要部件资深玩机党在线分享高性价比手机这两款要仔细看如今,手机市场的竞争愈发激烈,这对于我们普通消费者来说,一方面是好事选择变得更多了,一方面也有缺点,那就是在这样的环境中就更难找到最值得的机型了。今天,我就为大家推荐几款以性价比扬静无止境飞利浦颈挂式降噪耳机N7506让商务精英静享超高音质作为一款拥有轻盈机身优雅时尚外观设计的颈挂式降噪耳机,定位商务的飞利浦N7506是一款非常受年轻人喜爱的产品。特别是其别具一格的减压式加宽颈带结构,对于使用者来说相当友好,结合仅8