美文网首页
String摘要

String摘要

作者: Divenier | 来源:发表于2020-11-07 12:06 被阅读0次

    String

    是一种不可变字符序列

    String不可更改(不可变)的理解

    Java文档中说 “String 对象是 immutable(不可变的),是因为不可修改String中的单个字符

    不可更改的原因:
    查看string的源码 可发现如下

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
        }
    

    final数组不可被重写,因此称“不可更改”。

    再看下面的例子

    String s = "Google";
    System.out.println("s = " + s);
    
    s = "Runoob";
    System.out.println("s = " + s);
    /**
    * output:
    * s = Google
    * s = Runoob
    */
    

    从结果上看是改变了,但为什么说String对象是不可变的呢?
    原因在于实例中的 s 只是一个 String 对象的引用,并不是对象本身,当执行 s = "Runoob"; 创建了一个新的对象 "Runoob",而原来的 "Google" 还存在于内存中。
    String这种机制恰恰让它 和 复制值的数据类型相似,而非结结实实引用;
    <摘自菜鸟教程网友笔记>
    https://www.runoob.com/java/java-string.html


    初始化

    格式化声明:

    String fs;
    fs = String.format("浮点型变量的值为 " +
                       "%f, 整型变量的值为 " +
                       " %d, 字符串变量的值为 " +
                       " %s", floatVar, intVar, stringVar);
    

    String常量池

    作用:避免频繁的创建和销毁对象而影响系统性能

    比较字符串要用equals(another String)

    “==”指的是引用相同,(任何地方都要慎用==

    但是我只想看两个字符串长得一不一样,不关心它们是不是指向的同一个,那就用equals()

    String s1 = "abc";
    String s2 = "a"+"bc";//s2 = "abc"
    
    String s7 = "c";
    String s4 = s1+s7;
    System.out.println(s4==s2);//false,编译器没法对s1+s7做优化
    
    String s3 = new String("abc");
    
    System.out.println(s1==s2);//true
    System.out.println(s3==s2);//false
    
    
    //因此通常比较字符串的值是否相等 使用equals
    //==号是判断是否同一个对象
    

    一些方法

    .substring的下标和copyRangeOf一样 前闭后开

    //substring
    String s1= "How are you?";
    s=s1.substring(4,7);
    //s="are"
    
    
    String s2=" How old are you";
    s=s2.trim();//去除字符串首尾的空格。注意:中间的空格不能去除
    System.out.println(s);//s 字符串前面的空格没了
    System.out.println(s2);//因为 String是不可变字符串,所以s2不变
    
    .concat //=="+"
    // 连接字符串
    
    /**String的方法**/
        
    .charAt(int index)//不建议使用,因为char类型容易引起未知问题,见下文char类型总结
    
    .compareTo(object o/String)
    
    .compareToIgnoreCase(String str)//忽略大小写
    
    boolean endsWith(String suffix)
    subString
    trim//返回忽略前后空白的副本
        
    hashCode
    replace(char oldChar,char newChar)//用newChar替换所有oldChar
    endsWith
    startsWith
    

    string与整型运算

    String a = "3";
    int b =4;
    int c = 5;
    
    System.out.print(a+b);//output:34
    System.out.print(b+c+a);//output:93
    //b+c  + "3" = "93"
    
    // 换成char
    
    char d ='a';
    System.out.print(d+1);//output:98
    


    可变字符序列

    StringBuilder()中,append方法return this,
    因此StringBuilder的append可以链式调用:

    StringBuilder sb = new StringBuilder();
    for(int i = 0;i<26;i++)[
        char temp = (char)('a'+i);
        sb.append(temp);
    ]
    
    sb.insert(0,"我").insert(1,"可");
    //sb = "我可abcdefghijgklmnopqrstuvwxyz"
    

    由此也可以注意到,如果对字符串频繁修改(如循环若干次),绝不能用String,会导致内存占用巨大,

    StringBuilder比StringBuffer

    快,但线程不安全

    .append//添加
    
    .reverse//反转
    
    .delete(int start,int end)
    
    .insert(int offset,int i)
    
    replace(int start, int end, String str)
    
    indexOf()、lastIndexOf
    

    char

    不推荐使用char类型的原因:
    Unicode编码和java强制使用的UTF-16不匹配,导致有些一个字符需要两个代码单元才能表示;易诱发未知错误。
    Unicode编码中 使用时需要在数字前加上“\u”;

    char数组的显示

    System.out.println(arr)即可,如果加上arr.toString(),输出的反而会是数组地址

    char与String的区别

    字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)

    处理String的常用方法

    String Int的转换

    //String转化为Int
    String s1 = "999";
    int i1 = Integer.parseInt(s1);
    
    //int 转String
    int i2 = 999;
    String s2 = i2.toString();
    String s3 = String.valueOf(i2);
    

    String Char[]的转换

    1. 利用构造时
    char data[] = {'s', 'g', 'k'}; 
    String str = new String(data);
    
    1. String的函数
      String.valueOf();
    char[] cha = {'s','g','h'};
    String n = String.valueOf(cha);
    

    String的replace函数

    替换后会生成一个新的String,旧的并未改变


    字符串处理

    正则表达式(字符串分割)

    正则表达式\s表示匹配任何空白字符,+表示匹配一次或多次

    String [] arr = str.split("\\s+");
    // 分割空格就要用  "\\s+"
    

    相关文章

      网友评论

          本文标题:String摘要

          本文链接:https://www.haomeiwen.com/subject/pxfhbktx.html