字符串类型(String)

字符串类型(String)

String 代表字符串 都是用一对双引号包裹 不是基本数据类型 是引用数据类型
创建的方式有两种
第一种 创建对象的形式 String string =new String("111");
第二种 使用字面量的方式 String string = "abc";

字符串的原理

  1. String对象用于保存宁符串,也就是一组字符序列
  2. "jack"字符串常量,双引号括起的字符序列
  3. 字符串的字符使用Unicode字符编码,个字符(不区分字丹还是汉字)占两个字节
  4. String类有很多构造器,构造器的重载
    b.intern0方法最终返回的是常量池的地址(对象)

    String 的存储位置在哪里???

    如果使用字面量的形式创建 字符串 直接存放在字符串池中
    如果使用new的形式创建 会在堆中开辟一个空间指向字符串常量池
    字符串常量池 我们使用的字符串都是存储在字符串常量池的
    补充
    常量池就是一个数据结构,可以想象数组,数组就是一种数据结构,拿来存数据的,常量池也在堆中,常量池里面存string对象地址,就是说不管双引号的string对象,还是new的,都是堆里面创建,且都有va
    file

    String的源码

    file
    通过观察String的源码 发现String是一个final 类 所以他不能被继承 不能被重写
    file
    实现了Serializable 声明他可以被序列号化(需要了解点击链接),序列号化可用于网络传输
    file
    实现了 Comparable 说明String 可以对比大小 compareTo()

    String是一个不可变的

    Jdk7底层是以 final char[] 数组存储的
    Jdk8底层是以 final byte[] 数组存储的
    通过上面两点 我们得出结论 String是一个不可变的 拥有不可变性
    因为String的不可变 导致可能出现系统资源浪费

    面试题

    String string = new String("abc") 创建了几个对象
    一个或者两个(StringBuffer,StringBuilder)
    答:如果创建过相同的字符串,只需要在堆中创建对象。
    如果没有就需要在字符常量池创建相应的对象

    String常见方法

    file

方法名 描述 返回值 写法
length 返回字符串的长度 int length()
charAt 取指定位置的字符 char charAt(int index)
isEmpty( 判断字符串是否为空 boolean isEmpty()
toLowerCase 转成小写 String toLowerCase()
toUpperCase 转成大写 String toUpperCase()
trim 去除首尾的空白 String trim()
equals 比较字符串是否相等 boolean equals()
equalsIgnoreCase 忽略大小写判断是否相等 boolean equalsIgnoreCase()
concat 拼接字符串 String concat()
compareTo 比较字符串大小 如果小于0则前面小 等于0则相等 int compareTo()

截取

方法名 描述 返回值 写法
substring() 一个参数 从开始的索引截取到最后 两个参数 从开始截取到结束的 但是不包含最后结束的 String file
endsWith() 是否以某个结尾 boolean file
startsWith() 是否以某个开头 boolean file
startsWith(String str,int index) 指定开始的位置判断 boolean file
contains() 判断是否包含字符串 boolean file
indexOf() 字符串第一次出现的位置 没有就返回-1 int file
indexOf(String s,int index) 从指定的位置开始查找 没有就返回-1 int file
lastindexOf() 字符串最后一次出现的位置 没有返回-1 int file
lastindexOf(String str,int idnex) 按照指定位置开始查找 从后往前找 int file
replace() 可以替换字符 也可以替换字符串 String file
replaceAll() 使用正则表达式替换 String file