String 代表字符串 都是用一对双引号包裹 不是基本数据类型 是引用数据类型
创建的方式有两种
第一种 创建对象的形式 String string =new String("111");
第二种 使用字面量的方式 String string = "abc";
字符串的原理
- String对象用于保存宁符串,也就是一组字符序列
- "jack"字符串常量,双引号括起的字符序列
- 字符串的字符使用Unicode字符编码,个字符(不区分字丹还是汉字)占两个字节
- String类有很多构造器,构造器的重载
b.intern0方法最终返回的是常量池的地址(对象)String 的存储位置在哪里???
如果使用字面量的形式创建 字符串 直接存放在字符串池中
如果使用new的形式创建 会在堆中开辟一个空间指向字符串常量池
字符串常量池 我们使用的字符串都是存储在字符串常量池的
补充
常量池就是一个数据结构,可以想象数组,数组就是一种数据结构,拿来存数据的,常量池也在堆中,常量池里面存string对象地址,就是说不管双引号的string对象,还是new的,都是堆里面创建,且都有vaString的源码
通过观察String的源码 发现String是一个final 类 所以他不能被继承 不能被重写
实现了Serializable 声明他可以被序列号化(需要了解点击链接),序列号化可用于网络传输
实现了 Comparable 说明String 可以对比大小 compareTo()String是一个不可变的
Jdk7底层是以 final char[] 数组存储的
Jdk8底层是以 final byte[] 数组存储的
通过上面两点 我们得出结论 String是一个不可变的 拥有不可变性
因为String的不可变 导致可能出现系统资源浪费面试题
String string = new String("abc") 创建了几个对象
一个或者两个(StringBuffer,StringBuilder)
答:如果创建过相同的字符串,只需要在堆中创建对象。
如果没有就需要在字符常量池创建相应的对象String常见方法
方法名 | 描述 | 返回值 | 写法 |
---|---|---|---|
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 | |
endsWith() | 是否以某个结尾 | boolean | |
startsWith() | 是否以某个开头 | boolean | |
startsWith(String str,int index) | 指定开始的位置判断 | boolean | |
contains() | 判断是否包含字符串 | boolean | |
indexOf() | 字符串第一次出现的位置 没有就返回-1 | int | |
indexOf(String s,int index) | 从指定的位置开始查找 没有就返回-1 | int | |
lastindexOf() | 字符串最后一次出现的位置 没有返回-1 | int | |
lastindexOf(String str,int idnex) | 按照指定位置开始查找 从后往前找 | int | |
replace() | 可以替换字符 也可以替换字符串 | String | |
replaceAll() | 使用正则表达式替换 | String |