Java基础【02】字符串String

首先看下String类的源码

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    /** The value is used for character storage. */
    private final char value[];

    /** The offset is the first index of the storage that is used. */
    private final int offset;

    /** The count is the number of characters in the String. */
    private final int count;

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;

    ........
}

从源码中我们可以看出String是final类,也就意味着String类不能被继承,并且它的成员方法都默认为final方法。在java中,被final修饰的类是不能被继承的,并且该类中的所有成员方法都默认为final的

String对象的初始化有两种:

1. String str = "字符串内容";
2. String str = new String("字符串内容");

String类型的内容是保存在堆内存中的,栈内存仅保存指向堆内存的地址


以上两种格式生成的字符串效果是相同的,但是储存机制有很大的区别

    Java为String类提供了一种称为缓冲池机制的功能,当使用第一种方式去初始化时,直接赋值生成字符串,Java编译器总是先到缓冲池中去寻找是否存在内容与其相同的字符串,如果存在就可以直接是使用,如不存在则在缓冲池中创建一个新的字符串

    如果使用第二种方式,则每次调用都会生成一个新的String对象

==和equals的区别?

     首先java数据类型分为基本数据类型和引用数据类型

        如果是基本数据类型那么比较的是值是否相等。但是如果比较引用数据类型的话那么比较的是引用地址是否相同

int x = 10;
int y = 10;
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(x == y); // 输出true
System.out.println(str1 == str2); // 输出false
    equals方法存在于Object类中,用于判断引用对象的引用地址所指向的存储内容是否相等。因为Object类是所有类的直接或间接父类,也就是说所有的类中的equals()方法都继承自Object类,然而Object类中equals()方法底层依赖的是==号,那么,在所有没有重写equals()方法的类中,调用equals()方法其实和使用==号的效果一样,也是比较的地址值,然而,Java提供的所有类中,绝大多数类都重写了equals()方法,重写后的equals()方法一般都是比较两个对象的值


String不可变的特性

    一旦String对象创建后,对象中包含的字符串就不能再进行任何的修改。若要改变引用的字符串,那么只能放弃对原先字符串的引用,改为引用新的字符串

String str = "Java";
System.out.println("改变前:"+str);   //Java
str+="language";
System.out.println("改变后:"+str);   //Javalanguage

 String变量str输出结果虽然改变了,但是改变的不是字符串,仅仅是str变量引用发生了变化,原来堆内存找那个保存的“Java”字符串还是没有改变


在执行str+="language"时,除了java环境产生的“Java”和“Javalanguage”字符串常量以外,还存在一个“language”字符串常量。因为String类是不可变的,所以会产生很多临时变量,会增加内存的消耗。使用StringBuffer或者StringBuilder就可以很好的解决这个问题


String类的常用方法

char charAt(int index) 从字符串中获取指定位置的字符串(子串的索引是从0开始,并且空格也代表一个字符)
boolean equals(Object object) 比较两个字符串内容是否相等
char[] toCharArray 将字符串转换为字符数组
int indexOf(String str) 从头开始搜索指定字符串的位置,如果存在就返回字符串的位置,不存在则返回-1
int length() 返回字符串的长度
String replace(char old,char new ) 将字符串内指定的old字符替换成new字符
String replace(String regex,String replacemnet) 指定字符串的替换
String[] split(String regex) 按照指定的字符拆分字符串
String substring(int begin,int end) 截取从开始到结束的字符串,是左闭右开的 【)
String trim() 去除字符串头尾的空格
boolean matches(String regex) 检测此字符串是否匹配指定的正则表达式






猜你喜欢

转载自blog.csdn.net/poison6/article/details/80354944