java学习初探九之String

一、String简介
1.String类是不可变类,也就是说,String对象声明后,将不可修改。
2.提升字符串的访问效率,在程序中使用了“缓存”技术。所以,在java中所有使用“双引号”括起来的字符串都会在“字符串常量池”中创建一份,字符串常量池在方法区中被存储。
3.在执行过程中,如果程序用到某个字符串,例如“abc”,那么程序会在字符串常量池中去搜索该字符串,如果程序没有找到则在字符串常量池中新建一个“abc”的字符串,如果找到,就直接拿过来用。字符串常量池是一个缓存区,为了提高访问字符串的效率。

package com.array;
public class StringTest01 {
    public static void main(String[] args) {
        //创建一个“abc”字符串对象,该对象内存地址,由s1变量保存。
        //s1是一个引用,s1指向abc对象
        String s1="abc";
        //可以让s1重新指向吗.s1是局部变量,s1前面没有final,所以s1可以重新指向
        //但是def字符串本身不可以变
        s1="def";

        String s2="Hello";//在字符串常量池中新建一个“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 com.array;
/*
 * 分析以下程序创建字符串对象的区别
 */
public class StringTest02 {
    public static void main(String[] args) {
        String s1="abc";//只会在字符串常量池中创建一个1个“abc”字符串对象
        String s2=new String("hello");//会在字符串常量池中创建一个“hello”字符串对象,并且会在堆中再创建一个字符串对象。这种方式比较浪费内存
    }
}

这里写图片描述

三、
(1)

package com.array;

public class StringTest03 {
    public static void main(String[] args) {
        //判断以下程序创建了几个对象
        //堆中2个,字符串常量池中1个。
        String s1=new String("hello");
        String s2=new String("hello");
    }
}

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

package com.array;

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);
    }
}

四、字符串常用方法
(1)常用构造方法

package com.array;

public class StringTest05 {

    public static void main(String[] args) {
        //1.
        String s1="abc";
        //2.
        String s2=new String("abc");
        //3.
        byte[] by= {97,98,99,100};
        String s3=new String(by);
        System.out.println(s3);//abcd String已经重写了Object中的toString方法
        //4.
        String s4=new String(by, 1, 2);
        System.out.println(s4);//bc
        //5.
        char[] c1= {'我','是','中','国','人'};
        String s5=new String(c1);
        System.out.println(s5);//我是中国人
        //6.
        String s6=new String(c1, 2, 2);
        System.out.println(s6);//中国 
    }
}

(2)

package com.array;

public class StringTest06 {

    public static void main(String[] args) {
        //1.char charAt(int index);
        char c1="abcdef".charAt(2);
        System.out.println(c1);//c

        String s1="我是王勇,是坏人!";
        char c2=s1.charAt(2);
        System.out.println(c2);//王

        //2.boolean endsWith(String endStr) 以某个字符串结尾
        System.out.println("Hellomyword.java".endsWith("java"));//true

        //3.boolean equalsIgnoreCase(String anotherString) 相等判断并忽略大小写
        System.out.println("abc".equalsIgnoreCase("AbC"));//true

        //4.byte[] getBytes();
        byte[] bytes="abc".getBytes();
        for(int i=0;i<bytes.length;i++) {
            System.out.println(bytes[i]);
        }//97 98 99

        //5.int indexOf(String str) 子字符串第一次出现在字符串中的索引
        System.out.println("http://192.168.1.100:8080/oa/index.jsp".indexOf("/oa"));//25

        //6.int indexOf(String str,int fromIndex)
        System.out.println("javaoraclec++javavb".indexOf("java",1));//13

        //7.int lastIndexOf(String str) 最后一次出现的索引
        System.out.println("javaoraclec++javavb".lastIndexOf("java"));//13

        //8.int lastIndexOf(String str,int fromIndex)//反向搜索 第一次出现的索引
        System.out.println("javaoraclec++javavb".lastIndexOf("java",1));//0

        //9.int length() 数组是length属性,String是length()方法
        System.out.println("abc".length());//3

        //10 String replaceAll(String s1,String s2);
        System.out.println("javaoraclec++javavb".replaceAll("java", "mysql"));//将字符串中java用mysql替换,这个程序创建4个字符串对象

        //11 String[] split(String s)字符分割
        String myTime="2008,08,08";
        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 beginIndex, int endIndex); 前包括,后不包括
        System.out.println("/oa/login.action".substring(4, 9));//login

        //15 char[] toCharArray()
        char[] c3="我是李海波".toCharArray();
        for (int j = 0; j < c3.length; j++) {
            System.out.println(c3[j]);
        }

        //16.转换成大写 toUpperCase()
        System.out.println("abcdEFg".toUpperCase());//ABCDEFG

        //17转换成小写
        System.out.println("abcdEFg".toLowerCase());//abcdefg

        //18.String trim(); 去除前后空白
        System.out.println("      ab   effg   ".trim());//ab   effg

        //19.String valueOf(Object obj)
        Object o=new Object();
        o=null;
        //System.out.println(o.toString());//这个会出现空指针异常
        System.out.println(o);//null 不会,因为并不是直接调用toString方法,String.valueOf(o)这个方法对空值进行处理了
        System.out.println(String.valueOf(o));//null    
    }
}

五、正则表达式
1.正则表达式是一门独立的学科
2.正则表达式是一字符模型,专门做字符串匹配的。
3.正则表达式是通用的
例如:正则表达式”^a{2}$” 表示两个a字符,等同于”aa”
matches(String regex)//是否匹配给定的正则表达式
replaceAll(String regex,String replacement)
\d 数字
\D 非数字
\w 引文字母
\W 非英文字母

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值