java基础教程:常用对象之String(21)

来源:互联网 发布:hololens软件开发环境 编辑:程序博客网 时间:2024/06/03 13:03


上节课我们学习了java的Object类。了解了所有对象的一些公共方法。这节课我们学习下java中使用最频繁的对象类:String


本节课的内容:

1、String类

2、String对象

3、String类的方法


第一部分:String类

String类是java.lang包下的一个类,主要用于定义字符串对象,提供一些字符串的操作方法。

我们看下String类的定义(类定义部分):

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {}

String是一个final类,不能被继承。

实现了三个接口:java.io.Serializable序列化,Comparable<String>比较,CharSequence字符序列。



第二部分:String对象

如果我们需要使用String来存储一个字符串,那么我们自然需要实例化一个String对象来存储。那么,是不是直接new就可以了呢?

当然可以,String支持new的方式创建字符串。但是,字符串是java中用到的非常频繁的对象。如果每次都new,会在堆内存上消耗很多的空间。

java为了降低这种消耗,提供了丰富的字符串创建方式,以满足各种需求。我们来看看:

String x = "abc";

String x = new String("abc");

String x = "a"+"b"+"c";

String x = "ab";y=x+"c";

char data[] = {'a', 'b', 'c'};  String str = new String(data);

String x = "abc"; y=x;

由此可见,java的String对象可以使用=赋值,也可以使用+进行字符串的拼接

那=相比new的方式,到底做了什么?

其实,在jvm中,维护了一个字符串的常量池,里边存放了一些String字符串常量。

当使用=进行赋值时,如果池子中已经存在这些串,就直接把地址引用给对象。这样以来,不需要重复的开辟对象空间。

我们可以通过例子来看:

String a="abc";String b = "abc"; System.out.println(a==b);

所以,建议使用=的方式进行字符串的赋值操作


另外,在String的定义中,我们可以看到有两个final,一个是String的类定义中,final class String.

另一个是value属性:private final char value[];

这两个final决定了String的特殊:任何值的改变都会产生新的String对象


最后,String是对象,所以使用new的方式创建的字符串一定会创建对象。

而使用=赋值不一定产生新对象(取决于常量池)


第三部分:String的方法

String的方法非常多。我们找一些常见的说明下。

1、构造方法String(byte[] bytes, Charset charset)

这个方法可以将一个byte数组转换为String对象。一般用于String的编码转换。

例如将GBK的字符串转为UTF-8的字符串。

String a = "GBK";

String b = new String(a.getBytes("GBK"),"UTF-8");//先通过getBytes方式将原始串按编码解析为byte数组,再将数组转为合适的编码串。


2、charAt(int index)返回字符串中某个位置的字符,index从0开始

String a = "abc";a.charAt(1);//b


3、concat(String str)将指定的字符串拼接在当前字符串的后面。

String a = "ab";a.concat("c");//abc


4、contains(CharSequence s)判断字符串是否包含某一字符序列(可以是字符串)

String a = "abc";a.contains("c");//true


5、endsWith(String suffix)判断字符串是否以某个子串结束

String a = "abc";a.endWith("c")'//true


6、equals(Object anObject)重写了Object的equals方法,表示是否和另一个对象相同。可以是对象引用地址或值相同。

String a ="abc"; a.equals("abc");//true


7、equalsIgnoreCase(String anotherString)判断字符串是否和另一个串的值相同(不区分大小写)

String a = "abc"; a.equalsIgnoreCase("AbC");//true


8、format(String format, Object... args)格式化一个字符串,使其按照指定的规则进行替换。

String a = "name:%s,age:%d";  a = String.format(a,"john",23); // name:john,age:23

%s代表字符串  %d代表数字,其他更多类型,请查询资料。


9、getBytes()获取字符串的byte数组


10、getBytes(String charsetName)获取字符串以指定编码转换后的byte数组


11、indexOf(String str)返回某个子串在字符串中的位置

String a = "abc";a.indexOf("b");//1


12、isEmpty()判断字符串的长度是否为0,也就是内容为空。但不是对象为空。


13、lastIndexOf(int ch)返回子串在字符串中的最后出现位置

String a = "abcefgabc"; a.lastIndexOf("abc");//6


14、length()返回字符串的长度

String a ="abc";a.length();//3


15、matches(String regex)判断字符串是否符合某个正则表达式。(注意需要转义)

String a = "abcdefg";a.matches("^[a-z]+$");//true


16、replace(CharSequence target, CharSequence replacement)将字符串中指定的字符替换为目标串

String a = "abcefgabc"; a=a.replace("efg","abc");//abcabcabc


17、replaceAll(String regex, String replacement)将字符串中指定正则表达式的字符串替换为目标串

String a = "abcefgabc";a=a.replaceAll("[efg]+","abc");//abcabcabc


18、split(String regex)将字符串以指定的分隔符拆分成字符串数组

String a = "1,2,3,4"; String arr = a.split(",");//[1,2,3,4]


19、startsWith(String prefix)判断字符串是否以某个子串开始

String a = "abc"';  a.startWith("a"); //true


20、substring(int beginIndex)  从某个开始位置截取字符串,位置从0计算。包含起始位置

String a = "abc"; a.substring(1); //bc


21、substring(int beginIndex, int endIndex) 从某个开始位置到结束位置截取字符串,位置从0开始.包含起始位置,但不包含结束位置。

String a = "abc"; a.substring(1,2);  //b


22、toCharArray()返回字符串的字符数组


23、toLowerCase、toUpperCase返回字符串的小写、大写


24、trim()  截取字符串前后的空格(半角)


25、valueOf(xx)  得到基本类型  或char数组 或object的String值。

int i = 2; String.valueOf(i); //  "2"

boolean f = true;  String.valueOf(f); //  "true"

其他基本类型都基本可以转换。