Java_String

作者: Ethan丶Xiao | 来源:发表于2018-04-26 09:06 被阅读0次

    不可变的字符串:String 创建完毕之后内容不能改变,改变之后就是一个新的对象;

    可变的字符串:StringBuilder \ StringBuffer,当该对象创建完毕之后,当内容发生改变时,对象保持不变

    字符串的本质:一个char类型的数组;String其实就是对插入数组的封装;

    String对象的创建

    通过字面量: String str1 = "hello";
    最多创建一个对象,最少不创建对象;
    如果在常量池中存在所创建的对象,那么此时可以 直接引用 不创建String对象
    否则 先在常量池创建内存空间 在引用

    通过构造器: String str2 = "hello";
    至少创建一个String对象 最多创建两个String对象
    new关键字绝对会在堆空间创建内存空间 所以至少创建一个对象;

    区分:

    String对象的空值:
    表示引用为空: String str1 = null; 没有初始化,没有分配内存空间
    表示内容为空: String str2 = ""; 已经初始化,分配内存空间,不过没有内容

    判断字符串非空:

    if(str != null && str!''''.equals()(str.trim())){
    System.out.println("非空");
    }else{
    System.out.println("空");
    }
    

    字符串的比较操作:

    使用 "==": 只能比较引用的内存地址是否相同
    使用equals()方法: 在Object类中和 "==" 相同,建议子类覆盖 ; 去比较内容; String中覆盖了该方法,比较的是字符串内容;

    单独使用 " " 创建的字符串都是直接量 , 编译时期就已经存储在常量池中;
    使用new String(" ")创建的字符串会存储在堆空间中,在运行事情才会创建;
    使用包含直接量字符串连接符进行连接创建的字符串 , 也是直接量在编译时期就已经存储在常量
    池中;
    使用包含String直接量(无final修饰符) 的字符串表达式创建的字符串表达式,(s1 + "aa") 创建的对
    象是运行时期才创建的,存储在堆中;
    (通过变量/调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值,不存在编译器优化)


    String的相关操作:

    char[]数组和byte[]数组 与 String字符串的相互转化;

    • String str1 = new String(char[]数组);//把char数组转化为字符串
    • String类型.toCharArray();//把String字符串转化为char[]数组;
    • String字符串.geBytes();//把字符串转化为byte[]数组;
    • String str2 = new String(byte[]数组);//把byte[]数组转化为String字符串;

    获取字符串信息:

    • int len1 = String.length();//获取一个字符串的长度
    • char ch1 = String.charAt(index 索引值);//返回索引值所对应的char值;
    • int num1 = String.indexOf(String 子字符串); // 返回子字符串在父字符串中第一次出现的索引;
    • int num1 = String.lastIndexOf(String 子字符串);//返回子字符串在父字符串中最后一次出现的索引;

    字符串的大小写转换:

    • String.toUpperCase();//把字符串全部转换为大写
    • String.toLowerCase();//把字符串全部转换为小写
    • String[] 数组名 = String字符串.split(正则表达式);
    • 根据给定的正则表达式拆分字符串;

    startsWith(String 判定条件);// 字符串是否以判定条件为开头;

    String在做字符串拼接时效率极低;因为String是不可改变的,每次连接字符串都是创建新的对象;
    Stringbuffer与Stringbuilder的区别;
    都表示可变的字符串,功能方法都是相同的;
    区别在于:
    StringBuffer中的方法都使用了synchronized修饰符,表示同步的,在多线程并发的时候可以保证线程安全问题;性能较低;
    StringBuilder都没有使用synchronized修饰,不安全,但性能较高;
    建议使用StringBuilder;线程安全问题可以解决;

    使用StringBuilder的默认无参数构造器,在底层默认创建了一个长度为16的char数组;
    此时该数组只能存储16个字符,如果超过了,则会自动扩容;(创建更长的数组,再把之前的数组拷贝过去,效率低);
    一般的,事先大概知道需要存储多少字符,应该直接传入参数;

    常用操作:
    StringBuilder.append(object obj);//往当前字符串追加内容
    StringBuilder deleteCharAt();//删除指定位置的字符串;
    StringBuilder.reverse();//字符串的反转操作;

    相关文章

      网友评论

        本文标题:Java_String

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