黑马程序员——Java String类 and 正则表达式(第七篇)

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


虽然老毕视频中把正则表达式放到了最后面才讲,但个人认为他和String功能上有些相似的地方,而且正则表达式也算是一种独立语言,放到哪里写都可以

所以本章分两节,前面记录String后面总结正则表达式!



    String

Java String类

字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串。

 

创建字符串

创建字符串最简单的方式如下:


String s = "Hello world!";


在代码中遇到字符串常量时,这里的值是"Hello world!",编译器会使用该值创建一个String对象。

和其它对象一样,可以使用关键字和构造方法来创建String对象。

String类有11种构造方法,这些方法提供不同的参数来初始化字符串,比如提供一个字符数组参数:




string类 特点

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

例:

        String s1=“abc”

        String s2 = new String“abc”);

        String s3=“abc”


string类中“==”与equals的区别


解释一下==号,他比较的是一个对象在内存中的地址值,
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。

equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。

在Object类源码中是这样写的。
public boolean equals(Object obj)
 {
 return (this == obj);
}


他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
 
public boolean equals(Object anObject) {
 if (this == anObject)
 {
     return true;
 }
 if (anObject instanceof String) {
     String anotherString = (String)anObject;
     int n = count;
     if (n == anotherString.count) {
  char v1[] = value;
  char v2[] = anotherString.value;
  int i = offset;
  int j = anotherString.offset;
  while (n-- != 0) {
      if (v1[i++] != v2[j++])
   return false;
  }
  return true;
     }
 }
 return false;
    }

------------------------------------------------------------------
  练习题: String s1=“abc”;
                 String s2=new String(“abc”);
                 s1与s2有什么区别?

 答案:s1代表一个对象,s2代表两个对象

-------------------------------------------------------------------



string类 常见操作方法


1、获取

返回类型 方法描述
int    length()://获取长度。
char   charAtint  index)://当访问到字符串中不存在的角标时,会发生字符串角标越界的错误。
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、判断


序号 方法描述
boolean   booleancontainsstr);//字符串中是否包含某一个子串
boolean   booleanifEmpty()//原理就是判断长度是否为0
boolean

  booleanstartsWithstr);//字符串是否是以指定内容开头

boolean   booleanendsWithstr);//字符串是否是以指定内容结尾,    str.endsWith(".java");
boolean   booleanequalsstr);//判断字符串内容是否相同,复写了Object类中的equals方法
boolean   booleanequalsIgnoreCase();//2.6判断内容是否相同,并忽略大小写。
   

 

  indexof() 与 contains()区分:

  indexof() 既可以判断又可以拿到指定字符串的位置!




String类中常用转换函数:


        3.1 将  字符数组 ---> 字符串

             构造函数:   String (char[])

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

             静态方法:

                                 static String copyValueOf(char[])

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

                                 static String valueOf(char[])


       将    字符串   ---->  字符数组

                     char[]  toCharArray()

       将     字节数组  ---> 字符串

                      String (byte[])

                      String(byte[],offset,count)//将字节数组中的一部分转成字符串。count表示从第offset开始往后添加的个数。

       将     字符串 --->  字节数组

                      byte[]  getBytes()

       将     基本数据类型--->字符串

                     StringvalueOf(int)

                     StringvalueOf(double)

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

   替换:

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

package jason.replace;  
  
import java.lang.*;  
  
public class StringDemo {  
  
  public static void main(String[] args) {  
    
    String str = "aa黑马aa";  
    System.out.println("string = " + str);  
  
    // replace all 'a' characters with 'b' characters.  
    String replaceStr = str.replace('a', 'b');  
  
    // prints the strings after replacement  
    System.out.println("new string = " + replaceStr);  
  }  
}  

打印结果:

string = aa黑马aa  
new string = bb黑马bb  




5、切割

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

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

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

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

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

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

              StringtoUpperCase();

              String toLowerCase();

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

                   String trim();        

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

              int  compareTo(String);



     StringBuffer


        StringBuffer是一个容器,StringBuffer可以对字符串内容进行增删改查等操作,并且长度是可变,

 

