Fork me on GitHub

第12章 Java字符串

 

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类型

 

posted @ 2016-11-23 14:24  洋葱源码  阅读(326)  评论(0编辑  收藏  举报