1.什么是Java中的字符串
字符串String并不是一种数据类型,而是一个类对象,在java.lang包中,只不过在默认情况下java都是自动导入的,所以可以直接使用
创建一个String对象的方法有两种
1.直接给变量赋值一个字符串,常用的一种方式
String s1 = “immoc”;//字符串用双引号,单引号的是char
2.另一种方式是通过new String()方法
String s2 = new String();//创建一个空字符串对象
String s3 = new String(“Welcome”);
2.字符串的不变性
String对象创建之是不能够修改的,所有的修改在本质上都是创建了一个新的对象而已
先看一个例子:
String s1 = "hello"; String s2 = "hello"; String s3 = new String("hello"); String s4 = new String("hello"); System.out.println(s1==s2);//true System.out.println(s1==s3);//false System.out.println(s3==s4);//false s1 = "rocco: "+s1; System.out.println(s1);//cenyu:hello
解释一下:
1.通过String s1=”hello”;这种方法创建一个s1字符串,此时,局部变量s1是保存在栈中,String是一个引用数据类型,所以s1保存的实际是常量hello所在的内存地址。而hello是存放在堆内存中。
2.s1和s2都是引用类型,且引用的值是相同的,这个值引用已经保存在堆内存中的hello,即两个变量引用的是同一个位置的值,所以用s1==s2可以得出true
3.s3和s4的方式是通过创建一个对象来赋值,此时s3和s4是两个不同的对象,值也就放在不同的对象中,所以这两个也是不想同的。
4.最后当s1 = “rocco: “+s1;并不是再hello的位置上进行修改hello,而是把”hello”+s1的值重新放在一个位置,然后用s1重新引用这个值,原来的hello并不会影响
3.String类的常用方法
常用方法如下:
代码:
1 import java.util.Arrays; 2 3 /** 4 * 5 * 测试String的方法 6 */ 7 public class TestString { 8 public static void main(String[] args) { 9 String str = "abcdefaa"; 10 //str.length()返回当前字符串的长度 11 System.out.println(str.length()); //8 12 //str,indexOf("bc"),返回b开始的索引 13 System.out.println(str.indexOf("bc"));//1 14 //返回在字符串中最后一次出现的索引位置 15 System.out.println(str.lastIndexOf("a"));//7 16 //返回从索引位置从3开始到最后的字符串 17 System.out.println(str.substring(3));//defaa 18 //返回从索引3开始到5结束的字符串 19 System.out.println(str.substring(3,5));//de 20 //清空字符串前后空格,返回 21 System.out.println(" aa ".trim());//aa 22 //将字符与指定对象比较,返回false或true 23 System.out.println(str.equals("aa"));//false 24 //将字符串转为小写 25 System.out.println("ABCDEF".toLowerCase());//abcedf 26 //将字符串转为大写 27 System.out.println("abcdef".toUpperCase());//ABCDEF 28 //取字符串指定位置的字符 29 System.out.println(str.charAt(0));//a 30 //按照给定的方法分割成数组,后一个参数是第几个结束,第6个下标是5 31 System.out.println(Arrays.toString(str.split("",6)));//[a, b, c, d, e, faa] 32 33 } 34 }
==和equals()的区别
==:判断两个字符串在内存中的地址是否相同,即判断是否是同一个字符串对象
equals:比较存储在两个字符串对象中的内同是否一致,即值的是否相等
4.Java中的StringBuilder类
原本String是不可改变的一个对象,所以java提供了两个子类来操作String来操作对象。是StringBuffer和Stringbuilder这两个类。下面我们比较一个这两个类
StringBuffer:提供线程安全,效率低
StringBuilder:不提供线程安全,效率高
这两个类提供的方法一样,所以我们通常是使用效率较高的StringBuilder类
StringBuilder提供的方法:
1.初始化一个字符串对象
StringBuilder str = new StringBuilder()
2.追加方法,追加内容到当前对象的末尾
StringBuilder append(参数)
3.插入方法,将内容插入到对象的指定位置
StringBuilder insert(位置,参数)
4.将StringBuilder转化为String对象
String toString()
5.获取字符串的长度
int length()
1 /** 2 * 测试StringBuiler类方法 3 */ 4 public class TestStringBuilder { 5 public static void main(String[] args) { 6 //初始化一个空值 7 StringBuilder str = new StringBuilder(); 8 //初始化一个普通字符串 9 StringBuilder str1 = new StringBuilder("Hello,"); 10 System.out.println(str1);//Hello, 11 //追加方法 12 str1.append("World!"); 13 System.out.println(str1);//Hello,World! 14 //插入方法 15 str1.insert(3,"ABC"); 16 System.out.println(str1);//HelABClo,World! 17 18 String str2 = str1.toString(); 19 } 20 }
需要注意的是,这里的方法都是在原地址修改,修改之后再引用就是修改之后的值。
改变之后再使用toSting方法转换成String类型