字符串分为可变字符串和不可变字符串。
不可变: String
可变:
1. StringBuilder 适用于单线程
2. StringBuffer 适用于多线程
使用可变字符串类的原因是:如果之前一直使用不可变的String,通过+拼接,会对内存造成负担,且一旦使用过多,会频繁的进行内存的分配和释放,降低效率。
字面量的创建方式:
(1)存放在堆里
(2)有string独立管理的字符串常量池内存区,JDK1.8 开始字符串常量区放在堆里
Intern()方法,只针对两个字符串内容相等时,调用intern方法会先判断常量池中是否存在相同的字符串内容,如果存在,则返回该字符串对象的引用,如果不存在,就先将字符串对象存放到字符串常量池中,然后返回该字符串对象的引用。
对字符串的操作方法:
尤其注意下面代码中第11部分 trim去除的是半角空格,以及如何去除全角空格的解决办法
使用new创建对象,和不使用new创建对象的区别:使用new创建对象,会直接在堆的字符串常量池内存区申请一块内存空间,使用完毕后会被GC回收。而不使用new创建对象,首先在字符串常量池内存区中查找是否有该字符串,如果有,那么创建的变量即为该字符串的引用,不会开辟新的内存空间。
/**
*
*/
package com.zhi.stringdemo;
import java.util.Arrays;
//* 计算机属于通配符 *代表lang所有的java类都导入过来。
//lang是java的基础包,所以默认已经导入过的。 一般情况下,使用某一个工具类
//会只导入该类,不会导入整个包的所有类。
//import java.lang.*;
/**
* @author Administrator
*
*/
public class StringTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1 字面量创建字符串对象的方式 iterals 推荐使用方式
String str1 = "hello";
// 2 传统的创建方式
// 从内存分析:参数"hello" 是匿名字符对象,在下面代码执行完毕之后依旧会被回收
String str2 = new String("hello").intern();
String str3 = str1;
// 如果字符串常量池中之前有hello字符串对象,则str4直接指向这个字符串对象。
// 不用重新开辟新的内存空间,如此,可节省内存资源。
String str4 = "hello";//str4 = str1;
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str1 == str4);
// "laosun" 匿名字符串 执行完毕下面一条代码,laosun字符串对象就会当做垃圾被GC回收。
System.out.println("laosun");
// intern()
// A pool of strings, initially empty, is maintained privately by the class String.
// 3 避免nullPointerException
String str5 = null;
// str5.equals("laosun");
// 字符串常量会放在前面,调用方法。
"laosun".equals(str5);
// 4 接下来字符串的API方法 API 看类的结构,看类中有哪些属性和方法供调用
// Application Program Interface
// 应用程序接口
// charAt(index) 根据索引获得对应的字符
String str6 = "hello world";
char char1 = str6.charAt(str6.length() - 1);
System.out.println(char1);
// 5 indexOf(char) 返回某个字符的索引值
int index = str6.indexOf('w');
System.out.println(index);
// 6 前缀 后缀 返回值为boolean
boolean isStart = str6.startsWith("heli");
boolean isEnd = str6.endsWith("orld");
System.out.println(isStart + "==="+isEnd);
// 7 拼接 concat
// String str7 = "laosun" + " is a handsome man";
String str7 = str6.concat(" this is a java ");
System.out.println(str7);
// 8 截取 substring
String subStr1 = str7.substring(5);
String subStr2 = str7.substring(5, 15);
System.out.println(subStr1+"---"+subStr2);
// 9 替换 replace 返回一个String
String replaceStr = str7.replace("java", "C++");
System.out.println(replaceStr);
// 10 分割 split String[]
// 开发过程中:分割URL,文件地址C:/zhiyou/java/a.txt
String[] splitArr = str7.split(" ");
for (String string : splitArr) {
System.out.println(string);
}
String packageStr = "com.zhiyou.string.laosun.demo";
// \\. 代表.符号
String[] array = packageStr.split("\\.");
System.out.println(array.length);
for (String string : array) {
System.out.println("----"+string);
}
// 11 trim 去除字符串两边的空格
System.out.println(" lao sun ".trim());
// 注意:trim去除的是半角的空格,对于全角的空格(Unicode为12288)是无效的,
// 解决 方法是先用半角的空格替换,然后再用trim方法
// 12 向上向下取整
System.out.println(str7.toUpperCase());
System.out.println(str7.toLowerCase());
char spaceCh = 12288;//全角空格
char spaceCh1 = 32; //半角空格
String laosunStr = spaceCh +"laosun"+spaceCh1;
System.out.println(laosunStr.length());
System.out.println("++++"+laosunStr.trim()+"++++");
String newLaosunStr = laosunStr.replace(spaceCh, spaceCh1);
System.out.println("++++"+newLaosunStr.trim()+"++++");
}
}