字符串对象





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", "中"));
    }

}

 

posted @ 2020-08-16 23:27  Lerresino  阅读(326)  评论(0)    收藏  举报