String类
- String类的源码中是被final修饰的,所以他是不能够被继承的
- 同样的String的值也是被final修饰的,String对象被赋值也不能修改
创建对象
- 直接赋值,用“=”;String str = values;这个值是在String pool池中赋值,pool池是在堆中例外开辟了一块空间,让String对象直接赋值使用,如果是两个常量拼接,jvm为了提高xiaol会提前将两个常量拼接到一起。
- 使用构造方法,String str = new String(values);这种方法属于画蛇添足,因为new构造方法会在堆中开辟一个空间创建对象,然后这个对象又会在String pool池中赋值,所以一共开辟了两个对象。这也是会在面试过程中会被问及的,为什么new一个String对象会创建两个对象。
字符串的比较
- == 比较的是两个字符串对象是否是同一个,就是比较这两个对象所指向堆的地址是否相同
- equals()比较的是两个字符串的内容是否相等。
public static void main(String args[]) {
// 在池中和堆中分别创建String对象"abc",s1指向堆中对象
String s1 = new String("abc");
// s2直接指向池中对象"abc"
String s2 = "abc";
// 在堆中为"abc"创建新对象,s3指向该对象
String s3 = new String("abc");
// 在池中创建对象"ab" 和 "c",并且s4指向池中对象"abc"
String s4 = "ab" + "c"; // 结果: "abc" 两个字符串常量相加(拼接): 在编译期间: 已经做完拼接 s4="abc" 提高性能
// c指向池中对象"c"
String c = "c";
// 在堆中创建新的对象"abc",并且s5指向该对象
String s5 = "ab" + c; // 结果:"abc" 不会在编译期间进行拼接,因为 拼接是一个变量, 只能在运行时进行拼接
// 运行时拼接: 在堆创建一个空间(对象), 把拼接的结果赋值给堆对象,
System.out.println("------------实串-----------");
System.out.println(s1 == s2); //false
System.out.println(s1 == s3); //false
System.out.println(s2 == s3); //false
System.out.println(s2 == s4); //true
System.out.println(s2 == s5); //false
}
//这种题目看到都是==,就是在比较两个对象所指向堆得空间是否是同一个
//首相看到new构造方法的必然是新开辟一个空间,所以有S1h和s3的都是false
//s2和s4中都是直接赋值在String pool池中直接赋值,因为jvm为了优化新能所以赋值常量时会提前将他们拼接,所以他们都是指向pool中的“abc”
//而s5中拼接的不是常量需要在堆中额外开辟空间进行凭借所以不是同一个
任何对象与字符串相加结构都是字符串,
因为转化为字符串的方法:
在其后面拼接一个+“”;
其次因为object是所有类的父类,所以所有类都有toString()方法,
这个方法也是可以将对象转换为String对象的
String类转换为其他类
- String转换为 int: Integer 的静态方法: int parseInt(String s)
- String 转换为 double Double的静态方法: double parseDouble(String s)
- String 转换为long Long的静态方法: long parseLong(String s)
String的常用方法
-
equlas() 比较内容 , 区别大小写
-
equalsIgnoreCase(String anotherString) 比较内容是否相等, 不区分大小写
-
boolean contains(CharSequence s) 判断字符串是否包含某个内容 true 包含, false 不包含
-
boolean startsWith(String prefix) 判断字符串是否以某个开头 true: 是, false不是
-
boolean endsWith(String suffix) 判断字符串是否以某个结尾 true: 是, false不是
-
-
int compareTo(String anotherString) 比较两个字符串的大小 字典顺序( a-z) 安装字符的编码
-
比较的结果 0: 表示等于 > 0 表示大于 <0 表示小于
-
A的ascii是65,a的是97,0的是48
-
String str=“12”;
String str2 = “100”;
比较大小: 先拿str第一位与str2的第一位比, 如果str的第一位大于str2的第一位, str > str2, 如果str的第一位小于str2的第一位, str < str2
如果str的第一位等于str2的第一位, 继续比第二位:
str > str2
-
-
contains()字符串是否包含
-
startsWith()是否已什么开头
-
endsWith()同理,已什么结尾
-
- 字符与字符串
- public String(char[] value)--------------------------全部字符数组变为String类
- public String(char[] value,int offset,int count)-----部分字符数组变为String
- public char charAt(int index)------------------------返回指定位置上的字符
- int codePointAt(int 下标) ------------------------ 获取字符串指定下标的字符的ASCII编码
- public char[] toCharArray()--------------------------字符串变为字符数组
-
- 字节数组与字符串:
- public String(byte[] bytes)--------------------------全部字节数组变为字符串
- public String(byte[] bytes,int offset,int length)----部分字节数组变为字符
- public byte[] getBytes()-----------------------------字符串变为字节数组
public byte[] getBytes(String charsetName)
throwsUnsupportedEncodingException-----------------转码
-
- 字符串检索:
- public int indexOf(String str)-----------------------从头查找指定的子字符串是否存在,存在则返回字符串的索引,不存在则返回-1
- public int indexOf(String str,int fromIndex)---------从指定位置开始检索,没找到则返回-1
- public int lastIndexOf(String str)-------------------从后向前查找字符串的位置
- public int lastIndexOf(String str,int fromIndex)-----从指定位置开始由后向前查找
-
- 字符串替换:
- public String replaceAll(String regex,String replacement)满足条件的内容全部替换
- public String replaceFirst(String regex,String replacement)替换第一个满足条件的内容
-
- 字符串截取:
- public String substring(int beginindex)--------------从头截取到尾
- public String substring(int beginindex,int endindex)-截取中间的部分内容字符串拆分:
- public String[] split(String regex)------------------全拆分
- public String[] split(String regex,int limit)--------拆分成指定的个数
- public String[] split(String regex)------------------全拆分
-
-
其他方法:
-
public boolean isEmpty()-----------------------------判断是否是空字符串,不是null
-
//判断是否是空字符串 "" boolean isEmpty() true 是空字符串, false 不是 //判断null 使用 == !=
-
public int length()----------------------------------取得字符串内容的长度
-
public String toLowerCase()--------------------------所有内容变为小写
-
public String toUpperCase()--------------------------所有内容变为大写
-
public String trim()--------------------------------去掉左右空格,中间的无法去掉
-