---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

黑马程序员-------------(五)String 字符串


目录

一 概述

二 常见方法

    1.方法摘要

    2.练习

三 StringBuffer、StringBuilder

    1.概念

    2.常见操作

    3.JDK1.5新特性-StringBuilder

四 基本数据类型对象包装类

    1.概述

    2.常见方法

    3.DK1.5新特性-自动装箱与拆箱

注:本章重点内容:JDK1.5新特性-StringBuilder,-自动装箱与拆箱,字符串与基本数据类型之间的转换。对于重点内容,根据知识的重要程度用◆◆◆、◆◆◆◆、◆◆◆◆◆进行了标注。

####################################################################################
一 概念
####################################################################################

String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。该类被final修饰,代表该类不能有子类,不能被继承和复写。字符串既是一个对象,又是一个常量,它是一个固定不变的值。字符串最大特点:一旦被初始化就不可以被改变。
代码示例:        
    String s1 = "abc";
    String s2 = new String("abc");
    String s3="abc";
    String s4="abc";
    s4="kk";
    System.out.println(s1==s2);            打印结果false
    System.out.println(s1==s3);            打印结果true
    System.out.println(s1.equals(s2));    打印结果true;

(1)s1和s2有什么区别?
相同点:s1和s2都是类类型变量, "abc"是一个对象
不同点:s1在内存中有一个对象“abc”;s2在内存中有两个对象。一个是"abc"字符串对象,一个是new出来的对象

(2)equals方法不是比较的内存地址值吗?为什么是true?
String类复写了Object类中equals方法,该方法用于判断字符串是否相同。

(3)字符串不是一旦初始化就不会被改变吗,为什么s4的值变了?
变化的是s4不是字符串,s4的地址变了,它先指向了"abc"这个对象,又指向了另一个对象"kk",此时,"abc"还在内存中,这个对象的值没有变过。

(4)s1==s3打印结果为什么是true?
原理:字符串在内存中有一个常量池,池子里是一个数组,在存放'a','b','c'这样的字符,字符串是由字符组成,当你定义s1="abc"时,它就把'a','b','c'三个字符存放在数组中,当又定义s3="abc"时,"abc"已经存在并且不会被改变,为了节约内存,在字符串这个对象当中,只要字符串内容相同,s1和s3代表着指向同一个对象。

注意:
方法区中有方法数据,方法代码在这一片区域当中,除此之外还有静态区,静态数据在这里面,还有常量池,字符串常量在这里面。

####################################################################################
二 常见方法
####################################################################################

String类适用于描述字符串事物。它提供了多个方法对字符串进行操作。

1.获取。
(1)字符串中的包含的字符数,也就是字符串的长度。
    public int length() 数组的length是属性,字符串的长度是通过方法获得的。
(2)根据位置获取位置上某个字符。
    public char charAt(int index)
(3)根据字符获取该字符在字符串中位置。如果没有找到,返回-1。注意返回值类型是 int 。
    public int indexOf(int ch)
    获取ch在字符串中第一次出现的位置。重载方法可以接收一个String类型参数。该方法还有对应的lastIndexOf()方法。
    public int indexOf(int ch, int fromIndex)
    从fromIndex指定位置开始,获取ch在字符串中出现的位置。重载方法可以接收一个String类型参数。该方法还有对应的lastIndexOf()方法。
        
注意:
public int indexOf(String str):索引str第一次出现位置,如果返回-1.表示该str在字符串中不存在。所以,也可以用于对指定字符串判断是否包含。if(str.indexOf("aa")!=-1)。该方法即可以判断,又可以获取出现的位置。

2.判断。
(1)字符串中是否包含某一个子串。
    public boolean contains(CharSequence s) CharSequence 是一个接口,String/StringBuffer/StringBuilder 都实现了该接口。
    public boolean contains(String str) 这是上个方法的一种常用表现形式。
(2)字符串中是否有内容。
    public boolean isEmpty() 原理就是判断长度是否为0. ""和 null 不一样,""是一个对象, null 是指向空。
(3)字符串是否是以指定内容开头。
    public boolean startsWith(String str)
(4)字符串是否是以指定内容结尾。
    public boolean endsWith(String str)