1)特点

        1、而且长度是可变化的。

        2、可以直接操作多个数据类型。

        3、最终会通过toString方法变成字符串。


2)stringBuffer转换问题

 

1、StringBuffer对象的初始化

Java对StringBuffer提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。

例如:

         StringBuffer s = new StringBuffer();

这样初始化出的StringBuffer对象是一个空的对象。

如果需要创建带有内容的StringBuffer对象,则可以使用:

         StringBuffer s = new StringBuffer(“abc”);

需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:

         StringBuffer s = “abc”;               //赋值类型不匹配

         StringBuffer s = (StringBuffer)”abc”;    //不存在继承关系,无法进行强转

StringBuffer对象和String对象之间的互转的代码如下:

         String s = “abc”;

        StringBuffer sb1 = new StringBuffer(“123”);

         StringBuffer sb2 = new StringBuffer(s);   //String转换为StringBuffer

        String s1 = sb1.toString();              //StringBuffer转换为String

 

2)常见操作


        StringBuffer append();                //将指定数据作为参数添加到已有数据的结尾处。

        StringBuffer insert(intoffset ,数据); //可以将数据插入到指定offset位置。

        StringBuffer    delete(start,end)  删除缓冲区中的数据,包含start,不包含end

        StringBuffer    deleteCharAt(index)   删除指定位置的字符。

        清空缓冲区:对象.delete(0,对象.length());

        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 str);//修改

        void setCharAt(int index,char ch)

        StringBuffer reverse();// 反转

        void getChars(int srcBegin, int srcEnd,char[] dst,int dstBegin) ;//将缓冲区中指定数据存储到指定字符数组中


        注意:在JDK1.5版本之后出现了StringBuilder

        StringBuffer是线程同步的。有锁。效率低

        StringBuilder是线程不同步的。无锁。效率高


        开发中建议使用StringBuilder。如遇多线程,使用StringBuffer或用StringBuilder自己加锁。


        1、提高效率

        2、简化书写

        3、提高安全性。

 


 

一、基本数据类型对象包装类。

        byte        ---    Byte

        short       ---    Short

        int           ---    Integer

        long         ---    Long

        boolean    ---    Boolean

        float         ---    Float

        double      ---    Double

        char         ---    Character

      

          注意 String不属于基本数据类型

 

二、基本数据类型转成字符串

       1) 基本数据类型+ "... "

       2) 类型.toString()         

        如:Integer.toString(88);//整数88变成"88"

 

三、字符串转成基本数据类型。

         xxx a=Xxx.parseXxx(string);//必须传入对应类型的字符串。

           inta=Integer.parseInt("123");//静态

        booleanb=Boolean.parseBoolean("true");

        Integeri=new Integer("123");

        intnum=i.intValue();//跟上面的静态方式的结果一样,但这种属于对象调用方式。

注意:

        在使用时,Integer  x = null;上面的代码就会出现NullPointerException

 

十进制转成其他进制。

         toBinaryString();

         toHexString(); 

         toOctalString();

 

五、其他进制转成十进制。

         parseInt(String,radix);

         如:int a= Intager.parseInt("3c",16);

JDK1.5版本以后出现的新特性。

                         Integer x=new Integer(4);

         等效于:Integer x=4;//自动装箱。

        还可以直接进行运算:x=x+2;//x进行自动拆箱。变成了int类型。和2进行加法运算。再将和进行装箱赋给xx的拆箱动作等效:x.intValue()

 

六、示例

        Integer x=128;

        Integer y=128;

        x==y   false

        Integer m=127;

        Integer n=127;

        m==n  true

原因:

        因为mn指向了同一个Integer对象。因为当数值在byte范围内,对于新特性,如果该数组已经存在,则不会再开辟新的空间。

 



正则表达式


在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。


常用正则表达式匹配格式:

匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字

匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位

匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用



懒惰限定符
代码/语法说明
*?重复任意次,但尽可能少重复
+?重复1次或更多次,但尽可能少重复
??重复0次或1次,但尽可能少重复
{n,m}?重复n到m次,但尽可能少重复
{n,}?重复n次以上,但尽可能少重复


Matcher   Pattern

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值