String是一个不可变字符串,内容是不可变的。当我们更改了字符串的内容,操作的结果肯定是一个新的字符串 (内存地址改变)
String不可被继承,因为被final修饰
==:在基本数据类型中 比较值的;在引用数据类型中 比较内存地址的
字符串直接赋值和new String的区别
直接赋值,从字符串常量池中查找,如果该字符串存在,就直接引用;如果不存在,将该字符串存入常量池,然后再引用;
通过new创建字符串对象,先在堆区申请内存空间,将字符串存入该内存中,接着去检查常量池中是否有该字符串,
如果没有,还会将该字符串在常量池中存放,引用的是堆区中的内存空间
eg:String name = "abc";
String name2 = "abc";
String name3 = new String("abc");
System.out.println(name == name2); //true
System.out.println(name == name3); //false
1.字符串比较
1.1比较字符串内容:比较两个字符串对应位置上的字符 equals、equalsIgnoreCase
(比较顺序:内存地址——判断参数类型String——字符串length——对应位置上的字符,若哪处不相等,即为false)
eg:name = "abc";
name3 = "ABc";
boolean eq = name.equals(name3);
System.out.println(eq); //false
//比较时,忽略英文字母大小写
eq = name.equalsIgnoreCase(name3);
System.out.println(eq); //true
1.2 比较大小 compareTo、compareToIgnoreCase
0:两个字符串相等; 正数:调方法的字符串大; 负数:调方法的字符串小
(字符char 2可隐式转换为int 4比较)
eg:b 此98大
abc
int r = name.compareTo(name3);
System.out.println(r); //32
//比较时,忽略大小写
r = name.compareToIgnoreCase(name3);
System.out.println(r); //0
2.截取字符串
name = "abcde";
//从指定位置截取到结束,包含指定位置
String s = name.substring(1);
System.out.println(s); //bcde
//截取范围包含开始位置,不包含结束位置
s = name.substring(1, 2); //(此处name不可变,未被重新赋值,故name = "abcde")
System.out.println(s); //b
3.获取字符串中的字符
char ch = name.charAt(0);
System.out.println(ch); //a
//获取字符串的长度(字符的个数)
int len = name.length();
System.out.println(len); //长度为5
根据字符获取位置
返回 字符或者字符串 第一次出现的位置;如果不存在,返回 -1
name = "aabbcecddaa";
int index = name.indexOf("a");
System.out.println("index = " + index); //"a"返回字符串位置下标index为0
返回最后一次出现的位置
index = name.lastIndexOf("a");
System.out.println("index = " + index); //"a"返回字符串位置下标index为10
4.字符串的遍历
for(int i = 0; i < name.length(); i++) {
ch = name.charAt(i);
System.out.println("ch = " + ch); //ch = a ch = b ch = c ch = d ch = e
}
5.判断字符串以什么开头
判断name是否是http开头,true代表是这个开头;否则就不是
boolean bl = name.startsWith("http");
System.out.println(bl); //false
判断结尾
bl = name.endsWith("de");
System.out.println(bl); //true
6.按照指定的规则,分割字符串
String names = "张三,,李四,王五"; //此处,,之间有空字符串""
//参数为要分割的字符串 (按照谁分割,谁就成空字符串)
String[] str = names.split(",");
for(String ss : str) {
System.out.println("ss = " + ss); //ss = 张三 ss = ss = 李四 ss = 王五
}
7.替换 将names中的逗号替换为冒号
names = names.replace(",", ":"); //张三::李四:王五
names = names.replace(",", ""); //张三李四王五
System.out.println(names);
8.大小写转换 (只转换英文大小写,其它不变)
将字符串中的小写字母转换为大写字母
name = "aabbcecddaa";
name = name.toUpperCase();
System.out.println(name); //AABBCECDDAA
将字符串中的大写字母转换为小写字母
name = name.toLowerCase();
System.out.println(name); //aabbcecddaa
9.字符串的拼接
+运算法
String s1 = "ab";
String s2 = "cd";
String s3 = s1 + s2;
System.out.println(s3); //abcd
使用concat函数进行拼接
String s4 = s1.concat(s2);
System.out.println(s4); //abcd
10.去除前后位置的空白字符(中间的不去)
String su =" aa bb ".trim();
System.out.println(su); //aa bb
11.将字符串转换为字符数组 toCharArray();
char[] array = four.toCharArray();
字符串的工具类
public class StringUtils {
判断字符串是否为null、空字符串
如果只有两种状态,我们可以通过boolean值来表示;多余两种,可以选择用不同的数字来表示
public static boolean isEmpty1(String s) {
if(s == null || s.length() == 0) {
return true;
}
return false;
}
public static int isEmpty2(String s) {
if(s == null) {
return -1;
}
//isEmpty():当字符串长度为0,返回值为true;不为0,返回值为false
if(s.isEmpty()) {
return 0;
}
return 1;
}
public static Status isEmpty3(String s) {
if(s == null) {
return Status.ISNULL;
}
if(s.length() == 0) {
return Status.ISEMPTY;
}
return Status.NOTEMPTY;
}
按照字典顺序比较两个字符串
比较规则:两个字符串对应个位置的字符进行比较,若某个位置上的字符已经比出了大小,就不再往后比较了;
如果每个位置上的字符都相等,那就通过长度的比较得到大小
public static int compare(String s1, String s2) {
//1比较内存地址
if(s1 == s2) {
return 0;
}
//2不进上面的if,s1和s2不可能同时为null (该题默认谁为null,谁小)
if(s1 == null) {
return -1;
}
if(s2 == null) {
return 1;
}
//代码能执行到此处,说明是s1和s2都不为null
//3比较两个字符串中的字符
//遍历期间,为了防止下标越界,用长度小的作为循环条件
int minlength = Math.min(s1.length(), s2.length());
for(int i = 0; i < minlength; i++) {
char ch1 = s1.charAt(i);
char ch2 = s2.charAt(i);
if(ch1 != ch2) {
return ch1 > ch2 ? 1 : -1;
}
}
//4当代码执行到此处,说明比较过的字符串都相等,比较长度
return (s1.length() >= s2.length()) ? (s1.length() == s2.length() ? 0 : 1) : -1; //效果等同于下
// if(s1.length() > s2.length()) {
// return 1;
// }else if(s1.length() < s2.length()) {
// return -1;
// }
// return 0;
}
实现字符串中是否包含某个字符串
public static boolean contians(String source, String sub) {
//1判断是否为null
if(source == null || sub == null) {
return false;
}
//2 source的长度不能小于sub的长度
if(source.length() - sub.length() < 0) {
return false;
}
//按照sub的长度,从source中找出对应范围的字符串进行比较
int sublength = sub.length();
//第二个参数最大 sourc.length(); (即sublength + i <= sourc.length();)
int i = 0;
while(true) {
String temp = source.substring(i, sublength + i);
if(temp.equals(sub)) {
return true;
}
i++;
if(sublength + i > source.length()) {
break;
}
}
//while执行完毕,如果方法还没有停,就说明不包含
return false;
}