(5)判断字符串内容是否相同。复写了Object类中的equals方法。
    public boolean equals(Object anObject) 将此字符串与指定的对象比较
    public boolean equals(String str) 这是上个方法的一种常用表现形式。
(6)判断内容是否相同,并忽略大小写。
    public boolean equalsIgnoreCase(String str)
(7)应用
    public static void method_get()
    {
        String str = "ArrayDemo.java";
        
        //判断文件名称是否是Array单词开头。
        System.out.println(str.startsWith("Array"));
        //判断文件名称是否是.java的文件。
        System.out.println(str.endsWith(".java"));
        //判断文件中是否包含Demo
        System.out.println(str.contains("Demo"));
    }

3.转换
(1)将字符数组转成字符串。
    构造函数:
        public String(char[] value) 将字符数组转成字符串
        public String(char[] value,int offset,int count) 将字符数组中的一部分转成字符串。
    静态方法一:
        public static String copyValueOf(char[] data)
        public static String copyValueOf(char[] data, int offset, int count)
    静态方法二:
        public static String valueOf(char[] data)
        public static String valueOf(char[] data, int offset, int count)
        参数:data - 字符数组。offset - String 值的初始偏移量。count - String 值的长度。
(2)将字符串转成字符数组。
        public char[] toCharArray() 将此字符串转换为一个新的字符数组。该方法不需要参数,因为方法是被字符串调用的,里面用的是this。
(3)将字节数组转成字符串。
    构造函数
        public String(byte[] byter) 将指定字节数组转成字符串。
        public String(byte[] byter,int offset,int count) 将字节数组中的一部分转成字符串。
(4)将字符串转成字节数组。
        public byte[] getBytes()
    特殊:
        字符串和字节数组在转换过程中,是可以指定编码表的。但凡想做编码操作时,变成字节数组才可以,字符不行。
(5)将基本数据类型转成字符串。
        public static String valueOf(int i)重载方法没有byte和short类型,它们会自动提升为int型。
    注意:
        将基本数据类型转成字符串的另一种方法 +""。3+"";'a'+"";true+"";
4.替换
    public String replace(char oldchar,char newchar);
        返回的是一个新字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。如果要替换的字符不存在,返回的还是原串。
    public String replace(CharSequence target,CharSequence replacement)
        -target目标;-replacement交换者; CharSequence 可以接收 String/StringBuffer/StringBuilder
5.切割
    public String[] split(String regex) 返回的是一个字符串数组,数组中元素是被分割的字符串。
        注:"kkaabbkkcc"切割"kk"后数组长度是3,因为第一个"kk"把字符串切割为一个空字符串和后面的字符串。
            "aabbkkcckk"切割"kk"后数组长度是2,最后一个"kk"完成了切割,没有空字符串。
6.子串。获取字符串中的一部分。
    public String substring(int beginIndex);
        返回一个新的字符串,从指定位置开始到结尾。其实调用的是 s.substring(beginIndex,s.length());
    public String substring(int beginIndex,int endIndex);
        返回一个新字符串,包含头,不包含尾。该子字符串的长度为 endIndex-beginIndex。
7.其它
(1)将字符串转成大写或则小写。
    public String toUpperCase() 将此 String 中的所有字符都转换为大写
    public String toLowerCase() 将此 String 中的所有字符都转换为小写
(2)将字符串两端的多个空格去除。
    public String trim() 返回字符串的副本,忽略前导空白和尾部空白。如果没有空白返回的还是这个字符串。
(3)对两个字符串进行自然顺序的比较。
    int compareTo(String anotherString)
        如果参数字符串等于此字符串,则返回0;如果此字符串按字典顺序小于字符串参数,则返回一个负数;否则则返回一个正数。该比较基于字符串中各个字符的Unicode值。当字符串长度不同但短字符串的全部与长字符串开    头部分相同时,则返回这两个字符串长度的差。
(4)对两个字符串进行自然顺序的比较,不考虑大小写
        public int compareToIgnoreCase(String str)
        此方法不考虑语言环境,因此可能导致在某些语言环境中的排序效果不理想。java.text包提供 Collator 类完成与语言环境有关的排序。

