Java中定义了String和StringBuffer两个类来封装对字符串的各种操作,存放于java.lang包中,无需导入即可直接使用它们。
一、String对象的创建及初始化。
1.使用字符串常量直接初始化:
String s1 = "Hello world!";
这样的字符串严格来讲都是String类的匿名对象,对象名称s1保存在栈内存中,而字符串“Hello world!”保存在堆内存中。
通过引用传递创建字符串对象s2:
String s2 = s1;
在第一次定义字符串的时候,在堆内存中开辟一块空间,如果之后使用直接赋值或者引用传递创建新的对象,且此内容已经存在,就不会开辟新的堆内存,而让其指向了已有的字符串内容。
2.使用构造方法初始化:
String s3 = new String("Hello world!");
这种方法会开辟第二块堆内存空间,其中一块将会成为垃圾,无法实现自动入池操作。
在String类中提供了手工入池的方法:public String intern();
String s3 = new String("Hello world!").intern();
3.使用串联方式:
String s4 = "Hello"+" world!";
二、String内容的比较。
1.调用equals()方法:
String s = "Hello world!"; Boolean result = s.equals("Hello world!");
这个方法在之前已经提到过了,equals()比较字符串的内容,它会区分字符串的大小写,也有一种忽略大小写的方法:public boolean equalsIgnorecase();。
2.使用比较运算符“==”:
1 String s1 = "Hello world!"; 2 String s2 = "Hello world!"; 3 String s3 = new String("Hello world!"); 4 Boolean result1 = (s1==s2);//true 5 Boolean result2 = (s1==s3);//false
可以看出,“==”完成的是两个对象堆内存地址的判断,比较两个对象是否引用同一个实例,而不是真正意义上字符串内容的比较。
三、字符串一旦声明则不可改变。
String s = "Hello"; s = s + " world"; s = s + "!"; System.out.println(s);//Hello world!
从输出结果来看,字符串的内容被改变了,但实际上只是String类对象的引用改变了,开辟出额外的堆内存空间,造成大量字符串垃圾。
所以,在编程过程中应尽量避免多次修改字符串内容,以免出现大量的垃圾。
***Java中使用StringBuffer类或者StringBuilder类来改变字符串内容,且不会创建新的对象。
1 StringBuffer s = new StringBuffer("Hello"); 2 s.append(" world!");//在结尾追加内容 3 s.insert(6, "new ");//在指定位置插入内容 4 System.out.println(s);//Hello new world!
四、String类的常用方法。
在Java中,String类中定义了大量的操作方法,下面列出了常用的部分方法:
其他不再详细叙述了,仅用一个例子来大体概括它们的使用:
其他不再详细叙述了,仅用一个例子来大体概括它们的使用:
1 class Demo 2 { 3 String s = "Hello world!"; 4 public void chartest() 5 { 6 System.out.println("取出第5个字符:"+s.charAt(4));//取出字符串中第5个字符 7 } 8 public void Arraytest() 9 { 10 //字符串与字符数组相互转化 11 char data[] = s.toCharArray();//将字符串变为字符数组 12 for(int i=0;i<data.length;i++) 13 { 14 System.out.print(data[i]+"、"); 15 } 16 System.out.println(); 17 System.out.println(new String(data));//将字符数组变为字符串 18 System.out.println(new String(data,6,5));//从下标为6,即第7个字符开始取5个字符 19 } 20 public void intexOftest() 21 { 22 //查找指定子字符串的位置 23 System.out.println("找到,该字符串位置:"+s.indexOf("w"));//从前向后查找 24 System.out.println("找到,该字符串位置:"+s.indexOf("w",4));//从指定位置开始查找 25 } 26 public void containstest() 27 { 28 //判断某字符是否存在 29 System.out.println(s.contains("d")?"该字符存在":"该字符不存在"); 30 } 31 public void replacetest() 32 { 33 //字符串替换 34 System.out.println(s.replaceAll("l", "a"));//全部替换 35 System.out.println(s.replaceFirst("l", "a"));//替换首个 36 } 37 public void substringtest() 38 { 39 //字符串截取 40 System.out.println(s.substring(6));//截取指定位置到末尾 41 System.out.println(s.substring(0, 5)+"和"+s.substring(6,11));//截取指定范围 42 } 43 public void splittest() 44 { 45 //字符串拆分 46 String data[] = s.split("o");//按指定字符全拆分 47 for(String i:data) 48 { 49 System.out.println(i); 50 } 51 String data1[] = s.split("l", 4);//拆分为指定元素个数的字符数组 52 for(String j:data1) 53 { 54 System.out.println(j); 55 } 56 } 57 public void Casetest() 58 { 59 //大小写转换 60 System.out.println(s.toLowerCase());//小写 61 System.out.println(s.toUpperCase());//大写 62 } 63 } 64 public class Text{ 65 public static void main(String[] args) 66 { 67 Demo dm = new Demo(); 68 dm.chartest(); 69 dm.Arraytest(); 70 dm.intexOftest(); 71 dm.containstest(); 72 dm.replacetest(); 73 dm.substringtest(); 74 dm.splittest(); 75 dm.Casetest(); 76 } 77 }
wcf消息契约
iis部署wcf服务
WCF数据契约
wcf配置
wcf中的使用全双工通信
A股主要指数的市盈率(PE)估值高度
股票的历史市盈率查询PE
错误 Unable to find vcvarsall.bat 的终极无敌最完美的解决办法
A股最新的自由现金流和折现估值查询