String 字符串类详解
介绍
字符串对象作为最常用的数据类型,大量且频繁创建字符串会极大地影响程序的性能.所以java在创建字符串对象对其进行了优化
- 为字符串开辟了一个字符串常量池,类似缓存区
- 创建字符串常量时,首先会检查字符串常量池中是否存在该字符串,如果存在,则返回该实例的引用,如果不存在,则实例化创建该字符串,并且放入池中.
- 只有使用字面值创建字符串对象的方式,才会使用到内存中的字符串常量池.
创建字符串详解
-
使用new String(“abc”)创建
当使用new 关键字创建字符串对象时,会先在堆空间中创建一个字符串对象,然后在字符串常量池中查找有没有abc这个字符串对象,如果有就把常量池中的对象与堆中关联起来,如果没有就在常量池新创建一个"abc"并且与堆空间中的字符串对象关联起来. **注意:**是先创建对象在去常量池中查找或者创建,如果先去常量池查找或创建,在去堆中创建时有可能常量池中对象可能已经被回收.在此过程中一共创建两个对象.
-
使用 = “abc” 创建
当使用字面值的方式创建对象时 会直接去字符串常量池中查找或创建"abc"对象.
-
详细图解.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V3BE3fNV-1601778599265)(E:\学习\Java2020\image\image-20200930092948211.png)]
字符串与其他对象执行"+"运算符原理
- “abc”+"abc"时会在编译时就会看成一个对象.
- 当+的左右为引用时会创建一个StringBulider对象将左右的对象append进bulider中.
常用方法
-
int length()
获取字符串的长度. str.length();
-
int codePointCount(int a,int b)
获取a-b之间的代码点长度,与length类似.
-
boolean isEmpty();
判断字符串是否为空,true为空,如果字符串为空格,字符串不为空;
-
char charAt(int)
获取字符串第int位的字符,如果参数超过字符串边界,StringIndexOutOfBoundsException
-
int codePointAt(int)
获取字符串第int位的字符所代表的Unicode代码点.
-
equals(Object)
判断当前对象的值是否和Object的值是否相等
-
compareTo(String)
判断当前对象与String对象的大小,一个一个字符进行比较,字符之间按照字符编码顺序排.如果返回的是正值代表当前对象大.
-
indexOf(int)
返回当前字符串中int(unico值)所在的索引位置,如果遇到多个,返回第一个如果没有就返回-1;lastIndexOf 返回最后一个
-
indexOf(String)
返回当前字符串中的字符子串String所在的索引位置,lastIndexOf 返回最后一个
-
subString(int begin[,int end])字符串切割
int begin 开始索引,int end 结束索引 默认的end 为length;
-
concat(String) 字符串拼接
在当前字符串的后面拼接上string字符串
-
contains(CharSequence)
判断当前字符队列是否在字符串中
-
replace(CharSequence old,CharSequence new)
将old字符队列换成new的字符队列,如果有old有多个,只替换第一个.
-
replaceAll(String reg,String new)
将字符串中符合reg正则式的字符子串全部替换成new字符串
-
replaceFirst(String reg,String new)
将字符串中第一个符合reg正则式的字符子串替换成new字符串
-
split(String [,int])
将字符串按照String的正则式分割成字符串数组,如果int<0 则字符串会被分割成全部符合要求的字符串数组,数组长度为任意长,如果int=0,那么会将结尾的字符空串丢弃掉,如果int>0,那么会匹配int-1次,并将剩余字符串放入最后一个子串中,默认为<0;
-
toLowerCase()
将字符串中的字母转成小写字母
-
toUpperCase()
将字符串中的字母转换成大写字母
-
trim()
去掉首位空格
-
toCharArray()
返回字符数组
-
valueOf()
将基本数据类型转换为字符串,Object默认调用toString.
-
intern()
将指向堆中的引用指向字符串池.