Java之字符串

  1. 基本数据类型:byte  short  int  long  float  double  booleam(true / false)  char
  2. 引用数据类型:类、数组、接口
    1. 引用数据类型的值是对象,在内存中开辟内存空间
  3. 字符串底层是 char 类型数组
  4. 当 String 是空字符串时:
    1. String str = "" ;
    2. 在内存中用的是 c 语言存储,c 语言 char 类型数组会有 
      { ' \0 ' } 表示结束,也会占用内存空间
  5. 函数:
    1. subString(num1,num2):截取函数
      1. 获取从 num1 到 num2 的字符串
    2. replace("",""):
      1. 替换字符串。---->  将前面的字符串替换为后面的字符串
    3. indexOf(字符串1):
      1. 判断字符串1是否是本字符串的子串
        1. 如果是,返回第一个字符的下标
        2. 如果不是,返回 -1
    4. split("字符串1"):字符串切分
      1. 按照字符串1进行切分,得到的是数组
      2. 也可以按照字符切分
      3. 字符:
        1. 汉字,字母,数字,符号,换行符,空格
  6. 不可变字符串:
    1. 不可变:原值不能发生变化
    2. 底层是 c 语言数组,不管数组有多大,碰到 \0 才会结束,所以原数组修改会很麻烦
  7. 字符串常量池(在堆区中):
    1. 当字符串不被引用时,也不会被 java 回收机制清理掉
    2. 当有变量指向该字符串时,先会查找字符串常量池中有没有该字符串
      1. 如果有,变量直接指向该字符串
      2. 如果没有就在字符串常量池新建字符串再进行引用
  8. 字符串比较:
    1. == :判断的是两个字符串引用的地址是否一样
      String a = "33";
      
      String b = "44";
      
      String c = "33";
      
      System.out.println(a == b);    //此时返回的是 false ,因为 a 和 b 在字符串常量池中指向的是两个不同的变量
      
      
      System.out.println(a == b);    //此时返回的是 true,因为 a 和 b 在字符串常量池中指向的是相同的变量
  9. equals:比较字符的值是否相等
    1. 在 Object 类中,本身判断的是地址是否相同
    2. 在 String 类型中:判断的是两个字符串的值是否相等
      1. String类型把父类 Object 中的 equest 方法重写
  10. null 串:不占用堆内存空间
    //此时字符串为空串,不占用堆内存空间
    String str = null;
  11. 码点:在内存中的编码值
  12. new:创建对象并开辟空间
    1. 开辟的空间不在字符串常量池中,而是在常量池以外的堆区中开辟
       public static void main(String[] args) {
              //该字符串存储在堆区中的字符串常量池中
              String a = "11";
      
              //该字符串没有存储在堆区常量池中,而是直接在堆区中开辟的内存空间
              String b = new String("11");
      
              //两个字符串虽然值相同用,但是 == 判断的是两个字符串的地址是否相同
              //这两个字符串一个在堆区的字符串常量池中,一个直接存储在堆中
              //显然地址是两个,返回的是 false
              System.out.println(a == b);
          }
  13. API 接口:
    1. 提供方法:方法名,入参数量以及对应类型,返回类型,方法功能说明
    2. 常用的方法:
  14. 字符串拼接:
    1. String 类型:
      1. 字符串的每次变化都会申请空间(4KB)
      2. 本地不可变:
        1. Java 检测机制:字符串多长就只能占用多大的空间,多余的空间也不能越界使用
      3. 当内存空间不够时,内存会回收资源重新申请新的空间,运算速度就慢了下来
    2. StringBuilder缓冲区:
      1. 本地可变:
        1. 每次有一个缓冲区:空间足够可以在本地拼接,空间满了就会继续申请新的空间来进行拼接
      2. 极大节省内存
    3. String、StringBuilder、StringBuffer的区别:
      1. String:
        1. 每个变量申请一块空间,性能非常慢
      2. StringBuilder:
        1. 当申请的空间不够时,才会申请空间来进行拼接存储
        2. 性能比 String 快很多
      3. StringBuffer:
        1. 多线程一起对他操作,线程安全,底层增加锁
        2. 性能比 StringBuilder 慢一点点(性能依然很快)
    4. 输入输出:
      1. 引用 :import java.util.*;
      2. 字符串输入:
        1. 注意事项:
          1. 字符包含:回车和空格
        2. 例:
          1. 在字符串接收之前先接收一个整形,在整形输入完毕之后敲回车或者空格会被第一个字符串接收到,此时字符串就会就会少一次
          2. 解决方法:把第一个字符串接收两次即可。第一次接收回车,第二次接收该字符串

拓展知识:

  1.   Buffer:
    1. 函数名字中带有buffer
    2. 底层原理和 StringBuffer 实现一样,底层都是一个足够大的数组,性能非常高
    3. 实现类里面带有 buffer 字样,性能都很高,都是上面实现原理和语言无关
  2. Stream 流:本质是数组,性能很快
  3. 网路通信框架 NIO ---> 三大核心之一就是 buffer      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值