现在的位置: 首页 > 移动开发 > 正文

Java中的String有几类

2020年06月05日 移动开发 ⁄ 共 1583字 ⁄ 字号 评论关闭

  String是我们经常用到的一个类型,其实有时候觉得写程序就是在反复的操作字符串,这是C的特点,在java中,jdk很好的封装了关于字符串的操作。下面学步园小编来讲解下Java中的String有几类?

  Java中的String有几类

  先说,第一个String.

  JDK的解释是"Stringsareconstant;theirvaluescannotbechangedaftertheyarecreated"也就是说String对象一旦被创建就是固定不变的了(你一定有问题,但请先等一等,耐心读下去),这样的一点好处就是可以多线程之间访问,因为只读不写。

  一般情况下我们以下面两种方式创建一个String对象

  两种方式是有区别的,这和java的内存管理有关,前面已经说过,string创建之后是不可变的,所以按照第一种方式创建的字符串会放在栈里,更确切的是常量池中,常量池就是用来保存在编译阶段确定好了大小的数据,一般我们定义的int等基本数据类型就保存在这里。

  其具体的一个流程就是,编译器首先检查常量池,看看有没有一个"string",如果没有则创建。如果有的话,则则直接把str1指向那个位置。

  第二种创建字符串的方法是通过new关键字,还是java的内存分配,java会将new的对象放在堆中,这一部分对象是在运行时创建的对象。所以我们每一次new的时候,都会创建不同的对象,即便是堆中已经有了一个一模一样的。

  写一个小例子

  这个的运行结果是

  true//解释:两个字符串的内容完全相同,因而指向常量池中的同一个区域

  false//解释:每一次new都会创建一个新的对象

  false//解释:注意==比较的是地址,不仅仅是内容

  Java中的String有几类

  true//介绍一下intern方法,这个方法会返回一个字符串在常量池中的一个地址,如果常量池中有与str3内容相同的string则返回那个地址,如果没有,则在常量池中创建一个string后再返回。实际上,str3现在指向了str1的地址。

  这就是让人纠结的string了,现在你可以说话了…很多人有这样的疑问就是既然string是不变的,那么为什么str1+"some"是合法的,其实,每次对string进行修改,都会创建一个新的对象。

  所以如果需要对一个字符串不断的修改的话,效率是非常的低的,因为堆的好处是可以动态的增加空间,劣势就是分配新的空间消耗是很大的,比如我们看下面的测试。

  我的机器上运行结果是theruntimeis3538ms如果你把循环的次数后面再增加几个0就会更慢。因为每一次循环都在创建心的对象,那么JDK如何解决这个问题?

  下面就要说第二个类StringBuffer.

  StringBuffer是一个线程安全的,就是多线程访问的可靠保证,最重要的是他是可变的,也就是说我们要操作一个经常变化的字符串,可以使用这个类,基本的方法就是append(与string的concat方法对应)和insert方法,至于怎么使用,就不多讲了,大家可以自己查看API.

  测试一下,这次只需要8ms,这就是效率。

  那么接下来,就要问StringBuilder是干什么的,其实这个才是我们尝使用的,这个就是在jdk1.5版本后面添加的新的类,前面说StringBuffer是线程同步的,那么很多情况下,我们只是使用一个线程,那个同步势必带来一个效率的问题,StringBuilder就是StringBuffer的非线程同步的版本,二者的方法差不多,只是一个线程安全(适用于多线程)一个没有线程安全(适用于单线程)。

  以上就是关于“Java中的String有几类”的内容,希望对大家有用。更多资讯请关注学步园。学步园,您学习IT技术的优质平台!

抱歉!评论已关闭.