代码示例:
模拟一个trim方法,去除字符串两端的空格。
思路:
    (1)判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。结尾处判断空格也是如此。
    (2)当开始和结尾都判断到不是空格时,就是要获取的字符串。

 1 class StringTest
 2 {
 3     public static void main(String[] args)
 4     {
 5         String s = "      ab cd      ";
 6         System.out.println("("+s+")");
 7         s = myTrim(s);
 8         System.out.println("("+s+")");
 9     }
10     public static String myTrim(String str)
11     {
12         //定义两个变量赋值为字符串的头尾角标
13         int start = 0,end = str.length()-1;
14         //从前向后判断是否是空格
15         while(start<=end && str.charAt(start)==' ')
16             start++;
17         //从后向前判断是否是空格
18         while(start<=end && str.charAt(end)==' ')
19             end--;
20         return str.substring(start,end+1);
21     }
22 }


获取两个字符串中最大相同子串。第一个动作:将短的那个串进行长度一次递减的子串打印。"abcwerthelloyuiodef"和"cvhellobnm"
思路:
(1)将短的那个子串按照长度递减的方式获取到。
(2)将每次获取到的子串去长串中判断是否包含,如果包含,已经找到

 1 class  StringTest
 2 {
 3     public static void main(String[] args)
 4     {
 5         String s1 = "ab";
 6         String s2 = "cvhellobnm";
 7         System.out.println(getMaxSubString(s2,s1));
 8     }
 9     public static String getMaxSubString(String s1,String s2)
10     {
11 
12    //判断那个字符串长度较大,赋给max
13         String max = "",min = "";
14         max = (s1.length()>s2.length())?s1: s2;
15         min = (max==s1)?s2: s1;
16 
17   //对较短字符串进行截取,共有min.length()-1个长度不同的子串
18         for(int x=0; x<min.length(); x++)
19         {
20 
21     //从长到短获取这些子串
22             for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)
23             {
24                 String temp = min.substring(y,z);
25                 //System.out.println(temp);
26 
27       //判断如果包含在长的字符串中就返回该子串
28                 if(max.contains(temp))//if(s1.indexOf(temp)!=-1)
29                     return temp;
30             }
31         }
32 
33   //如果没有则返回一个空字符串
34         return "";
35     }
36 }

 


####################################################################################
三 StringBuffer    
####################################################################################

1.概念
    StringBuffer是字符串缓冲区。它是一个容器。很多方法与String相同。StringBuffer可以对字符串内容进行增删。字符串的组成原理就是通过该类实现的。StringBuffer可以操作多种数据类型,有 int.long.float.double.boolean.char.char[].char[]的子数组.String.StringBuffer.Object 等。但是操作的是它们的字符串表现形式。
    
特点:
    (1)长度是可变化的。
    (2)可以直接操作多个数据类型。
    (3)最终会通过toString方法变成字符串。

2.常见操作
    C create U update R read D delete
    
(1)存储。
    public StringBuffer append(数据) 将指定数据的字符串表示形式作为参数添加到已有数据结尾处。
    public StringBuffer insert(int index,数据) 可以将数据插入到指定index位置。
    
注意:        
    StringBuffer sb=new StringBuffer();
    sb.append("abc").append("34").append(true).insert(1,"qq");
    打印结果"aqqbc34true"。
    方法调用链:方法返回来的还是本类对象,所以还能调用本类方法,一连串的调用。
    
(2)删除。
    public StringBuffer delete(int start,int end):删除缓冲区中的数据,包含start,不包含end。
    public StringBuffer deleteCharAt(int index):删除指定位置的字符,其实就是调用StringBuffer delete(int index,int (index+1));
    
注意:
    清空缓冲区    sb.delete(0,sb.length());
    
(3)获取。
    public char charAt(int index)
    public int indexOf(String str)
    public int lastIndexOf(String str)
    public int length()
    public String substring(int start)
    public String substring(int start, int end) //包含start,不包含end
    public String toString() 返回此序列中数据的字符串表示形式。
    
(4)修改。
    public void setCharAt(int index, char ch) 将给定索引处的字符设置为 ch
    public StringBuffer replace(int start,int end,String str)使用给定String中的字符替换此序列的子字符串中的字符包含头,不包含尾。
    
(5)反转。
    public StringBuffer reverse();
    
(6)将缓冲区中指定数据存储到指定字符数组中。
    public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
        -srcBegin 从此偏移量处开始复制;-srcEnd 在此偏移量处停止复制;-dst 用来保存复制数据的数组;-dstBegin dst中的偏移量。

注意:
    StringBuffer sb=new StringBuffer();
    StringBuffer sb1=sb.append(34);
    System.out.println(sb==sb1);
    打印结果true。StringBuffer调用append方法后返回的还是原来的StringBuffer对象,sb和sb1指向同一个对象。


◆◆◆【3.JDK1.5新特性-StringBuilder】◆◆◆
JDK1.5版本之后出现了StringBuilder.可以提高效率。

StringBuffer 和 StringBuilder 的区别:
StringBuffer是线程同步。StringBuilder是线程不同步。以后开发,建议使用StringBuilder。当StringBuilder的实例用于多个线程时,可以使用StringBuilder和Lock自己加锁。


####################################################################################
四 基本数据类型对象包装类
####################################################################################

1.概述
(1)分类
    byte        Byte
    short      Short
    int          Integer
    long        Long
    boolean   Boolean
    float        Float
    double    Double
    char       Character

(2)作用与好处
作用:
基本数据类型对象包装类的最常见作用:就是用于基本数据类型和字符串类型之间做转换
好处:
将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据。

2.常见方法
按照类型划分方法,以 Integer 为例

2.1 int 转成 Integer
        (1)public Integer(int value) 构造方法
        (2)public static Integer valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例。

2.2 int 转成 String
        (1)基本数据类型+""
        (2)public static String toString(int i) 返回一个表示指定整数的 String 对象。如 Integer.toString(34);
        (3)十进制转成其他进制(变成了字符串表现形式)。
            public static String toBinaryString(int i);
            public static String toHexString(int i);
            public static String toOctalString(int i);
            static String toString(int i, int radix); 返回用第二个参数指定基数表示的第一个参数的字符串表示形式。

2.3 Integer 转成 int
        public int intValue()      以 int 类型返回该 Integer 的值。

2.4 Integer 转成 String
        public String toString() 返回一个表示该 Integer 值的 String 对象。

2.5 String 转成 Integer
        (1)public Integer(String s) 构造方法
        (2)public static Integer valueOf(String s) 返回保存指定的 String 的值的Integer 对象。
        (3)static Integer valueOf(String s, int radix)
              返回一个 Integer 对象,该对象中保存了用第二个参数提供的基数进行解析时从指定的 String 中提取的值。

2.6 String 转成 int
        (1)public static int parseInt(String s)  throws NumberFormatException 必须传入数字格式的字符串;
          如果字符串不包含可解析的整数抛出该异常。
        (2)其他进制转成十进制。
            public static int parseInt(String s, int radix) s-radix的进制表现形式;radix-进制,如果不写默认传的是10
            例:static int parseInt("3c",16) 结果为60

◆◆◆【3.JDK1.5新特性-自动装箱与拆箱】◆◆◆
    Integer x = new Integer(4);
        可以直接写成
    Integer x = 4;
        自动装箱。//new Integer(4)
    x=x+2;
        自动拆箱。//x = x/* x.intValue() */ + 2;
        x自动拆箱。通过intValue方法变成成了int类型。和2进行加法运算。再将和进行自动装箱并赋给x。
注意:
    (1)Integer 比 int 多了一个 null 值,定义的变量是一个引用型变量,它除了可以取整数值还可以等于null。如当x=null时,x=x+2;
        会抛出空指针异常 NullPointerException (该异常属于 RuntimeException 异常),所以需要进行判断,不为空时才能进行运算。
    (2)
        Integer m = 128;
        Integer n = 128;
        sop("m==n:"+(m==n));
        打印结果为false,因为是两个对象。
        Integer a = 127;
        Integer b = 127;
        sop("a==b:"+(a==b));
        打印结果为true。a和b指向了同一个Integer对象。对于新特性,当数值在byte范围内时,如果该数值已经存在,则不会再开辟新的空间。

       

posted @ 2013-10-13 22:27  赵晨光  阅读(320)  评论(0编辑  收藏  举报
---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ------- --------------- 详细请查看:http://edu.csdn.net