java字符串处理

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());  

    }  

}  

你可能感兴趣的:(java字符串处理)