黑马程序员-String

来源:互联网 发布:php class 内调用方法 编辑:程序博客网 时间:2024/04/30 10:40

                                      

  -----------android培训java培训、java学习型技术博客、期待与您交流!------------

String类


 一、基本特性

          String s1 = ” abc“ s1 是一个类型变量,”abc“,是一个对象,字符创最大的特点;一旦被初始化就不可以改变

           String s2 = new String("abc"); String  类复写了Object 类中的equals方法,该方法用于判断字符串是否相同。

           类之间的==是比较内存地址是否相同


二、  创建几个对象

          1)、 String str = new String("abc");紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象了?

答案是:2个。我们可以把上面这行代码分成String str 、=、"abc"和 new String()四个部分来看待。

String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是变量str进行初始化,将某个对象的引用赋值

给他,也没有创建对象。那么,new String("abc")为什么又能被看成”abc"和new String()呢?

创建一个类有两种方法: 1 使用new创建对象 2 调用 Class 类的newInstance 方法,利用反射机制创建对象

String的构造器: public String (String original) {} 所以我们是使用new调用了String类的上面那个构造器方法,创建了一个对象,并把它的引用赋值给了str变量。同时      我 们注意到被调用的构造器方法接受的参数也是一个String对象,这个对象也是"abc”。

           

              2)、String str = "abc";

 毫无疑问,这行代码创建了一个String对象。

String a =“abc" ; String b = "abc:

答案是一个

String a = "ab"+"cd"

答案是三个

造成以上三个样例的原因是:在java虚拟机(JVM)中存在着一个字符串吃,其中保存着很多String对象。

 并且可以被共享使用,因此提高了效率。由于String类是final的,它的值一创建就不刻意改变,因此我们不用担心String对象共享二带来的程序的混乱,我们再回头看看String a="abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。因此,我们不难理解前面三个例子中头两个例子为什么是这个答案了。

三、常见操作方法

1、获取

        1.1字符串中包含的字符数,也就是字符串的长度

               int   length()://获取长度。

        1.2根据位置获取位置上的某个字符

               char  charAtint  index)://当访问到字符串中不存在的角标时,会发生字符串角标越界的错误。

        1.3根据字符获取该字符存在字符串的位置

              int  indexOfint ch)://返回的是ch在字符串中第一次出现的位置。//传入的是字符对应的ASCII码。//如果没有找到,返回-1

              int  indexOfint chint fromIndex)://fromIndex指定位置开始,获取ch在字符串中出现的位置。

              int  indexOfString str)://返回的是str在字符串中第一次出现的位置。

              int  indexOfString strint fromIndex)://fromIndex指定位置开始,获取str在字符串中出现的位置。

              int  lastIndexOf()://反向索引 

2、判断

        2.1字符串中是否包含某一个子串

              booleancontainsstr);

        //特殊之处:indexOfstr)可以索引str第一次出现的位置,如果返回-1表示该str不在字符串中存在。所以,也可以用于对指定判断是否包含。如:ifstr.indexOf“aa”)!=-1)而且该方法既可以判断,又可以获取出现的位置。如果只为判断,用contains

        2.2字符串中是否有内容

              booleanifEmpty()//原理就是判断长度是否为0

        2.3字符串是否是以指定内容开头

              booleanstartsWithstr);

        2.4字符串是否是以指定内容结尾

              booleanendsWithstr);

        2.5判断字符串内容是否相同,复写了Object类中的equals方法

              booleanequalsstr);

        2.6判断内容是否相同,并忽略大小写。

              booleanequalsIgnoreCase();

3、转换

        3.1将字符数组转成字符串

             构造函数:String (char[])

                                 String(char[],offset,count)//将字符数组中的一部分转成字符串。

            静态方法:

                                 static String copyValueOf(char[])

                                 staticString copyValueOf(char[] data,int offset ,int count )

                                 static String valueOf(char[])

        3.2将字符串转成字符数组

              char[]toCharArray()

        3.3将字节数组转成字符串

              String (byte[])

              String(byte[],offset,count)//将字节数组中的一部分转成字符串。count表示个数。

        3.4将字符串转成字节数组

              byte[]getBytes()

        3.5将基本数据类型转成字符串

              StringvalueOf(int)

              StringvalueOf(double)

        特殊:字符串和字节数组在转换过程中,是可以指定编码表的。

4、替换

        Stringreplace(oldchar,newchar)//返回的是一个新字符串。如果要替换的字符不存在,返回的还是原字符串。

5、切割

        String[] split(regex)//涉及到正则表达式的点,不能作为切割字符串的regex

6、子串,获取字符串中的一部分

        String substring(begin)//从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界异常。

        Stringsubstring(begin,end)//包含头,不包含尾。

7、转换,去除空格,比较

        7.1将字符串转成大写或小写

              StringtoUpperCase();

              String toLowerCase();

        7.2将字符串两端的多个空格去除

              String trim();        

        7.3对两个字符串进行自然顺序的比较

              intcompareTo(String);

四实例练习

需求:判断一个字符串在另一个字符串中出现的次数。

class Example{public static void main(String[] args) {String str = new String("abcadsfjoiwehpuabasdkjfoab");String target = "ab";System.out.println("ans:"+count(target,str));}/** * num 为计数器。 */public static int count(String target,String tmp){int len = tmp.length();int lenTarget = target.length();int number = 0;for(int i=0;i<=len-lenTarget;){if(tmp.substring(i, i+lenTarget).equals(target)) { number++; i+=lenTarget;}else i++;}return number;}}

          
需求:获取两个字符串中最大相同子串

class Example{public static void main(String[] args) {String s1 = new String("abcdefabcabc");String s2 = new String("abcabcabc");System.out.println("ans="+getMaxSubString(s1,s2));}public static String getMaxSubString(String s1,String s2){String max = null;String min = null;if(s1.length()>s2.length()){max = s1;min = s2;}else{max = s2;min = s1;}/** * i 表示长度,j表示最大相同字符串的开头位置 */        for(int i=min.length();i>=1;i--)        for(int j=0;j+i<=min.length();j++)        if(max.contains(min.substring(j, j+i)))return min.substring(j,j+i);return "no answer";}}






0 0
原创粉丝点击