String类

String类

  • String的两种实例化方式

            直接赋值(用的最多)

                String str=“Hello”;

            传统方法,实例化对象

                String str=new String("Hello");

  • 字符串相等比较

            str.equals(str1);   //比较的是内容

            public boolean equals(String str1)

  • 字符串常量是String类的匿名对象

            tips:在指定内容比较时,将指定内容(字符串常量)写在前面,避免NullPointException

          javaSE三个特殊的类 -- String类

 

面试题:请解释String类“==”与“equals”的区别

  1. “==”:进行的是数值比较,比较的是两个字符串对象的内存地址数值

  2. 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类中两种对象实例化的区别

  1. 直接赋值 就会自动采用共享模式,只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。

  2. 构造方法 就会开辟两块堆内存空间并且其中一块堆内存将成为垃圾空间,不会自动保存在对象池中,可以使用intern()方法手工入池。

        javaSE三个特殊的类 -- String类

  • 字符串常量不可变更

            字符串常量一旦定义不可改变

范例:观察如下代码

String str = "hello" ;         
str = str + " world" ;        
str += "!!!" ;      
System.out.println(str); // hello world!!!

以上字符串变更是字符串对象变更非字符串常量

内存中的字符串修改如下图所示:

javaSE三个特殊的类 -- String类

可以发现字符串上没有发生变化,但是字符串对象的引用一直在改变,并且形成了大量垃圾空间。正是因为 String的特点,所以如下代码不应该在你的开发中出现:

String str = "hello" ;         
for(int x = 0 ; x<1000 ; x++) {           
        str += x ;        
 }       
System.out.println(str)

如果有很多用户都使用了同样的操作,那么产生的垃圾数量就相当可观了。

字符串使用原则

  1. 字符串使用就采用直接赋值

  2. 字符串比较就使用equals()实现

  3. 字符串不要改变太多,防止产生过多垃圾空间

  • 字符与字符串  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;
    }
}

 

相关文章: