Java中字符串怎么用

  介绍

这篇文章将为大家详细讲解有关Java字符串中怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

<强>前言

字符串可以说是Java中使用最多最频繁,最特殊的类,因为同时也是字面常量,而字面常量包括基本类型,字符串类型,空类型。

<强>一。字符串的使用

<强> 1。字符串的不可变性

/* *   ,*,{@code 字符串},class  represents  character 字符串只   ,* string  literals  Java 程序,拷贝,such  as  {@code “abc"},,   ,* implemented  as  instances  of 却;能够类。   ,* & lt; p>   ,* Strings 断开连接;常数;,their  values  cannot  be  changed  after 他们   ,*断开连接,创建只String  buffers  support  mutable 字符串。   ,* Because  String  objects 断开连接;immutable 活动对象;还要be 共享只For 例如:   ,*……   ,*/public  final  class  String  {,   ,private  final  char 价值[];   }

字符串对象一旦在堆中创建出来,就无法再修改。因为字符串对象放在字符数组中,该数组由最后一关键字修饰,不可变。

<强> 2。定义一个字符串

/* *   ,*定义一个字符串   ,*/String  str1 =,“helloworld";   String  str2 =,“helloworld";//也可以,但基本不这样写   String  str3 =, new 字符串(“helloworld");   System.out.println (==str1  str2);   System.out.println (str1 ==, str3);//运行结果,真的,,假

上面三句代码怎么理解呢?这里需要先引入一个概念,字符串常量池。

字符串常量池是一块特殊的独立内存空间,放在Java堆中{在Jdk7.0之前字符串常量池存放在PermGen中,Jdk7.0的时候移动到Java堆了(在堆中仍然是独立的),Jdk8.0的时候去掉了PermGen,用Metaspace进行取代},Java内存模型不是本章讨论的重点。

str1和str2引用的字符串字面量就在字符串常量池中,而str3引用的对象在Java堆中。

怎么,还不太好理解?举个例子

工作一天,到下班时间了,准备看会儿金瓶。算,了,《三国演义》,打开小说网站,在线阅读;过了半个小时,女票回家了,看《三国演义》也是她想做的事儿,我看网址发给她,好,她也开始看了,再过半个小时,我爸回来了,他也是三国迷,但是他不喜欢在线看,因此在书店买了一本看。

上面提到的小说网站就是一个字符串常量池,包含了很多字符串字面量,如《三国演义》、《西游记》、《红楼梦》等,每个字符串字面量在常量池中保持独一份,无论谁进网站看《三国演义》都是同样的网址和同样的内容。

我和女票就是str1和str2,我们看的都是同一个网站的《三国演义》,不仅内容一样,引用的地址也一样(字符串常量池中保留了唯一的“helloworld”),因此str1==str2运行结果为真正的

而我爸就是str3,与我和女票都不一样,虽然看的内容也是《三国演义》,但是通过实体书籍来看,引用地址不一样,同时一本书籍不支持多个人同时看(字符串对象在java堆中,且每次新都会新建一个对象),因此str1==str3运行结果为假的。

一个字符串字面量总是引用字符串类的同一个实例,因为被String.intern()方法限定了,同样我们可以调用该方法将堆中字符串的对象放到字符串常量池中,这样做可以提升内存使用效率,同时可以让所用使用者共享唯一的实例。

System.out.println (str1 ==, str3.intern ());//运行结果为真正的

那么该方法的实现逻辑是怎么样的呢,我们看一下源码

/* *,   ,* Returns  a  canonical  representation  for 从而string 对象又是;   ,* & lt; p>,   ,* A  pool  of 字符串,,initially 空,,is  maintained  privately  by 从而   ,* class } {@code 字符串只   ,* & lt; p>,   ,* When 从而intern  method  is 调用,if 从而pool  already  contains  a    ,* string  equal 用却;能够{@code 字符串},object  as  determined  by    ,*,{@link  #=(对象)},方法,then 从而string 得到,pool  is    ,*返回又是;否则,却;能够{@code 字符串},object  is  added 用,   ,* pool 以及a 参考文档用却;能够{@code 字符串},object  is 只返回;   ,* & lt; p>,   ,* It  follows  that  for  any  two  strings  {@code 年代},以及{@code  t},,   ,* {@code  s.intern (),==, t.intern ()}, is } {@code 如此,   ,* if 以及only  if  {@code  s.equals (t)}, is } {@code 真的只   ,* & lt; p>,   ,* All  literal  strings 以及string-valued  constant  expressions 断开连接;   ,*实习又是;String  literals 断开连接;defined  section  3.10.5  of 拷贝,   ,* & lt; cite>从而Java&贸易;,Language  Specification

Java中字符串怎么用