16.Java中的String详解

01.String(概述)

字符串是一个特殊对象。
字符串最大特点:一旦被初始化就不可以改变。

==是比较两个对象。而equals是比较对象引用的地址值。
String类复写了Object类中的equals方法,该方法用于判断字符串是否相同。
s1和s2的区别?
String s1="abc";
String s2=new String("abc");
s1有一个对象,s2有两个对象。

02.String(常见功能-获取和替换)

String类是用于描述字符串事物的,那么他就提供了多个方法对字符串进行操作。
常见操作:
1.获取。
 1.1:字符串中包含的字符数,也就是字符串的长度。
 int length();获取长度
 1.2:根据位置获取位置上的某个字符。
 char CharAt(int index);
 1.3:根据字符获取该字符在字符串中的位置。
 int indexOf(int ch);返回的是ch在字符串中第一次出现的位置。
 int indexOf(int ch,int fromIndex);从fromIndex指定位置开始,获取ch在字符串中的位置。
 int indexOf(String str);返回的是str在字符串中第一次出现的位置。
 int indexOf(String str,int fromIndex);从fromIndex指定位置开始,获取str在字符串中的位置。
注意:当访问到字符串中不存在的角标时,会发生StringIndexOutOfBoundsException角标越界。
 int lastIndexOf(int ch);和indexOf相反,从右往左查找。
2.判断。
 2.1:字符串中是否包含某一个字串。
 boolean contains(String str);
 特殊之处:indexOf(string str):可以索引str第一次出现位置,如果返回-1,表示str不在字符串中存在,所以也可以用于对指定判断是否包含;所以该方法即可以判断,又可以获取出现位置。
 2.2:字符串中是否有内容。
 boolean isEmpty();就是判断长度是否为0;
 2.3:字符串是否以指定内容开头。
 boolean startsWith(String str);
 2.4:字符串是否以指定后缀结尾。
 
 2.5:判断字符串内容是否相同,复写了Object类中的equals()方法。
 boolean equals(String str);
 2.6:判断内容是否相同,并忽略大小写;
 boolean equalsIgnoreCase();

03.String(转换)

3.1:将字符数组转换成字符串。
构造函数:String(char());String(char[],offset,count);将字符数组中的一部分转成字符串。char[]是字符数组,offset是开始位置,count是个数。
静态方法:static String copyValueOf(char[] data,int offset,int count);
3.2:将字符串转成字符数组。
char[] toCharArray();
3.3:将字节数组转成字符串。
String(byte());String(byte[],offset,count);将字字节数组中的一部分转成字符串。char[]是字节数组,offset是开始位置,count是个数。
3.4:将字符串转成字节数组。
byte[] getBytes();
3.5:将基本数据类型转成字符串。static String valueOf(int);static String valueOf(double);

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

04.String-切割和替换

替换:String replace(oldchar,newchar);如果要替换子字符不存在,返回的是原串。

切割:String[] split(regex);

字串:获取字符串中的一部分。
String substring(begin);从指定位置开始到结尾。如果角标不存在,会发生角标越界异常。
String substring(begin,end);包含头,不包含尾。

05.String-转换-去除空格-比较

1.将字符串转换成大写或小写。
String toUpperCase();String toLowerCase();
2.将字符串两端的空格去掉;
String trim();
3.对两个字符串进行自然顺序的比较。
boolean compareTo(String);

06.String-字符串练习1

需求:
模拟一个trim方法,去除字符串两端的空格
思路:
判断字符串第一个位置是否是空格,如果是继续向下判断,知道不是空格为止。判断结尾处空格也是如此。
当开始和结尾都判断不是空格时,就是要获取的字符串。

class TrimDemo
{
 //判断字符串前空格的截止位置
 private int getStartIndex(String str)
 {
  int index=0;
  while(index<=str.length()-1&&str.charAt(index)==' ')
  {
   index++;
  }
  return index;
 }
 //判断字符串后空格的截止位置
 private int getLastIndex(String str)
 {
  int index=str.length()-1;
  while(index>=0&&str.charAt(index)==' ')
  {
   index--;
  }
  return index;
 }
 //获取去掉前后空格的字符串
 public String getTrim(String str)
 {
  int startIndex=getStartIndex(str);
  int lastIndex=getLastIndex(str);
  return str.substring(startIndex,lastIndex+1);
 }
}
class TrimTest
{
 public static void main(String[] args)
 {
  String str="   许前刚   ";
  System.out.println("去空格前的字符串为:");
  System.out.println(str);
  System.out.println("去空格后的字符串为:");
  System.out.println(new TrimDemo().getTrim(str));
 }
}

07.String-字符串练习2

需求:将一个字符串进行反转。将一个字符转指定位置进行反转,“abcdefg”;abedcfg
思路:
曾经学习过对数组元素进行反转
将字符串变成数组,对数组进行反转
将翻转后的数组变成字符串
只要将被翻转的部分的开始和结束位置作为参数传递即可

 //将一个字符串指定部分进行反转
 public static String fanZhuan(String str,int start,int end)
 {
  String str1=str.substring(start,end+1);
  char[] ch=str1.toCharArray();
  for(int i=0;i<=(ch.length-1)/2;i++)
  {
   char temp=ch[i];
   ch[i]=ch[ch.length-1-i];
   ch[ch.length-1-i]=temp;
  }
  //for(int start=0,end=ch.length;start<end;start++,end--)
  //{
  // char temp=ch[start];
  // ch[start]=ch[end];
  // ch[end]=temp;
  //}
  String str2=new String(ch);
  return str.substring(0,start)+str2+str.substring(end+1);
 }

