1.String 类实例化方式
- 直接赋值:
String str = "Hello";
//str是一个对象,"Hello"应保存在堆内存中
System.out.println(str);
String类既是一个类,那么类中一定存在构造方法。
String类的其中一种构造方法如下:
public String(String str);
- 传统方法(构造法):
String str = new String("Hello");
System.out.println(str);
2.字符串相等比较
String类要想进行内容比较,就必须采用String类提供的equals方法。
eg:使用equals方法比较字符串内容
String str1 = "Hello ";
String str = new String("Hi");
System.out.println(str1.equals(str));
请解释String 类 == 与 equals 的区别:
3.String的匿名对象
任何的字符串常量都是String的匿名对象,所以该对象永远不会为null;
eg:观察字符串常量
String str1 = "Hello";
String str = new String("Hello");
System.out.println(str1.equals(str));
System.out.println("Hello".equals(str));
在进行比较时,强烈建议将字符串常量写在前面。避免如下情况:
Sting str = null;//假定由用户输入
System.out.println(str.equals("Hello"));
在进行接收用户输入数据的时候一定要考虑用户没有输入的问题,以上代码为例,用户没有输入时,一定会出现NullPointerException 问题。
4.实例化的区别
4.1采用直接赋值:
String str1 = "Hello";
String str2 = "Hello";
String str3 = "Hello";
System.out.println(str1 == str2);//true
System.out.println(str1 == str3);//true
System.out.println(str2 == str3);//true
在JVM底层实际上会自动维护一个对象池(字符串对象池),如果采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)将自动保存在这个常量池中。如果下次继续使用直接赋值的模式声明String类对象,此时对象池中若有指定内容,将直接进行引用;若没有,则开辟新的字符串对象而后将其保存在对象池之中以供下次使用。
所谓对象池就是一个对象数组(目的是减少开销)。
4.2采用构造方法
类对象使用构造方法实例化是标准做法,而使用构造方法实例化的对象不会自动入池。分析程序如下:
String str1 = new String("Hello");
String str2 = "Hello";
System.out.println(str1 == str2);//false
在String类中提供有方法入池操作:public String intern();
String str1 = new String("Hello").intern();
String str2 = "Hello";
System.out.println(str1 == str2);//true
请解释String类中俩种对象实例化的区别:
5.字符与字符串
字符串就是一个字符数组,所以在String类里面支持有字符数组转换为字符串以及字符串转变为字符的操作方法。
构造方法:
1.public String(char value[])
:将字符数组中的所有内容变为字符串。
2. public String(char value[],int offset,int count)
:将部分字符串数组中的内容变为字符串
普通方法:
1.public char charAt(int index)
:取得指定索引位置的字符,索引从0开始
2.public char[] toCharArray()
:将字符串变为字符数组返回
eg:字符串与字符数组的转换
String str = "helloworld";
char[] data = str.toCharArray();
for(int i = 0;i < data.length;i++){
data[i] -= 32;
System.out.println(data[i] +"、");
}
System.out.println(new String(data)); // 全部转换
System.out.println(new String(data,5,5)); //部分转换
6.字符串比较
6.1 区分大小写的比较:public boolean equals(Object anotherObject)
6.2不区分大小写的比较:
public boolean equalsIgnoreCase(String anotherString)
eg :
String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
6.3 比较俩个字符串大小关系
public compareTo(String anotherString)
eg:观察compareTo()比较:
System.out.println("A".compareTo("a")); // -32
System.out.println("a".compareTo("A")); // 32
System.out.println("A".compareTo("A")); // 0
System.out.println("AB".compareTo("AC")); // -1
7.字符串查找
eg:字符串查找,好用方便的就是contains()
String str = "helloworld" ;
System.out.println(str.contains("world")); // true
eg:使用indexOf()方法进行位置查找:
String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w开始的索引
System.out.println(str.indexOf("bit")); // -1,没有查到
if (str.indexOf("hello") != -1) {
System.out.println("可以查到指定字符串!");
}
使用indexOf()需要注意的是,如果内容重复,它只能返回查找的第一个位置
eg:判断开头或结尾
String str = "**@@helloworld!!" ;
System.out.println(str.startsWith("**")); // true
System.out.println(str.startsWith("@@",2)); // ture
System.out.println(str.endsWith("!!")); // true
8.字符串替换
使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:
8.1替换所有指定内容:
public String replaceAll(String regex,String replacement)
8.2替换首个内容
public String replaceFirst(String regex,String replacement)
eg:字符串替换处理
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_")); //he__owor_d
System.out.println(str.replaceFirst("l", "_"));//he_loworld
9.字符串拆分
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
可用方法如下:
9.1将字符全部拆分
public String[] split(String regex)
9.2将字符串部分拆分,该数组长度就是limit极限:
public String[] split(String regex,int limit)
eg:实现字符串的拆分处理
String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
System.out.println(s);
}
eg:字符串的部分拆分
String str = "hello world hello " ;
String[] result = str.split(" ",2) ;
for(String s: result) {
System.out.println(s);
}
eg:多次拆分
String str = "CYJ:20|SR:0701" ;
String[] result = str.split("\\|") ;
for (int i = 0; i < result.length; i++) {
String[] temp = result[i].split(":") ;
System.out.println(temp[0]+" = "+temp[1]);
}
// 输出:
CYJ = 27
SR = 0701
10.字符串截取
10.1从指定索引截取到结尾:
public Stirng substring(int beginIndex)
10.2 截取部分内容:
public String substring(int geginIndex,int endIndex)
eg:字符串截取
String str = "helloworld" ;
System.out.println(str.substring(5)); //world
System.out.println(str.substring(0, 5));//hello
11.其他操作方法
eg:观察trim()方法的使用
String str = " hello world " ;
System.out.println("["+str+"]"); //[ hello world ]
System.out.println("["+str.trim()+"]"); //[ hello world ]
eg:大小写转换:
String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.toUpperCase()); // HELLO%$$%@#$%WORLD 哈哈哈
System.out.println(str.toLowerCase()); // hello%$$%@#$%world 哈哈哈
eg:字符串length()
String str = "hello" ;
System.out.println(str.length()); // 5
eg:isEmpty()方法
System.out.println("hello".isEmpty()); // false
System.out.println("".isEmpty()); //true
System.out.println(new String().isEmpty());//true
String类并没有提供首字母大写操作,需要自己实现。
eg:首字母大写
public static void main(String[] args) {
System.out.println(fistUpper("selina"));
System.out.println(fistUpper(""));
System.out.println(fistUpper("a")); }
public static String fistUpper(String str) {
if ("".equals(str)||str==null) {
return str ;
}
if (str.length()>1) {
return str.substring(0, 1).toUpperCase()+str.substring(1) ;
}
return str.toUpperCase() ;
}