![]()
![]()
![]()
package sString;
/*
* java.lang.String;是字符串类型。
* 1、字符串一且创建不可再改变。"abc"字符串对象一旦创建,不可再改变成"abcd"
*
* 2、提升字符串的访问效率:在程序中使用了缓存技术。所以在java中所有使用"双引号"括起来
* 的字符串都会在"字符串常量池"中创建一份。字符串常量池在方法区中被存储
*
* 3.在程序执行过程中,如果程序用到某个字符串,例如"abc",那么程序会在字符串常量池
* 中去搜索该字符串,如果没有找到则在字符串常量池中新建一个"abc"字符串,如果找到
* 就直接拿过来用。(字符串常量池是一个缓存区,为了提高访问字符串的效率)
*/
public class StringTest01 {
public static void main(String[] args) {
//创建一个"abc"字符串对象,该对象的内存地址,让s1变量保存
//s1指向内存地址,s1前面没有final,所以s1可以重新指向
String sl = "abc";
//可以让s1重新指向吗?s1是局部变量,s1前边没有final,所以s1可以重新指向。
//但是"def"字符串本身不可变
String s1 = "def";
String s2 = "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 sString;
/*
* 分析以下程序创建字符串对象的区别
*
* 1、String s1 = "abc";只会在字符串常量池中创建一个"abc"字符串对象
*
* 2、String s2 = new String("abc");
* 会在字符串常量池中创建一个"abc"字符串对象,并且会在堆中再创建一个字符串对象
*
* 第二种方式比较浪费内存,常用的是第一种方式
*/
public class StringTest02 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = new String("abc");
}
}
package sString;
/*
* 面试题
*/
public class StringTest03 {
public static void main(String[] args) {
//判断以下程序创建了几个对象?3个
//堆中2个
//方法区字符串常量池中1个
String s1 = new String("Hello");
String s2 = new String("Hello");
}
}
package sString;
/*
* 使用String的时候我们应该注意的问题:尽量不要做字符串频繁的拼接操作
* 因为字符串一旦创建不可改变,只要频繁拼接,就会在字符串常量池中创建
* 大量的字符串对象,给垃圾回收带来问题
*/
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);
}
}
package sString;
/*
* 关于字符串常用构造方式
*/
public class StringTest05 {
public static void main(String[] args) {
//1.
String s1 = "abc";
//2.
String s2 = new String("abc");
//3.
byte[] bytes = {97,98,99,100};
String s3 = new String(bytes);
System.out.println(s3); // abcd String已经重写了Object中的toString
//4.
String s4 = new String(bytes,0,2); //输出字符串的某一段(列表,开始,延续)
System.out.println(s4); //ab
//5.
char[] c1 = {'你','我','她'};
String s5 = new String(c1);
System.out.println(s5); //你我她
//6.
String s6 = new String(c1,2,2); //输出字符串的某一段(列表,开始,延续)
System.out.println(s6); //我
}
}
package sString;
/*
* 字符串常用的方法
*/
public class StringTest06 {
public static void main(String[] args) {
//1.char charAt(int index);
//返回指定索引处的char值
String s1 = "我是好人";
char c1 = s1.charAt(2);
System.out.println(c1); //好
//2.boolean endsWith(String endStr);
//判断字符串是否以某个字符串结尾
System.out.println("HelloWorld.java".endsWith("java")); //true
System.out.println("HelloWorld.java".endsWith("va")); //true
//3.boolean equalsIgnoreCase(String anotherString);
//一个字符串与另一个进行比较,不算大小写
System.out.println("abc".equalsIgnoreCase("ABC")); //true
//4.byte[] getBytes();
//列表每个字符转成byte数组
byte[] bytes = "abc".getBytes();
for(int i=0; i<bytes.length; i++){
System.out.println(bytes[i]); //979899
}
//5.int indexOf(String str);
//判断子字符串在此字符串第一次出现的索引
System.out.println("http://192.168.1.100".indexOf("1")); //7
//6.int indexOf(String str, int fromIndex);
//同上,比上面多加了一个结束的索引值
System.out.println("http://192.168.1.100".indexOf("1", 8)); //11
//7.int lastIndexOf(String str);
//从后往前找
System.out.println("http://192.168.1.100".lastIndexOf("1")); //17
//8.int lastIndexOf(String str, int fromIndex);
//同上,从指定的索引反向搜索
//9.int length();
//返回长度
System.out.println("abc".length()); //数组是length属性,String是length()方法
//10.String replaceAll(String s1,String s2);
//指定的换成新的
System.out.println("12123".replace("1", "6"));
//11.String[] split(String s);
//以某个字符串分隔
String myTime = "2020.08.06";
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 begin,int endIndex);
//同上,开始值,结束值(不包括)
System.out.println("/oa/login.action".substring(4,9)); //login
//15.char[] toCharArray();
//将此字符转转换成一个新的字符数组
char[] c2 = "我是好人".toCharArray();
for(int i = 0; i<c2.length; i++){
System.out.println(c2[i]);
}
//16.转换成大写
System.out.println("Abcd".toUpperCase()); //ABCD
//17.转换成小写
System.out.println("ABCD".toLowerCase()); //abcd
//18.String trim();
System.out.println(" a bc ".trim()); //a bc
//19.String.valueOf(Object obj);
Object o = null;
System.out.println(o); //不会,因为并不是直接调用toString方法,String valueOf(Object obj)这个方法对空值进行处理了。
System.out.println(String.valueOf(o));
//System.out.println(o.toString); 会出现空指针
}
}
package sString;
/*
* 正则表达式
*
* 1.正则表达式是一门独立的学科
* 2.正则表达式是一种字符模。专门做字符串格式匹配的
* 3.正则表达式是通用的
*
* 例如:正则表达式 "^a{2}$" 表示2个a字符,等同于"aa"
*
* \d 数字
* \D 非数字
* \w 英文
* \W 非英文字母
*/
public class StringTest07 {
public static void main(String[] args) {
String s1 = "asdd33dfds55dg11";
//将dd替换为“中”
System.out.println(s1.replaceAll("dd", "中"));
//将dd替换为“中”
System.out.println(s1.replaceAll("d{2}", "中"));
//将数字替换为“中”
System.out.println(s1.replaceAll("\\d", "中"));
//将非数字替换为“中”
System.out.println(s1.replaceAll("\\D", "中"));
}
}