Java字符串

来源:互联网 发布:ios java 编辑:程序博客网 时间:2024/06/05 06:52

一 概念

字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。它是编程语言中表示文本的数据类型。String类适用于描述字符事物,那么它就提供了多个方法对字符串进行操作。那么常见的操作有哪些?

字符串常见操作:

  1 String类构造函数
     String(byte[ ] bytes)//通过byte数组构造字符串对象
     String(char[ ] value)//通过char数组构造字符串对象
     String(String str)//构造一个str副本。即:拷贝一个str
     String(StringBuffer buffer)//通过StringBuffer数组构造字符串对象。  
     例如:
      byte[] b = {'a','b','c','d','e','f','g','h','i','j'};
     char[] c = {'0','1','2','3','4','5','6','7','8','9'};

      String s1 = new String(b);//abcdefghij
      String s2 = new String(b,3,2);//de
      String s3 = new String(c);//0123456789
      String s4 = new String(c,3,2);//34
      String s5 = new String(sb);//abcdefghij  
      System.out.println("s1:"+s1);
     System.out.println("s2:"+s2);
     System.out.println("s3:"+s3);
     System.out.println("s4:"+s4);
     System.out.println("s5:"+s5);

      输出结果s1:abcdefghij
              s2_sub:de
              s3:0123456789
              s4_sub:34
              s5_copy:abcdefghij

   2 获取
       1)字符串中的包含的字符数,也就是字符串的长度
       2)根据位置获取位置上某个字符Char charAt(int index)
       3)根据字符获取该字符在字符串中的位置:

int indexOf(int ch,int fromIndex);//从fromIndex指定位置开始,获取ch在字符串中出现的位置int indexOf(String str);//返回的是str在字符串中第一次出现的位置int indexOf(String str,int fromIndex)//从fromIndex指定的位置开始,获取str在字符串中出现的位置int lastIndexOf(int ch);获取ch在字符串中最后出现的位置

  3 判断

       1)字符串中是否包含某一个子串。
          boolean contains(String str)
          另外一种判断方法:indexOf(String str);可以索引str第一次出现的位置,如果返回-1,表示该str不在字符串中存在,所以也可以用于对指定判断是否包含。
          例: if(str.indexOf("a")!=-1);//而且该方法既可以判断,又可以获取出现的位置。
       2)字符中是否有内容:
           boolean isEmpty();//其实就是判断长度是否为0
       3)字符串是否已指定内容开头
           boolean startsWith(String str)
       4)字符串是否以指定内容结尾。
           boolean endsWith(String str);
       5)判断字符串内容是否相同。复写了Object类中的equals方法。
           boolean equals(String str);
       6)判断内容是否相同,并忽略大小写。
           boolean equalsIgnoreCase();

  4 转换:

     1)将字符数组转换成字符串。
构造函数:  
              
String(Char[ ] value)String(Char[ ] value,int offset,int count)//将字符数组中的一部分转成字符串

  注意:字符串和字节数组在转换过程中,是可以指定编码表的。
  5 替换
  Stirng replace(Char oldchar) 
  6 切割
  split(regex)

  7 子串

  获取字符串中的一部分
  String subString(int begin)
  String subString(int begin,int end)

  8 转换,去除空格 比较

     1)将字符串转换成大写或者小写
          String toUpperCase()
          String toLowerCase()  
             
     2)将字符串两端的多个空格去除   
          String trim()
     3)对字符串进行自然顺序比较    
          int compareTo()           
   提示:功能尽量独立出来(写成一个方法)变成一个小的函数,它被调用就可以被其他很多的方法调用。
   9 返回一个字符数组或字节数组
     toCharArray()//
是String类都有的toString方法
     getBytes()//该方法返回一个用某字符集将此String解码为byte数组
   10 String类中的toString()方法与ByteArrayStream类中的toString()方法的区别
      String类与ByteArrayStream类都有toString()方法,它们之间的区别:
      String类的toString()方法是返回对象本身。
      ByteArrayStream类的toString()方法是使用某编码表,通过解码字节返回一个字符串。
练习:将字符串反转
思路:1.将字符串变成数组
      2.对数组反转
      3.将数组变成字符串      
public class Test {public static void main(String args[]){System.out.println(reverseString("一二三四五六七"));}public static String reverseString(String s) {char[] chs = s.toCharArray();reverse(chs);return new String(chs);}private static void reverse(char[] arr) {// TODO Auto-generated method stubfor (int start = 0, end = arr.length - 1; start < end; start++, end--) {swap(arr, start, end);}}private static void swap(char[] arr, int start, int end) {// TODO Auto-generated method stubchar tmp = arr[start];arr[start] = arr[end];arr[end] = tmp;}}
打印结果为:

七六五四三二一

二 字符串在内存中的对象个数
String s1="abc"
String s2=new String("abc");

问:s1和s2之间有什么区别
答:s1在内存中有一个对象,s1是一个类型变量,"abc"是一个对象,字符串最大的特点:一旦被初始化就不可以被改变(不是指s1不可以被改变)。s2在内存中有两个对象(new是一个,”abc”是一个)。

三 基本数据类型及其包装类与String类之间的转换

1 基本类型转化成字符串有三种方法

