day0607--String类_副本

本文介绍了Java中String类的特性,包括字符串对象的不可变性、常用操作如编码解码、大小写转换、截取、拼接、替换、trim以及StringBuffer和StringBuilder的区别。还探讨了字符串常量池和内存管理对敏感数据的影响及最佳实践。
摘要由CSDN通过智能技术生成

day0607–String类_副本

  • jar是一种压缩方式,常用的引用类型

  • java.lang包 核心类 Math System

  • 字符串对象不可变

string常用类

  1. 字节数组

    
            byte[] bytes = str.getBytes();
            char[] chars = str.toCharArray();
    
    

    // 字符编码:人认识符号转换为计算机认识的字节数组形式/

  2. 字符解码

    Arrays.toString(bytes));
    Arrays.toString(chars)
    //        字符解码:字节转换为人认识的符号
    
  3. 大写

    String str2 = str.toUpperCase();
    
  4. 小写

    str.toLowerCase()
    
  5. 截取

    str.charAt(0)
    
    str.substring(7)
    str.substring(4, 7)[4,7)
    
    
  6. 字符串拼接

    会产生两个字符串对象

    str.concat("www")); 
    
  7. 替换

    str.replace("Sun", "www"));
    str.replaceAll("Sun", "WWW"));
    
    
  8. 去除空格 前后的

    str.trim()
    
  9. 切分,返回值是字符串数组

    String[] as = str.split("");
    System.out.println(Arrays.toString(as));
    
  10. 查找

    indexOf() 如果指定的字符/字符串 不存在 返回值都是 -1;-1表示找不到。首次出现索引

    str.indexOf('w')
    lastIndexOf 找不到 也是返回值是-1
    
    str.lastIndexOf("Son")
    
    
  11. 判断前缀

    str.startsWith("ja")
    
  12. 判断后缀

    str.endsWith("jav")
    
  13. 判断字符串内容相等

    str.equals(“java”)

    忽略大小写str.equalsIgnoreCase(“JAVA”))

    public boolean equals(Object anObject) {
    //先比较地址
            if (this == anObject) {
                return true;
            }
    //再比较内容        
            if (anObject instanceof String) {
                String aString = (String)anObject;
                if (coder() == aString.coder()) {
                    return isLatin1() ? StringLatin1.equals(value, aString.value)
                                      : StringUTF16.equals(value, aString.value);
                }
            }
            return false;
        }
    
  14. 比较

    compareTo返回值情况: 0:两个对象相等 正数:第一个对象大 负数:第二个对象大

    str.compareTo("jav")
    
    
/**
     * 常见的面试题
     */
    private static void method10() {
        String str1 = new String("java");
        String str3 = new String("java");
        String str2 = "java";
        String str4 = "java";
        String str5 = "javaSun";
//        +两边都是字符串常量,拼接后的字符串对象依然在运行时常量池中;
//       +两边一旦出现了变量, 拼接后的字符串对象临时放到一个缓冲区中 而不在运行时常量池中
        String str6 = str2 + "Sun"; //javaSun
        System.out.println(str1 == str3); //false
        System.out.println(str1.equals(str3));//true
        System.out.println(str2 == str4); // true
        System.out.println(str1 == str2); //false
        System.out.println(str5 == str6); //true
    }

string字符串

string不可变

  • 字符串是常量,创建后不可以改变(对象不可变,引用可变),其源码是final修饰。保存在字符串池中,属于方法区,可以共享(为了达到这个节省空间的目的,string必然不可以修改,相应的string相关的包也都是不修改值的。比如a,b,c都指向同一个地址,如果为了修改a,修改了该地址的内容,那么b,c就受到了影响)

  • 这里可以想到string储存敏感数据就很危险

    如果重要的数据(保存在内存中)在使用后没有及时清理,有可能会导致信息泄漏。开发人员通常都回用String 保存敏感数据(密码,卡号等)。因为String 对象是不可变的,只有 JVM 的垃圾回收器才能从内存中清除String的值。而只有内存不足的时候虚拟机才会执行垃圾回收,所以我们不能保证垃圾回收什么时候进行。当系统崩溃后,memory dump 可能会泄漏敏感数据。

    Memory dump : 内存转存
    用途:存一个当时内存的副本,可以用工具打开复原当时的情况。因为东西都在内存里

    当重要数据不需要再使用的时候,保证把它清除掉。用byte 数组 或 character 数组来代替一些不可变的对象,比如String。应为byte 和 character 数组能用程序清理掉。

  • 当我们写String name =“hello”;时是name引用hello所在的地址。

  • 修改:会重新开辟空间,一个新的字符串的地址给name

  • ==判断相等,引用类型数据用的是地址,这里可以用equals

  • +两边都是字符串常量,拼接后仍在运行时常量池中;两边一旦出现了变量,拼接后的字符串对象临时放到了一个缓冲区中,不在常量池中

StringBuffer和StringBuilder

  • 可变

  • 字符串拼接常用

  • StringBuffer:线程安全,性能较低(内部有线程同步);多线程应用中使用

  • StringBuilder:线程不安全,性能高;只能在单线程项目中使用

  • 内部也是使用字节数组 存储字符内容 value没有final修饰符

  1. 拼接

    //        append追加字符串 拼接
            stringBuilder2.append("Sun");
    
  2. 插入

    //        插入 指定位置进行插入
            stringBuilder2.insert(4, "123");
    
  3. 查找

    System.out.println("indexOf首次出现 :" + stringBuilder2.indexOf("Son"));
    System.out.println(" lastIndexOf: " + stringBuilder2.lastIndexOf("Sun"));
    
  4. 替换

    //        使用新的字符替换指定索引所对应的字符
            stringBuilder2.setCharAt(0, 'n');
    //        [start,end) replace()
            stringBuilder2.replace(7, 10, "www");
    
  5. 倒置(特有的,相比较string)

    //        reverse倒置
    //        stringBuilder2.reverse();
    
  6. 删除

    //        删除某个字符 指定索引所对应的字符
            stringBuilder2.deleteCharAt(4);
    //        [start,end)
            stringBuilder2.delete(6, 9);
    
  7. 转换

    // toString 把StringBuilder对象 转换为String类型
            String string = stringBuilder2.toString();
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值