String 类 与 StringBuffer类
1.String 类
String 变量名 = 字符串;
String 变量名 = new String (字符串)
String 变量名 = new String (字符数组)
当定义字符串常量的时候,jvm首先会在字符串常量池中,看有没有该字符串,通过equals 来确定是否有,如果存在,就将该字符串对象的引用返回给前面的定义字符串常量时的左边的变量,如果常量池中不存在就创建该对象,然后将对象的引用返回。
当使用new(使用构造函数的时候不是一般要在构造函数内放置一个值,来初始化对象嘛) 创建字符串对象时,jvm首先会在常量池中查找有没有该值的对象,如果有,就在堆中创建该对象,然后将堆中的对象的引用返回,而堆中的对象的值和常量池中的对象的值是同一个,如果没有,就在堆中和常量池中都创建一个对象,堆中的对象中的值和常量池中的对象的值相同,然后将堆中的对象的引用返回。
String c = new String("chenssy");
虽然c的内容是创建在堆中,但是他的内部value还是指向JVM常量池的chenssy的value,它构造chenssy时所用的参数依然是chenssy字符串常量。
String s0="helloworld";
String s1=new String("helloworld");
String s2="hello" + new String("world");
System.out.println("===========test4============");
System.out.println( s0==s1 ); //false
System.out.println( s0==s2 ); //false
System.out.println( s1==s2 ); //false
因为在编译的时候无法确定 s2 的值,安装s2的这种方式,会像 new String(“helloworld”) 一样在堆中创建一个新的对象然后返回,所以s0,s1,s2就全是不同的对象反之如果能在编译时确定值,那么该变量内存的是常量池中该对象的地址
String s = "4";
String s1 = "1" + s;// 这样也无法在编译时确定;
如果
final String s = "4";
String s1 = "1" + s;//是可以在编译时确定的
String 类型与C++中的string 类似
字符串的基本操作:
解释 | 函数格式 |
---|---|
1.字符串的长度 | int lengh() |
2.字符串的第index 个字符 | char charAt(int index-1) // 下标是从0开始的 |
3.指定字符第一次出现处的索引 | int indexOf(int ch) 这里 int ch 是 输入字符的对应的ASCII码 |
4.指定字符最后一次出现处的索引 | int lastIndexOf(int ch) 这里 int ch 是 输入字符的对应的ASCII码 |
5.指定子字符串第一次出现处的索引 | int indexOf(String ch) |
6.指定子字符串最后一次出现处的索引 | int lastIndexOf(Stringch) |
字符串的转换操作
解释 | 函数格式 |
---|---|
1.将字符串转换为字符数组 | char [] toCharArray() |
2.String 中的字符全部转换为小写 | String toLowerCase() |
3.String 中的字符全部转换为大写 | String toUpperCase() |
4.返回参数的字符串表示形式 | static String valueOf(int i) |
字符串的替换和去除空格操作
解释 | 函数格式 |
---|---|
1.去除字符串两端的空格的函数 | String trim() |
2.替换函数可以达到这个目的 | String replace(CharSequence oldstr,CharSequence newstr) 用newstr换oldstr |
字符串的判断操作
解释 | 函数格式 |
---|---|
1.判断是否是以指定字符串开头 | boolean startsWith(string s) |
2.判断是否是以指定字符串结尾 | boolean endsWith(string s) |
3.判断是否存在指定字符串 | boolean contains(CharSequence cs) |
4.判断字符串是否为空 | boolean isEmpty() |
5.判断两个字符串是否相等 | boolean equals(Object s) |
字符串的比较可以通过 == 和 equals()两种方式进行,不过 == 比较的是两个字符串的地址是否一样而 equals() 比较的是两个字符串中的字符值是否相等
字符串的截取与分割
解释 | 函数格式 |
---|---|
1.从数字a起始的角标开始,直到此字符串的末尾的所有字符 | String substring (int a) |
2.从数字a起始到数字b-1结束 | String substring (int a,int b) |
3.根据参数将字符串分割为若干个子字符串 | String [] split(String regex) |
2.StringBuffer 类
StringBuffer类与String类的区别
String 类是 final 类型的,所以其一旦创建就不能改变其内容和长度,String 对象可以用 + 连接, 并且重写了 Object 类中的equals()方法,StringBuffer类也称字符串缓冲区,类似于一个字符串容器,可以改变其内容,而StringBuffer 不能用+连接,且不能用equals()方法
创建方法和类对象的创建差不多
常用方法:
解释 | 函数格式 |
---|---|
1.添加字符到StringBuffer对象中末尾 | StringBuffer append(char c) |
e.g : StringBuffer sb = new StringBuffer(); sb.append("123"); 即可
解释 | 函数格式 |
---|---|
2.在a位置插入字符串 | StringBuffer inser(int a,String str) |
e.g: sb.insert(3,"45"); sb = "12345";
解释 | 函数格式 |
---|
3.移除指定位置的字符串 StringBuffer deleteCharAt(int index)
e.g: sb.delete(0) ; sb = "2345";
解释 | 函数格式 |
---|---|
4.将指定范围的字符或字符串用字符串s进行替换 | StringBuffer replace(int start,int end, String s) |
e.g: sb.replace(2,4,'AB'); sb = "23AB";
解释 | 函数格式 |
---|---|
5.修改指定位置a 处的字符,修改为A | void setCharAt(int a, char A) |
e.g: sb.setCharAt(2,'4'); sb = "234B";
解释 | 函数格式 |
---|---|
6.返回StringBuffer缓冲区中的字符串对象 | String toStirng() |
7.将此StringBuffer对象用其反转形式取代 | StringBuffer reverse() |
补充:
与StringBuffer 功能相似的 StringBuilder ,方法基本相同,不过仍有差距StringBuffer 是线程安全的,而StringBuilder 则不是,如果创建一个内容可变的字符串对象,应该优先考虑StringBuilder 类