不属于,八种基本数据类型:byte、short、char、int、long、float、double、boolean。
String str="i"会将起分配到 常量池
中,常量池中没有重复的元素
,如果常量池中 存在i
,就将 i的地址赋给变量
,如果 没有就创建一个再赋给变量
。
String str= new
String(“i”)会 将对象分配到堆
中,即使内存一样,还是会重新创建一个新的对象
。
将 对象封装到stringBuilder
中,调用 reverse
方法反转。
equals、length、contains、replace、split、hashcode、indexof、substring、trim、toUpperCase、toLowerCase、isEmpty等。
获取
功能方法名 | 功能 |
---|---|
length | 获取字符串长度; |
charAt(int index) | 获取指定索引位置的字符; |
indexOf(int ch) | 返回指定字符在此字符串中第一次出现处的索引; |
substring(int start) | 从指定位置开始截取字符串,默认到末尾; |
substring(int start,int end) | 从指定位置开始到指定位置结束截取字符串; |
判断
功能方法名 | 功能 |
---|---|
equals(Object obj) | 比较字符串的内容是否相同,区分大小写; |
contains(String str) | 判断字符串中是否包含传递进来的字符串; |
startsWith(String str) | 判断字符串是否以传递进来的字符串开头; |
endsWith(String str) | 判断字符串是否以传递进来的字符串结尾; |
isEmpty() | 判断字符串的内容是否为空串""; |
转换
功能方法名 | 功能 |
---|---|
byte[] getBytes() | 把字符串转换为字节数组; |
char[] toCharArray() | 把字符串转换为字符数组; |
String valueOf(char[] chs) | 把字符数组转成字符串。valueOf可以将任意类型转为字符串; |
toLowerCase() | 把字符串转成小写; |
toUpperCase() | 把字符串转成大写; |
concat(String str) | 把字符串拼接; |
其他常用
功能方法名 | 功能 |
---|---|
replace(char old,char new) | 将指定字符进行互换 |
replace(String old,String new) | 将指定字符串进行互换 |
trim() | 去除两端空格 |
int compareTo(String str) | 会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果,如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果,如果连个字符串一摸一样 返回的就是0。 |
对象n | 存在方式 |
---|---|
对象1 | new StringBuilder() |
对象2 | new String(“a”) |
对象3 | 常量池中的"a" |
对象4 | new String(“b”) |
对象5 | 常量池中的"b" |
对象6 | new String(“ab”) |
深入剖析:StringBuilder中的toString():
对象6:new String(“ab”)
强调一下,toString()的调用,在字符串常量池中,没有生成"ab"
附加题
String s1 = new String("1") + new String("1"); //s1变量记录的地址为:new String
s1.intern(); //在字符串常量池中生成"11"。如何理解:jdk6:创建了一个新的对象"11",也就有新的地址;jdk7:此时常量池中并没有创建"11",而是创建了一个指向堆空间中new String("11")的地址;
String s2 = "11";
System.out.println(s1 == s2); //jdk6:false;jdk7:true
调用 trim()
方法。
String是不可变对象,每次对String类型的改变时都会生成一个新的对象。
线程不安全,效率高,多用于单线程。
线程安全,由于加锁的原因,效率不如StringBuilder,多用于多线程。
不频繁的字符串操作使用String,操作频繁的情况不建议使用String。
三者的详解链接:https://blog.csdn.net/m0_48170265/article/details/129342702