String类
String类
-
String的两种实例化方式
直接赋值(用的最多)
String str=“Hello”;
传统方法,实例化对象
String str=new String("Hello");
-
字符串相等比较
str.equals(str1); //比较的是内容
public boolean equals(String str1)
-
字符串常量是String类的匿名对象
tips:在指定内容比较时,将指定内容(字符串常量)写在前面,避免NullPointException
面试题:请解释String类“==”与“equals”的区别
-
“==”:进行的是数值比较,比较的是两个字符串对象的内存地址数值
-
“equals()”:可以进行字符串内容的比较
-
String采用共享设计模式 在JVM底层自动维护一个字符串对象池(对象数组)。
如果采用直接赋值的模式进行String类的对象实例化操作,此对象将自动保存到对象池中,如果有,直接引用,如果没有,开辟新的空间将其保存到对象池中共下次使用;
对象池就是一个对象数组目的就是减少内存的开销
字符串手工入池操作:
public native String intern();
范例:
// 该字符串常量并没有保存在对象池之中
String str1 = new String("hello");
String str2 = "hello" ;
System.out.println(str1 == str2); // false
----------------------------------
----------------------------------
// 使用手动入池操作
String str1 = new String("hello").intern() ;
String str2 = "hello" ;
System.out.println(str1 == str2); // true
面试题:请解释String类中两种对象实例化的区别
-
直接赋值 就会自动采用共享模式,只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
-
构造方法 就会开辟两块堆内存空间并且其中一块堆内存将成为垃圾空间,不会自动保存在对象池中,可以使用intern()方法手工入池。
-
字符串常量不可变更
字符串常量一旦定义不可改变
范例:观察如下代码
String str = "hello" ;
str = str + " world" ;
str += "!!!" ;
System.out.println(str); // hello world!!!
以上字符串变更是字符串对象变更而非字符串常量
内存中的字符串修改如下图所示:
可以发现字符串上没有发生变化,但是字符串对象的引用一直在改变,并且形成了大量垃圾空间。正是因为 String的特点,所以如下代码不应该在你的开发中出现:
String str = "hello" ;
for(int x = 0 ; x<1000 ; x++) {
str += x ;
}
System.out.println(str)
如果有很多用户都使用了同样的操作,那么产生的垃圾数量就相当可观了。
字符串使用原则
-
字符串使用就采用直接赋值
-
字符串比较就使用equals()实现
-
字符串不要改变太多,防止产生过多垃圾空间
-
字符与字符串 String <-> char[]
1. 字符数组 char[]-> String
功能:将字符数组中所有内容变为字符串
构造函数为:public String ( char[] value1 ) ;
功能:将部分字符数组中的内容变为字符串
构造函数为:public String ( char[] value1, int offset, int count ) ;
2. String -> char
功能:将字符串按照索引转为单个字符
普通函数:public char charAt ( int index ) ;
如果使用charAt()方法超出了字符串长度,则会产生StringIndexOutOfBoundsException异常
3. String -> char[] *** 重点 ***
功能:将字符串转为字符数组
普通函数:public char[] toCharArray( ) ;
范例:
public class Test{
public static void main(String[] args){
String str = "helloworld" ;
// 将字符串变为字符数组
char[] data = str.toCharArray() ;
for (int i = 0; i < data.length; i++) {
data[i] -= 32 ;
System.out.print(data[i]+"、");
}
// 字符数组转为字符串
System.out.println(new String(data)); // 全部转换
System.out.println(new String(data,5,5)); // 部分转换
}
}
//输出
//H、E、L、L、O、W、O、R、L、D、HELLOWORLD
//WORLD
面试题:判断给定字符串是否由数字组成? *** 重要 ***
public class Test{
public static void main (String[] args){
String str="123";
boolean a=MyAdjust(str);
if(a==true){
System.out.println("字符串是由数字组成!");
}
else{
System.out.println("字符串中含有非数字成员!");
}
}
public static boolean MyAdjust(String str){
//将字符串转换为字符串数组
char[] data=str.toCharArray();
for(int i=0;i<data.length;i++){
if(data[i]<'0'||data[i]>'9'){
return false;
}
}
return true;
}
}