第二十三节(String,StringBuffer,基础类型对应的 8 个包装类,日期相关类、 Random 数字 ,Enum枚举)下

/*
    java.lang.String 是字符串类型
    
    注意:只要采用双引号赋值字符串,那么在编译期将会放到方法区中的字符串的常量池里, 
            如果是运行时对字符串.加或相减会放到堆中(放之前会先验证方法区中是否含有
            相同的字符串常量,如果存在,把地址返回,如果不存在,先将字符串常量放到池中,然
            后再返回该对象的地址
    
*/
public class StringTest01{

    // java的入口
    public static void main(String[] args){
        
        // 创建一个“abc”字符串对象,该对象的内存地址,让a1变量来保存
        // a1 是一个引用,a指向“abc”对象
        String a1 = "abc";
        
        // a1是一个局部变量,a1前边没有final,所以a1可以重新指向
        // 但是 "abcd" 字符串本身是不可变
        a1 = "abcd";
        
        System.out.println("字符串为:"+a1);
        
        String a2 = "Ming"; // 在字符串常量池中新建一个“Arry”字符串对象,该对象是不可变的
        String a3 = "Ming"; // 从字符串常量池中直接拿来用
        
        System.out.println(a2 == a3);  // true
        
        // 比较两个字符串是否相等,不能用“==”,
        String a4 = new String("ming");
        String a5 = new String("ming");
    
        System.out.println(a4 == a5); // 
        
        // 比较两个字符串是否一致,必须使用String类型提供的equals方法
        System.out.println(a4.equals(a5)); // true
        
        
        String s1 = "a";
        
        String s2 = "b";
        
        s1 = s1 + s2
    
    }
}
/*
    普通字符串的声明和创建字符串对象的区别
    
        1. String a1 = "arry"; 只会在字符串常量池中创建一个“arry”字符串对象
        2. String a2 = new String("arry"); 会在字符串的常量池中创建一个“arry”字符串对象
        并且会在堆中再创建一个字符串对象
        
        第二种 方式比较浪费内存,常用第一种方式

*/
public class StringTest02{

    public static void main(String[] args){
        
        String a1 = "ming";
        
        String a2 = new String("ming");
        
    }
    
}
/*
    面试题:
        String a1 = new String("ming");
        String a2 = new String("ming");
        
        以上代码 创建了几个对象?    
        
        
*/
public class StringTest03{
    
    public static void main(String[] args){
        
        String a1 = new String("ming");
        String a2 = new String("ming");
        
        /*
            通过图形分析:
            
                1、 创建了3个对象,堆区中2个对象,常量池中1个
                
                建议:使用String的时候不建议使用new关键字,因为它会创建两个对象
                
                总结: 堆区中 试运行期分配的,常量池中是编译期分配的
        
        */
        
    }

}
/*
    使用String的时候注意的问题:
    
        尽量不要频繁的拼接操作,因为字符串一旦创建不可改变,只要频繁拼接,
        就会在字符串常量池中创建大量的字符串对象,给垃圾回收带来问题

*/
public class StringTest04{
    
    public static void main(String[] args){
        
        String[] s = {"sport","music","food","sleep"};
        
        //  需求: 将所有的兴趣爱好拼接成字符串“sport,music,food,sleep”;
        
        String temp = "";
        for(int i = 0; i < s.length; i++){
            if(i == s.length-1){
                temp += s[i];
            } else {
                temp += s[i]+",";
            }
        }
        
        System.out.println("拼接好的字符串:"+temp);
        
    }

}
/*
    字符串常用的构造方法

*/
public class StringTest05{
    
    public static void main(String[] args){
    
        String a1 = "ming";
        
        String a2 = new String("ming");
        
        byte[] bytes = {1,2,3,4};
        String a3 = new String(bytes);
        System.out.println(a3);
        
        
        String  a4 = new String(bytes,1,2);
        System.out.println(a4);
        
        char[] a5 = {'','','A'};
        String s = new String(a5);
        System.out.println(s);
        
        // 通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
        String a6 = new String(a5,2,1);
        System.out.println(a6);
        
        
    }

}

 

posted @ 2015-01-18 22:06  哥的笑百度不到  阅读(186)  评论(0编辑  收藏  举报