1、简单介绍
java中有八中基本数据类型,分别为byte short int long四种整数类型,double float 两种小数类型,char类型,boolean类型以及String类型,其中String类型则是最为特别的类型。String类型是一个类,每一个字符串都是String类的一个对象,所以字符串的实例都是存在于堆内存中的。当创建一个String变量的时候,他们指向的都是堆内存中的一个String对象的地址。而对于基本的数据类型在被创建的时候则直接指向这个变量的值;
2、字符串的特点
String类被final修饰,创建之后内容不能更改,当调用更改String对象的方法时都会创建一个新的String对象,将改变后的内容赋给新的对象,创建一个相同的String对象不会重新开辟新的空间,堆中内容可以重复使用
3、字符串的创建
3.1、字符串的创建有以下两种方式:
1、字面量方式创建:方式一:String a = “aaa” ;
2、对象方式创建:方式二:String b = new String(“aaa”);
3.2、两种创建方式对比
两种方式都能创建字符串对象,但方式一要比方式二更优。 因为字符串是保存在常量池中的,而通过new创建的对象会存放在堆内存中。
一:字符串常量池中已经有字符串常量”aaa”
• 通过方式一创建对象,程序运行时会在字符串常量池中查找”aaa”字符串,将找到的”aaa”字符串的地址赋给a。
• 通过方式二创建对象,无论字符串常量池中有没有”aaa”字符串,程序都会在堆内存中开辟一片新空间存放新对象。
二:字符串常量池中没有字符串常量”aaa”
• 通过方式一创建对象,程序运行时会将”aaa”字符串放进字符串常量池,再将其地址赋给a。
• 通过方式二创建对象,程序会在堆内存中开辟一片新空间存放新对象,同时会将”aaa”字符串引用放入字符串常量池,相当于创建了两个对象。
当使用字面量创建字符串时,字符串会再常量池中创建对象,当使用对象类型中创建时会在堆中创建对象,如果在常量池中不存在新创建的对象,则常量池中也会创建一个string对象。
4、字符串常用方法
1 length()字符串的长度
String a = "Hello Word!";
System.out.println(a.length);
输出的结果是字符串长度10。
2 charAt()截取一个字符
String a = "Hello Word";
System.out.println(a.charAt(1));
输出的结果是字符串a的下标为1的字符e。
3 getchars()截取多个字符并由其他字符串接收
String a = "Hello Word";
char[] b =newchar[10];
a.getChars(0, 5, b, 0);
System.out.println(b);
输出的结果为Hello,其中第一个参数0是要截取的字符串的初始下标(int sourceStart),第二个参数5是要截取的字符串的结束后的下一个下标(int sourceEnd)也就是实际截取到的下标是int sourceEnd-1,第三个参数是接收的字符串(char target[]),最后一个参数是接收的字符串开始接收的位置。
4 getBytes()将字符串变成一个byte数组
String a = "Hello Word";
byteb[] = a.getBytes();
System.out.println(newString(b));
输出的结果为Hello Word的byte数组。
5 toCharArray()将字符串变成一个字符数组
String a = "Hello Word";
char[]b = a.toCharArray();
System.out.println(b);
输出的结果为Hello Word字符数组。
6 equals()和equalsIgnoreCase()比较两个字符串是否相等,前者区分大小写,后者不区分
String a = "Hello Word";
String b = "hello word";
System.out.println(a.equals(b));
System.out.println(a.equalsIgnoreCase(b));
输出的结果为第一条为false,第二条为true。
7 startsWith()和endsWith()判断字符串是不是以特定的字符开头或结束
String a = "Hello Word";
System.out.println(a.startsWith("ee"));
System.out.println(a.endsWith("rd"));
输出的结果第一条为false,第二条为true。
8 toUpperCase()和toLowerCase()将字符串转换为大写或小写
String a = "Hello Word";
System.out.println(a.toUpperCase());
System.out.println(a.toLowerCase());
输出的结果第一条为“HELLO WORD”,第二条为“hello word”。
9 concat() 连接两个字符串
String a = "Hello Word";
String b = "你好";
System.out.println(b.concat(a));
输出的结果为“你好Hello Word”。
10 trim()去掉起始和结束的空格
String a =" Hello Word ";
System.out.println(a.trim());
输出的结果为“Hello Word”。
11 substring()截取字符串
String a = "Hello Word";
System.out.println(a.substring(0, 5));
System.out.println(a.substring(6));
输出的结果第一条为“Hello”,第一个参数0(beginIndex)是开始截取的位置,第二个参数5(endIndex)是截取结束的位置,输出的结果第二条是“Word”,参数6(beginIndex)是开始截取的位置。
12 indexOf()和lastIndexOf()前者是查找字符或字符串第一次出现的地方,后者是查找字符或字符串最后一次出现的地方
String a = "Hello Word";
System.out.println(a.indexOf("o"));
System.out.println(a.lastIndexOf("o"));
输出的结果第一条是4,是o第一次出现的下标,第二条是7,是o最后一次出现的下标。
13 compareTo()和compareToIgnoreCase()按字典顺序比较两个字符串的大小,前者区分大小写,后者不区分
String a = "Hello Word";
String b = "hello word";
System.out.println(a.compareTo(b));
System.out.println(a.compareToIgnoreCase(b));
输出的结果第一条为-32,第二条为0,两个字符串在字典顺序中大小相同,返回0。
14 replace() 替换
String a = "Hello Word";
String b = "你好";
System.out.println(a.replace(a, b));
System.out.println(a.replace(a, "HELLO WORD"));
System.out.println(b.replace("你", "大家"));
输出的结果第一条为“你好”,第二条为“HELLO WORD”,第三条为“大家好”。
5、正则表达式简单介绍
1,方括号:方括号中指定的单个字符才参与匹配
public class Test {
public static void main(String[] args) {
System.out.println("a".matches("[abc]")); //true
System.out.println("abc".matches("[abc]")); //false
System.out.println("a".matches("[a-c]")); //true
}
}
2,逻辑运算符
示例一:如果想要匹配多个字符,则不能使用[],而要使用()
public class Test {
public static void main(String[] args) {
System.out.println("aa".matches("(a|aa)")); //true
System.out.println("aa".matches("[a|aa]")); //false
}
}
示例二:&&一定要在[]内部使用,否则会被认为是匹配2个连续的&符号
public class Test {
public static void main(String[] args) {
System.out.println("a&&b".matches("a&&b")); //true
System.out.println("b".matches("[a-b&&b]")); //true,等价于[b]
System.out.println("a".matches("[a-f&&[^bcdef]]")); //true,等价于[a]
}
}
示例三:^一定要在[]内部使用,否则将被认作起始边界符
public class Test {
public static void main(String[] args) {
System.out.println("c".matches("[^a]")); //true
System.out.println("c".matches("^a")); //false
System.out.println("c".matches("[^a-c]")); //false
}
}
3,表示匹配次数的符号
4,预定义字符
示例四:
public class Test {
public static void main(String[] args) {
System.out.println("a b".matches("a.b")); //true
System.out.println("ab".matches("a.b")); //false
System.out.println("aabb".matches("a.b")); //false
}
}
5,边界字符
6,java正则表达式使用对象
java.util.regex.Pattern:Pattern的实例对象是不可变对象,线程安全
java.util.regex.Matcher:Matcher的实例对象是非线程安全的
public class Test {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d*");
Matcher m = p.matcher("123");
System.out.println(m.matches());
}
}