   1) 使用String的valueOf方法
   2) 将基本数据类型封装为对象,再调用对象的toString方法
   3) 用一个空字符串加上基本类型,得到的就是基本类型数据对应的字符串。

2 字符串转换成基本类型有两个方法

   1) 调用基本类型封装类的parseXxx静态方法。
   2) 用字符串构造基本类型的封装对象,再调用封装对象的xxxValue方法。
例子程序如下:
package com.kid.string;public class BasicTypeToString {public String int2str(int n) {        //3种转换方法实现转换        //第一种        //return new Integer(n).toString();        //第二种,注意""中间没有空格        //return "" + n;        //第三种        return String.valueOf(n);    } public int str2int(String str) {        //2种方法实现转换        //第一种        //return new Integer(str).intValue();        //第二种        return Integer.parseInt(str);    } public String double2str(double d) {        //return new Double(d).toString();        //return "" + d;        return String.valueOf(d);    } public double str2double(String str) {        //return new Double(str).doubleValue();        return Double.parseDouble(str);    }    //其他基本类型与字符串相互转化这里不一一列出,方法都类似 public static void main(String[] args) {        BasicTypeToString test = new BasicTypeToString();        int n = 123;        String str1 = test.int2str(n);        System.out.println("test.int2str(n) = " + str1);        System.out.println("test.str2int(str) = " + test.str2int(str1));                double d = 12.345;        String str2 = test.double2str(d);        System.out.println("test.double2str(d) = " + str2);        System.out.println("test.str2double(str) = " + test.str2double(str2));    }}
打印结果为:
test.int2str(n) = 123test.str2int(str) = 123test.double2str(d) = 12.345test.str2double(str) = 12.345

四 StringBuffer与StringBuilder类
 1.StringBuffer:

   是一个容器,特点:
       1)长度是可以变化的
       2)可以字节操作多个数据类型
       3)最终会通过toString方法变成字符串
存储:
                                    
StringBuffer append();//将指定数据作为参数添加到已有数据结尾处StringBuffer insert(intdex,数据)//可以将数据插入待指定index位置。

删除:

StringBuffer delete(int start,int end)//删除缓冲区中的数据,包含start,不包含endStringBuffer deleteCharAt( int index)//删除指定位置的字符

获取:                                

Char charAt(int index)int indexOf(String str)int lastIndexOf(String str)int length()String subString(int start,int end)

修改:                       

StringBuffer replace(int start,int end,String)void setCharAt(int index,char ch)

反转:

StringBuffer reverse(String str)

将缓冲区中指定数据存储到指定字符数组:

void getChars(int srcBegin,int srcEnd,char[] dest,int destBegin)

 2.StringBuilder
     JDK1.5版本之后出现了StringBuilder
     StringBuffer是线程同步的
     StringBuilder是线程不同步的
     以后开发建议使用StringBuidder     
     StringBuilder的方法基本和StringBuffer一样。
     JDK升级的三个主要因素:
     1.提高效率 2.简化书写 3.提高安全性

五 字符编码集

    主要的字符编码集 ASCII utf-8  Unicode(UTF-16) gbk  gb2312 ISO8859-1之间的区别和特点:
    ASCII: 美国(国家)信息交换标准(代)码,一种使用7个或8个二进制位进行编码的方案,最多可以给256个字符(包括字母、数字、标点符号、控制字符及其他符号)分配(或指定)数值。
     UTF-8:是基于unicode的 国际化的场合适合使用,为了提高Unicode的编码效率,于是就出现了UTF-8编码。UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。
     Unicode(UTF-16):如果有一种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象。每个符号对应一个唯一的编码,乱码问题就不存在了。这就是Unicode编码。
    GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
   
GBK、GB2312--Unicode--UTF8
     UTF8--Unicode--GBK、GB2312
  gb2312:
是国标码 出现的较早 主要用于编解码常用汉字 
  gbk:gb2312的出现,基本满足了汉字的计算机处理需要,但对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。
  ISO8859-1:ISO/IEC8859-1,又称Latin-1或“西欧语言”,是国际标准化组织内ISO/IEC 8859的第一个8位字符集。它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入96个字母及符号,藉以供使用变音符号的拉丁字母语言使用。(印象中tomcat使用的是此字符集编码和解码)。

六 关于字符编码集的经典“联通问题”

 “联通”问题:
    记事本中输入“联通”二字默认使用ANSI(GB系列)编码GB中联通对应的字节为:联:1100000110101010  ;通:1100110110101000.
   当保存再打开时,记事本读到:110x xxxx 10xxxxxx 会以为“联”与“通”都是用UTF-8编码故用UTF-8译码再将其译为对应的unicode 联:0000 0000 0110 1010 对应0x006A 通:0000 001101 10 1000对应0f0368
    0x006A这个Unicode编码值位于\u0001-\u007E之间,若要转换为UTF-8编码,显然只能用于一个字节进行编码(实际上“联”用了两个字节编码),因此“联”的GBK编码“C1AA”虽然特征上貌似UTF-8编码,但它却不对应任何一个UTF-8编码。接着0x0386这个Unicode编码值,这个值对应了一个乱码字符,这也是在记事本上看到的内容。


                   


0 1
原创粉丝点击