08.String-字符串练习3

需求:
获取一个字符串在另一个字符串中出现的次数。abkkcdkkefkkghkk
思路:
定义一个计数器
获取kk第一次出现的位置
从第一次出现位置后剩余的字符串中继续获取kk出现的位置
每获取一次计数一次
当获取不到时,计数完成

 //获取一个字符串在另一个字符串中出现的次数
 public static int getCount(String fatherStr,String sonStr)
 {
  int count=0;
  int index=0;
  while(true)
  {
   int y=fatherStr.indexOf(sonStr,index);
   if(y!=-1)
   {
    count++;
    index=y+1;
   }
   else
   {
    break;
   }
  }
  //while((index=fatherStr.indexOf(sonStr))!=-1)
  //{
  // fatherStr=fatherStr.substring(index+sonStr.length());
  // count++;
  //}
  return count;
 }

09.String-字符串练习4
需求:
获取两个字符串中最大相同字串。第一个动作:将短的那个串进行长度依次递减的字串打印
思路:
将短的那个字串按照长度依次递减的方式获取到
将每获取到的字串去长串中判断是否包含,如果包含已经找到。
 //获取两个字符串中最大相同字串。
 public static String getMaxSubString(String maxStr,String minStr)
 {
  for(int x=0;x<minStr.length();x++)
  {
   for(int y=0,z=minStr.length()-x;z!=minStr.length()+1;y++,z++)
   {
    String temp=minStr.substring(y,z);
    if(maxStr.contains(temp))
    {
     return temp;
    }
   }
  }
  return "";
 }

10.11.StringBuffer-常见功能

字符串的组成原理就是通过该类实现的
StringBuffer可以对字符串内容进行增删
StringBufffer是一个容器
很多方法与String相同
StringBuffer是可变长度的
特点:
长度是可变的
可以字节操作多个数据类型
最终会通过toString方法变成字符串

(1)存储
StringBuffer append():将指定数据添加到已有数据的结尾处
StringBuffer insert(index,数据):可以将数据插入到指定index位置
(2)删除
StringBuffer delete(int startint end):删除缓冲区中的数据,包含头,不包含尾。delete(0,sb.length());清空缓冲区
StringBuffer deleteCharAt(index):删除指定位置的字符,就是删一个字符。
(3)获取
char charAt(index);根据指定位置获取指定字符。
int indexOf(String str);
int lastIndexOf(String str);
int length();
String substring(int start,int end);
(4)修改
StringBuffer replace(start,end,String str);str是替换成的字符。这是替换一部分。
void setCharAt(index,char ch);替换指定位置的字符
(5)反转
StringBuffer reverse();反转

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):把缓冲区中的指定数据存储到指定数组中。

12.StringBuilder

在JDK1.5版本之后出现了StringBuilder,不同之处在于:StringBuffer是线程同步的,StringBuilder是线程不同步。
建议:多线程用StringBuffer,单线程用StringBuilder
以后开发建议使用StringBuilder

java升级三因素:提高效率;简化书写;提高安全性。

13.基本数据类型对象包装类

byte Byte
short short
int  Integer
long Long
boolean Boolean
float Float
double Double
char Character

基本数据类型对象包装类的最常见作用:
就是用于基本数据类型和字符串之间相互转换。

基本数据类型转字符串:
基本数据类型+"";
基本数据类型.toString(基本数据类型值);如Integer.toString(34):将34转成“34”。
字符串转基本数据类型:
Integer.parseInt(String str);将字符串转换成整数。
Long.parseLong(String str);将字符串转换成长整型数。
以此类推。。。。。。
xxx a=Xxx.parseXxx(String str);必须传入数字格式的字符串
boolean b=parseBoolean(str);

十进制转成其他进制:
toBinaryString()
toHexString()
toOctalString()
其他进制转成十进制:
Integer.parseInt(str,int wei):位代表str所代表的进制,转成十进制。

Integer i=new Integer("123");
int num=i.intValue();
这个是对象调用方式。
上面的是静态调用方式。

14.基本数据类型对象包装类新特性

Integer x=new Integer("123");
Integer y=new Integer(123);
x==y是false
x.equals(y)是true

JDK1.5以后出现以下新特性:
Integer i=4;
自动装箱。
还可以直接进行运算:i=i+2;
自动拆箱,变成int类型,和2进行加法运算,再将和进行拆箱赋给x。
还可以Integer i=null;
但当i=null时,进行运算会出现异常。
Integer x=128;Integer y=128;
(x==y)的值为false
Integer x=127;Integer y=127;
(x==y)的值为true
因为a和b指向了同一个Integer对象,因为当数值在byte范围内时,对于新特性,如果该数值已经存在,则不会开辟新空间。

posted on 2012-04-18 21:21  Barclay.Xu  阅读(11183)  评论(0编辑  收藏  举报