Skip to content

Latest commit

 

History

History
62 lines (44 loc) · 2.37 KB

File metadata and controls

62 lines (44 loc) · 2.37 KB
layout post
title 关于String字符串
description javase
tag java

关于String字符串

1.String类

String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象。java把String类声明的final类,不能有类来继承它。String类对象创建后不能修改,由0或多个字符组成,包含在一对双引号之间。

2.常量池

String一般来说有两种赋值的形式,直接赋值和new一个出来。采用直接赋值会现在String常量池中来找,诺有该对象则直接返回,没有的会以new的形式来返回一个对象,并将其放入常量池中

String s1 ="hello"//此时会在常量池中来找,找不到的话会在池中建一个"hello"的字符串,来指向s1
String s2 ="hello"//常量池中存在该值对象,直接返回给s2这个对象
System.out.println(s1==s2)//值为true,拿到时同一个值对象
//采用new一个的形式,会直接new一个出来,如果常量池中没有该值的话,会添加到池中,可能会产生两个对象
String s3 = new String("hello");
System.out.println(s1==s2)//值为false

3.String、StringBuffer和StringBuilder的区别

1.对象的可变与不可变

  String类中使用字符数组来保存数据,因为有“final”修饰符,所以string对象是不可变的。如下:

private final char value[];

  StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存数据,这两种对象都是可变的。如下:

char[] value;

2.是否是线程安全

  String中的对象是不可变的,也就可以理解为常量,所以是线程安全

  AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

  StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。如下为其源码

1  public synchronized StringBuffer reverse() {
2      super.reverse();
3      return this;
4  }
5
6  public int indexOf(String str) {
7      return indexOf(str, 0);        //存在 public synchronized int indexOf(String str, int fromIndex) 方法
8  }

StringBuilder并没有对方法进行加同步锁,所以是非线程安全的