一、String简介
1.String类是不可变类,也就是说,String对象声明后,将不可修改。
2.提升字符串的访问效率,在程序中使用了“缓存”技术。所以,在java中所有使用“双引号”括起来的字符串都会在“字符串常量池”中创建一份,字符串常量池在方法区中被存储。
3.在执行过程中,如果程序用到某个字符串,例如“abc”,那么程序会在字符串常量池中去搜索该字符串,如果程序没有找到则在字符串常量池中新建一个“abc”的字符串,如果找到,就直接拿过来用。字符串常量池是一个缓存区,为了提高访问字符串的效率。
package com.array;
public class StringTest01 {
public static void main(String[] args) {
//创建一个“abc”字符串对象,该对象内存地址,由s1变量保存。
//s1是一个引用,s1指向abc对象
String s1="abc";
//可以让s1重新指向吗.s1是局部变量,s1前面没有final,所以s1可以重新指向
//但是def字符串本身不可以变
s1="def";
String s2="Hello";//在字符串常量池中新建一个“Hello”字符串对象,该对象不可变。
String s3="Hello";//从字符串常量池中直接拿来用
System.out.println(s2==s3);//true
//比较两个字符串是否相等,不能用"=="
String s4=new String("abc");
String s5=new String("abc");
System.out.println(s4==s5);//false
//比较两个字符串是否一致,必须使用String类提供的equals方法
System.out.println(s4.equals(s5));//true
//以下程序执行结束之后,会在字符串常量池中创建3个字符串对象
//"aaa" "bbb" "aaabbb"
String s6="aaa";
String s7="bbb";
String s8=s6+s7;
}
}
二、分析以下程序创建几个对象
package com.array;
/*
* 分析以下程序创建字符串对象的区别
*/
public class StringTest02 {
public static void main(String[] args) {
String s1="abc";//只会在字符串常量池中创建一个1个“abc”字符串对象
String s2=new String("hello");//会在字符串常量池中创建一个“hello”字符串对象,并且会在堆中再创建一个字符串对象。这种方式比较浪费内存
}
}
三、
(1)
package com.array;
public class StringTest03 {
public static void main(String[] args) {
//判断以下程序创建了几个对象
//堆中2个,字符串常量池中1个。
String s1=new String("hello");
String s2=new String("hello");
}
}
(2)使用String的时候我们应该注意的问题:尽量不要做字符串频繁的拼接操作。因为字符串一旦创建不可改变,只要频繁拼接,就会在字符串常量池中创建大量的字符串对象,给垃圾回收带来问题。
package com.array;
public class StringTest04 {
public static void main(String[] args) {
String[] ins= {"sport","music","food","sleep"};
//要求将上面的兴趣爱好拼成成字符串"sport,music,food,sleep"
String temp="";
for(int i=0;i<ins.length;i++) {
if(i==ins.length-1) {
temp += ins[i];
}else {
temp += ins[i]+",";
}
}
System.out.println(temp);
}
}
四、字符串常用方法
(1)常用构造方法
package com.array;
public class StringTest05 {
public static void main(String[] args) {
//1.
String s1="abc";
//2.
String s2=new String("abc");
//3.
byte[] by= {97,98,99,100};
String s3=new String(by);
System.out.println(s3);//abcd String已经重写了Object中的toString方法
//4.
String s4=new String(by, 1, 2);
System.out.println(s4);//bc
//5.
char[] c1= {'我','是','中','国','人'};
String s5=new String(c1);
System.out.println(s5);//我是中国人
//6.
String s6=new String(c1, 2, 2);
System.out.println(s6);//中国
}
}
(2)
package com.array;
public class StringTest06 {
public static void main(String[] args) {
//1.char charAt(int index);
char c1="abcdef".charAt(2);
System.out.println(c1);//c
String s1="我是王勇,是坏人!";
char c2=s1.charAt(2);
System.out.println(c2);//王
//2.boolean endsWith(String endStr) 以某个字符串结尾
System.out.println("Hellomyword.java".endsWith("java"));//true
//3.boolean equalsIgnoreCase(String anotherString) 相等判断并忽略大小写
System.out.println("abc".equalsIgnoreCase("AbC"));//true
//4.byte[] getBytes();
byte[] bytes="abc".getBytes();
for(int i=0;i<bytes.length;i++) {
System.out.println(bytes[i]);
}//97 98 99
//5.int indexOf(String str) 子字符串第一次出现在字符串中的索引
System.out.println("http://192.168.1.100:8080/oa/index.jsp".indexOf("/oa"));//25
//6.int indexOf(String str,int fromIndex)
System.out.println("javaoraclec++javavb".indexOf("java",1));//13
//7.int lastIndexOf(String str) 最后一次出现的索引
System.out.println("javaoraclec++javavb".lastIndexOf("java"));//13
//8.int lastIndexOf(String str,int fromIndex)//反向搜索 第一次出现的索引
System.out.println("javaoraclec++javavb".lastIndexOf("java",1));//0
//9.int length() 数组是length属性,String是length()方法
System.out.println("abc".length());//3
//10 String replaceAll(String s1,String s2);
System.out.println("javaoraclec++javavb".replaceAll("java", "mysql"));//将字符串中java用mysql替换,这个程序创建4个字符串对象
//11 String[] split(String s)字符分割
String myTime="2008,08,08";
String[] ymd =myTime.split(",");
for (int i = 0; i < ymd.length; i++) {
System.out.println(ymd[i]);
}
//12 boolean startWith(String s)
System.out.println("/system/login.action".startsWith("/"));//true
//13 String substring(int begin)
System.out.println("/oa/login.action".substring(3));//login.action
//14 String substring(int beginIndex, int endIndex); 前包括,后不包括
System.out.println("/oa/login.action".substring(4, 9));//login
//15 char[] toCharArray()
char[] c3="我是李海波".toCharArray();
for (int j = 0; j < c3.length; j++) {
System.out.println(c3[j]);
}
//16.转换成大写 toUpperCase()
System.out.println("abcdEFg".toUpperCase());//ABCDEFG
//17转换成小写
System.out.println("abcdEFg".toLowerCase());//abcdefg
//18.String trim(); 去除前后空白
System.out.println(" ab effg ".trim());//ab effg
//19.String valueOf(Object obj)
Object o=new Object();
o=null;
//System.out.println(o.toString());//这个会出现空指针异常
System.out.println(o);//null 不会,因为并不是直接调用toString方法,String.valueOf(o)这个方法对空值进行处理了
System.out.println(String.valueOf(o));//null
}
}
五、正则表达式
1.正则表达式是一门独立的学科
2.正则表达式是一字符模型,专门做字符串匹配的。
3.正则表达式是通用的
例如:正则表达式”^a{2}$” 表示两个a字符,等同于”aa”
matches(String regex)//是否匹配给定的正则表达式
replaceAll(String regex,String replacement)
\d 数字
\D 非数字
\w 引文字母
\W 非英文字母