首先看下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); // 输出falseequals方法存在于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) | 检测此字符串是否匹配指定的正则表达式 |