String str = "Hello World";//str是一个对象,那么“Hello World”应该保存在堆内存中
构造法String str = new String("Hello World");
实例化的区别:
1.采用直接赋值
String str1 = "Hello"; String str2 = "Hello"; System.out.println(str1 == str2);为什么现在没有开辟新的内存空间呢?
在JVM底层实际上会自动维护一个对象池(字符串对象池),如果采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)会自动保存在这个对象池之中,如果下次继续使用直接赋值的模式声明String类对象,此时对象池中如若有指定内容,则直接进行引用;如若没有,则开辟新的字符串而后将其保存在对象池中以供下次使用。
2.采用构造方法
String str = new String("Hello");
通过分析可知,如果使用String构造方法就会开辟两块堆内存空间,并且其中一块内存将成为垃圾空间。
例:字符串共享问题
String str1 = new String("Hello"); String str2 = "Hello"; System.out.println(str1==str2);该字符串常量并没有保存在对象池之中。
String类中提供有方法入池操作public String intern();
String类中两种对象实例化的区别
1.直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
2.构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以通过intern()方法入池。
上述代码中两个字符串内容相同,而使用==得到的结果不同,这是为什么呢?我们可以看一下内存图分析:
== 本身是进行数值比较的,如果用于对象比较,那么所比较的应该是两个对象所保存的内存地址数值比较,而并没有比较对象的内容。
那么要比较内容怎么办呢?则必须采用String类的equals方法。
String str1 = "Hello"; String str2 = new String("Hello"); System.out.println(str1.equals(str2));String类 == 与 equals的区别
1.“==”:进行数值比较,比较的是两个字符串对象的内存地址数值
2.“equals()”:进行字符串内容比较
在Java中,本身也没有提供字符串常量的概念,所有使用""定义的内容的本质上都是String类的匿名对象。
String str1 = "Hello"; String str2 = new String("Hello"); System.out.println(str1.equals(str2)); System.out.println("Hello".equals(str2));"String str1 = "Hello"",本质上是将一个匿名的String类对象设置有名字,而且匿名对象一定保存在堆内存中。
字符串一旦定义,不可改变。
String str1 = "Hello"; str1 += "World"; System.out.println(str);以上变更是字符串的引用一直在改变,字符串上没有发生任何变化,会形成大量的垃圾空间。
public String[] split(String regex);将字符串全部拆分
public String substriing(int beginIndex);从指定索引截取到结尾
public String substring(int beginIndex,int endIndex);截取部分内容
索引从0开始。
10 StringBuffer类
String类中使用"+"进行字符串连接,而在StringBuffer类中更改为append()方法
public synchronized StringBuffer append(各种数据类型 a);
public class Test{ public static void main(String[] args) { StringBuffer sb = new StringBuffer(); sb.append("Hello").append("World"); display(sb); System.out.println(sb); } public static void display(StringBuffer temp){ temp.append("\n").append("www.sust.com.cn"); } }String和StringBuffer相互转换
String--->StringBuffer:利用StringBuffer的构造方法或append()方法
StringBuffer--->String:调用toString()方法
StringBuffer特有的方法
字符串反转:public synchronized StringBuffer reverse()删除指定范围的数据:public synchronized StringBuffer delete(int start,int end)插入数据:public synchronized StringBuffer insert(int offset,各种数据类型 a)String、StringBuffer、StringBuilder的区别
1.String的内容不可修改,StringBuffer与StringBuilder的内容可以修改
2.StringBuffer采用同步处理,属于线程安全操作,而StringBuilder采用异步处理,属于线程不安全操作