Java:关于字符串。

一、关于String类

String实际上与System类和Scanner类一样,都是Java库中一个预定义的类,String类是final的,不可被继承的。String类不是基本数据类型,而是引用类型。
String类是通过char数组来保存字符串的,所以String一旦创建也是不可改变的。char类型只能表示一个字符。
字符串是一种不可变对象,它的内容不可改变。
String类的内部实现也是基于 char[] 来实现的,但是 String 类并没有提供 set 方法之类的来修改内部的字符数组。

那么如果实在需要修改字符串, 有如下方法:
a) 常见办法:借助原字符串, 创建新的字符串

String str = “Hello”;
str = “h” + str.substring(1);
System.out.println(str);
// 执行结果
hello

b) 特殊办法:使用 “反射” 这样的操作可以破坏封装,访问一个类内部的 private 成员。

String str = “Hello”;
Field valueField = String.class.getDeclaredField(“value”);
// 将这个字段的访问属性设为 true
valueField.setAccessible(true);
// 把 str 中的 value 属性获取到.
char[] value = (char[]) valueField.get(str);

// 修改 value 的值
value[0] = ‘h’;
System.out.println(str);
// 执行结果
hello

二、字节,字符与字符串

字符串内部包含一个字符数组,String 可以和 char[] 相互转换。
1、字符与字符串

//字符串与字符数组的转换
    public static void main(String[] args) {
        String str = "hello world";
        //字符串变为字符数组
        char[] data = str.toCharArray();
        for (int i = 0;i < data.length;i++){
            System.out.println(data[i]+" ");
        }
        //字符数组转为字符串
        System.out.println(new String(data));//全部转换
        System.out.println(new String(data,5,5));//部分转换
    }

    //类型:普通。    取得指定索引位置的字符,索引从0开始。
    public static void main1(String[] args) {
        String str = "hello world";
        System.out.println(str.charAt(0));
    }

2、字节与字符串
字符串内部包含一个字符数组,String 可以和 char[] 相互转换。

   //实现字符串与字节数组的转换
   public static void main3(String[] args) {
       String str = "hello world";
       //String转byte[]
       byte[] data = str.getBytes();
       for(int i = 0;i <data.length;i++){
           System.out.println(data[i]+" ");
       }
       //byte[]转String
       System.out.println(new String(data));
   }

三、关于字符串的常见操作方法

1、字符串的比较

//比较两个字符串大小关系
    public static void main(String[] args) {
        String str1 = "hello";
        String str2 = "Hello";
        System.out.println("A".compareTo("a"));//小于
        System.out.println("a".compareTo("A"));//大于
        System.out.println("A".compareTo("A"));//相等,返回0
    }
    
    //关于区不区分大小写的比较
    public static void main4(String[] args) {
        String str1 = "hello";
        String str2 = "Hello";
        System.out.println(str1.equals(str2));//false 区分大小写的比较
        System.out.println(str2.equalsIgnoreCase(str2));//true 不区分大小写的比较
    }

2、字符串查找

//判断开头或结尾
    public static void main(String[] args) {
        String str = "**@@hello world!!";
        System.out.println(str.startsWith("**"));//true
        System.out.println(str.endsWith("!!"));//true
    }
    
    //关于indexOf
    public static void main8(String[] args) {
        String str = "hello world";
        System.out.println(str.indexOf("l"));//2 只能返回查找的第一个位置
        System.out.println(str.indexOf("l",5));//从下标为5的地方开始查找
        System.out.println(str.lastIndexOf("l"));//8  从后向前查找
    }
    
    //从头开始查找指定字符串的位置,查到了返回位置的开始索引,如果查不到返回-1
    public static void main7(String[] args) {
        String str = "hello world";
        System.out.println(str.indexOf("world"));//5
        System.out.println(str.indexOf("our"));//-1
        if (str.indexOf("hello") != -1){
            System.out.println("可以查到指定字符串");
        }
    }
    
    //判断一个字符串是否存在
    public static void main6(String[] args) {
        String str = "hello world";
        System.out.println(str.contains("hello"));//true
    }

3、字符串替换

  //字符串的替换处理
    public static void main(String[] args) {
        String str = "hello world";
        System.out.println(str.replaceAll("l","_"));//替换所有
        System.out.println(str.replaceFirst("l","_"));//替换首个内容
    }

4、字符串拆分

//将字符串部分拆分,该数组长度就是limit极限
    public static void main(String[] args) {
        String str = "welcome to our shool";
        String[] result = str.split(" ",3);
        for (String s:result) {
            System.out.println(s);
        }
    }
    
    //将字符串全部拆分
    public static void main2(String[] args) {
        String str = "welcome to our shool";
        String[] result = str.split(" ");//按照空格拆分
        for (String s:result) {
            System.out.println(s);
        }
    }
  //多次拆分
    public static void main(String[] args) {
        String str = "name=zhuyilong&age=32";
        String[] result = str.split("&");
        for (int i = 0;i < result.length;i++){
            String[] tmp = result[i].split("=");
            System.out.println(tmp[0]+"="+tmp[1]);
        }
    }

5、字符串截取

//字符串截取:前闭后开区间的写法,substring(0,5)表示包含0号下标的字符,不包含5号下标
    public static void main(String[] args) {
        String str = "helloworld";
        System.out.println(str.substring(5));//从指定索引截取到结尾
        System.out.println(str.substring(0,5));//截取部分内容
    }

6、其他操作方法

public static void main2(String[] args) {
        String str = "hello%##@@world嘿嘿~";
        //关于isEmpty()方法
        System.out.println("hello".isEmpty());//false
        System.out.println(new String().isEmpty());//true
        //长度
        System.out.println(str.length());
        //大小写转换:只转换字母
        System.out.println(str.toLowerCase());
        System.out.println(str.toUpperCase());
    }

    //去掉字符串中的左右空格,保留中间空格
    public static void main1(String[] args) {
        String str = "  hello   world   ";
        System.out.println("["+str.trim()+"]");
        //trim会去掉字符串开头和结尾的空白字符(空格,换行,制表符等)
    }

四、 StringBuffer 和 StringBuilder

String的拼接会优化为StringBuilder append()
String和StringBuilder和StringBuffer的区别:
1、String的拼接会产生大量临时变量。StringBuilder和StringBuffer不会。(append返回的是一个this)
2、String拼接会被优化为StringBuilder的append()
3、String和StringBuilder一般用于单线程情况下,StringBuffer一般用于多线程。
3、后两者当中有一些方法是String不具备的。(如逆置方法等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值