黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用

时间:2022-06-06 17:23:12

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、String

     位于java.lang包中。     

1、概念

         字符串是由许多单个字符连接而成的,它可以由任何字符组成,这些字符必须包含在一对””(双引号)内,这是java语言表示字符串的方法。Java使用java..lang包中的String类来创建字符串对象,因此字符串是一个String类的对象。

2、String类特点

        我们看api文档关于string类的描述:

       1public final class String

final修饰,说明字符串类不可以被继承,里面的方法不可以被复写。String类代表字符串,java程序中的所有字符串都作为此类的实例。

String str=abcString str=new stringabc)有区别吗?

没有区别。

解读一下String str=abc”;

Str是一个类类型变量,它指向一个对象,所以abc是一个对象。字符串是一个特殊的对象

  2)   字符串一旦初始化就不可以被改变

  这是它最大的特点。

   解读一个实例

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

 

打印kk

这是怎么回事呢?

其实,不是对象变化了,而是字符串类型变量s1改变了,它开始指向“abc”这个对象,现在指向“kk”这个对象。

    String str=abc”和string str=new stringabc)虽然一般情况可以通用,但是还是有区别的。

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

 

   黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用

为什么呢?

==比较不相等是可以理解的,因为不是一个对象。

equals比较的是s1s2的地址值,原本是object类的方法,而String类复写了object类中的equals方法,定义自己独特的内容,该方法用于判断字符串是否相同。

  s1 s2有什么区别?面试题

s1在内存中一个对象。

s2在内存中有两个对象。new了一个对象,“abc”又是一个对象。 

 字符串对象在内存中,其实有一个常量池存放的是如“abc”的字符。

比如:创建了一个ab字符串,又创建了一个efg的字符串,如果你又创建了一个abf的字符串,它就在常量池里面分别找abf,拼成abf的字符串。形成对象。

3、String类中常用的方法

      示例:

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

原因

S1在内存的常量池中已经存储了一个”abc,s3再创建对象时,因为字符串是常量,不能被改变,也就没有必要再开辟空间。为节约内存,让S3指向“abc”这个对象即可。

我们学方法区的时候,方法区中都有哪些数据呢?

类的方法,静态数据,还有常量池。

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

   1   获取

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

          int  length();获取长度

        数组也有长度,但是是数组的属性,不是方法

          字符串的长度是方法。

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

           char charAtint index

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

         int   indexOfint ch )返回时ch在字符串中第一次出现的位置

          往里面传的不是char类型,是int

       因为它接收的是ASCII

      重载方法

     int indexOfint chint fromIndex

     返回在此字符串中第一次出现指定字符处的索引,从fromIndex指定的索引开始搜索。

     int indexOfString str

     int indexOfiString strint fromIndex

      返回str的位置

  1.4  int lastIndexOf(int ch)反向索引

     演示:

    黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

 注意事项

charAt(int ):当访问到字符串中不存在的脚标时,会发生StringIndexOutOfBoundsException 字符串脚标越界。

IndexOf(int ch):找不到时,就返回-1

  2 判断

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

       boolean contains(CharSequence  s)   CharSequenc是一个接口,子类有一个是string,还有一个是Stringbuffer

     与indexOf(str)相比:indexOf(str)可以索引str第一次出现位置,如果返回-1标识str不存在。所以,也可以用于对指定判断是否包含

        If(str.indexOf(aa))=-1

        该方法既可以判断,又可以获取位置。

   2.2 字符中是否有内容。

        boolean isEmpty() 原理就是判断长度是否为0,和字符串是否是null有区别

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

        boolean startsWith(String prefix)  

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

        boolean endsWith(String suffix) 

   2.5 判断字符串的内容是否相同

        boolean equals(str)复写object的方法

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

        boolean equalIgnoreCase(str);

   常用:登陆邮箱等

  演示:

  黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用

 

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

 

  3   转换

    3.1 将字符数组转成字符串

         构造函数String(char[])

         构造函数String(char[],offset.count)将字符数组中的一部分转成字符串

         Static String copyValueOf(char[])

         Static string valueOf(char[]) 

    3.2 将字符串转成字符数组

         char[]  toCharArray()  

3.3 将字节数组转成字符串

    IO的时候,要用构造函数String(byte[])

        构造函数String(byte[],offset.count) 

    3.4 将字符串转成字节数组

        byte[] getBytes(Charset charset)     

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

        Static String valueOf()参数   int  double 

        例如  3+“”//等价于string.valueOf(3);  

        构造函数

        Static string copyValueOf(StringBuffer sb)

     特殊:

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

演示:

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

替换

  String replace(char oldChar, char newChar)  

  String replace(CharSequence target, CharSequence replacement) 

          使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。 

 

演示:

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

注意事项:replace():如果要替换的字符不存在,返回的还是原串。被替换后,原串不变,只是将新的对象赋值给String变量而已。

5切割

string[] split(String regex) 

演示:

  黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

 6子串

String substring(int beginIndex) 

String substring(int beginIndex, int endIndex) //包含头,不包含尾

演示:

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

 

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

    7 转换  去除空格  比较

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

          String  toUpperCase(Locale locale)  

          String  toLowerCase(Locale locale) 

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

          String  trim()  

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

          int compareTo(String anotherString)  

演示:

 黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用

 

 黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用

说明:

   compareTo():如果s1=acc,返回2   

     如果小于参数字符串,则返回负数

     如果相等,返回0

     如果大于参数字符串,返回一个大于0的数。

    示例中c>a ,且根据ASCII值,ca2.所以返回2

4、字符串练习1

    1) 模拟一个trim方法,去除字符串两端的空格。

       思路:

        1 判断字符串第一个位置是否是空格,如果是,继续向下判断,直到不是空格为止。结尾处判断空格也是如此。

        2 当开始和结尾都判断到不是空格时,就是要获取的字符串。

程序:

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

 

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

2)将一个字符串进行反转,将字符串中指定部分进行反转,abcdefg;  abfedcg

   思路:

     1 曾经学习过对数组的元素进行反转。

     2 将字符串变成数组,对数组进行反转。

     3 将反转后的数组变成字符串

     4 只要将或反转的部分的开始和结束位置作为参数传递即可。

Java中,从0数到某个位置的字符串,都是包含头,不包含尾。

程序:

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

 

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

3)获取两个字符串中最大相同子串,第一个动作:将短的那个串进行长度一次递减的子串打印。

abcwerthelloyuiodef

  “cvhellobnm

思路

 1 将短的那个子串按照长度递减的方式获取到

 2 将每获取到的子串去长串中判断是否包含。

   如果包含,已经找到!

程序:

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

 

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

二、StringBuffer

  1、概念   

 StrinBuffer是一个字符串缓冲区,是一个容器。被final修饰,不可以被继承。

容器的特点就是对数据的改变,字符串的组成原理就是通过该类实现。

StringBuffer可以对字符串内容进行增删,很多方法与string相同。

  2、缓冲区的特点

    1 StringBuffer是可变长度的。

    2 )可以操作多个数据类型

    3 )最终会通过tostring()方法变成字符串。

 3、常用的方法

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

        StringBuffer insert(int offset, Object obj)在指定位置添加数据

       例如:

    stringBuffer sb=new StringBuffer();

    StringBuffer sb1=sb.append(34);

    System.out.println(sb.toString());//把缓冲区变为字符串

     System.out.println(sb1.toString()); //与上一句结果相同

这就是容器的特点

所以,sb.sppend(abc),返回还是本类对象。所以还能调用方法。

可以这么写

Sb.append(abc).append(abc).append(abc).append(abc);  方法调用链

结果是abcabcabcabc

    2StringBuffer delete(int start, int end);删除从startend位置的数据,包含头,不包含尾

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

    例如:

Public static void method_del()

{

     StringBuffer sb=new StringBuffer(abcde);

    System.out.println(sb.toString());

    Sb.delete(1,3);//返回ade。从第1角标位开始,到第三位,不包括第三位。

      System.out.println(sb.toString());

  Sb.delete(0,sb.length());//清空缓冲区。

}

char charAt(int index) 通过脚标获取字符

    int indexOf(String str) 获取位置

    int lastIndexOf(String str)  

    int length() 获取长度

    String substring(int start)  

    String substring(int start, int end) 记住,返回的是string

 4 StringBuffer replace(int start, int end, String str) 

 参数:头,尾,被替换的内容

void setCharAt(int index, char ch) 在指定位置替换一个字符 

 注意:返回值是空

 public static void method_update()

{

         StringBuffer sb=new StringBuffer(abcde);

   sb.replace(1,4,java);//ajavae

  sb.setCharAt(2.k);

}

5) StringBuffer reverse() 反转

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

三、StringBuilder

   1、概念

    StringBuilder类:线程安全的可变字符序列。在jdk1.5版本以后出现的。一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

  2、与stringBuffer的不同:

  StringBuffer是线程同步的。StringBuilder是线程不同步,意味着不安全。

  一般使用stringBuilder。如果是单线程,stringBuffer效率低。而stringBuilder

 所以,多线程建议使用stringBuffer,单线程建议使用stringBuilder。但也可以自己加锁 lock

  小知识:

    Java升级一般有三种原因:提高效率简化书写安全性

stringBuilder是为提高效率而升级的

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

    按照java面向对象原则,万事万物都是对象。包括基本数据类型。

比如int类型,有自己的取值范围,有多种表现形式等等

怎么把十进制表现为其他进制表现形式呢?只有int类型最清楚

java就把这些基本数据类型全部封装成为对象

五、 基本数据类型对象包装类

  1、基本数据类型对象对应包装类

  基本类型        类类型

  byte类型————Byte  

  short类型————Short

  Int类型————Integer

  long类型———Long

  Boolean————Boolean

  Float——————-Float

  Double————Double

  Char————Character

Integer为例

属性

static int MAX_VALUE 

          值为 231的常量,它表示 int 类型能够表示的最大值。 

static int MIN_VALUE 

          值为 -231 的常量,它表示 int 类型能够表示的最小值。 

static int SIZE 

          用来以二进制补码形式表示 int 值的比特位数。 

static Class<Integer> TYPE 

          表示基本类型 int 的 Class 实例。 

  有了对象,我们在程序中就不必自己运算最大值。

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

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

  基本数据类型+””

专业做法

  String    toString(基本数据类型值)  这不是object里面的方法,是integer覆盖的方法

  Static  String toString(int i)  

Integer.toString(34);

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

应用:上网时,在文本框中输入,如果输入年龄24.在文本框中输入的都是字符串,我们需要把字符串的年龄转换为数字。

static int parseInt(String s, int radix)  

1)将一个字符串转为整数

Int num=integer.parseInt(124);//必须传入数字格式的字符串。

构造函数也可以完成。

特殊:

2Boolean 转换

Static boolean parseBoolean(String s)

3)十进制转成其他进制

toBinaryString();

toHexString();

toOctalString();

4)其他进制转成十进制

static int parseInt(String s, int radix) 

parseInt(110,2);

4Jdk1.5版本以后出现的新特性——自动装箱和拆箱

Integer x=4;

x是引用数据类型。右边是一个对象。这叫做自动装箱。

这个升级是为简化书写

还有X=x+2;

x+2  x进行了自动拆箱,变成int类型,和2进行加法运算,再将和进行装箱赋值给x

还有需要注意的是

Integer x=null;可以为空。

所以做运算时,需要判断。

小的新特性

Integer m=128;

Integer m=128;

Integer m=127

Integer n=127;

因为ab指向了同一个Integer对象。

因为数值在byte范围内,对于新特性,如果该数值已经存在,不会再开辟新的空间。

六、正则表达式

1、概述

  正则表达式是一种描述字符串集的方法,是以字符串集合中各字符串的共有特征为依据的。在程序开发中,正则表达式被广泛地应用在字符串的查找、替换、匹配等情况下,因此灵活地使用正则表达式对程序员来说非常重要。正则表达式中含有一些特殊意义的字符,这些字符称为正则表达式的元字符,例如,“\\d”表示字母0-9中的任何一个,\d就是元字符。

  2、常见符号

    说明:X表示字符X或者匹配的规则。

     1)字符

        x                  字符x

        \\                 反斜线字符

        \t                 制表符('\u0009')

        \n                 新行(换行)符('\u000A')

        \r                 回车符('\u000D')

        \f                 换页符('\u000C')

        \a                 报警(bell) ('\u0007')

   2)字符类

        [abc]                    abc(简单类)

        [^abc]                 任何字符,除了abc(否定)

        [a-zA-Z]               azZ,两头的字母包括在内(范围)

        [a-d[m-p]]            adp[a-dm-p](并集)

        [a-z&&[def]]               def(交集)

        [a-z&&[^bc]]        az,除了bc[ad-z](减去)

        [a-z&&[^m-p]]     az,而非mp[a-lq-z](减去)

  3)预定义字符类

        .                         任何字符(与行结束符可能匹配也可能不匹配)

        \d                        数字:[0-9]

        \D                       非数字:[^0-9]

        \s                        空白字符:[ \t\n\x0B\f\r]

        \S                       非空白字符:[^\s] 

        \w                       单词字符:[a-zA-Z_0-9]

        \W                      非单词字符:[^\w]

  4)边界匹配器

        ^                         行的开头

        $                         行的结尾

        \b                        单词边界

        \B                       非单词边界

        \A                       输入的开头

        \G                       上一个匹配的结尾

        \Z                       输入的结尾,仅用于最后的结束符(如果有的话)

        \z                        输入的结尾

5Greedy数量词

        X?                       X,一次或一次也没有

        X*                       X,零次或多次

        X+                       X,一次或多次

        X{n}                    X,恰好n

        X{n,}                   X,至少n

        X{n,m}                X,至少n次,但是不超过

6)组和捕获

       捕获组可以通过从左到右计算其开括号来编号。例如,在表达式((A)(B(C)))中,存在四个这样的组:

                    1     ((A)(B(C)))

                    2     \A

                    3     (B(C))

                    4     (C)

       组零始终代表整个表达式。在替换中常用$匹配组的内容。

3、常见功能

     1)匹配:String类中的booleanmatches(String regex)方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false

   黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用

2)切割:String类中的String[]split(String regex)方法。

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用 

  按叠词完成切割:为了让规则被重用,可将规则封装成一个组,用()完成。组的出现都有编号,从1开始。想要使用已有的组可通过\nn就是组的编号)的形式来获取。

        对于组中所匹配的字符,可以用$n来获取。$在正则中表示行的结尾,所以出现在正则中不能用来表示组,一般用于替换中。

3)替换: String replaceAll(String regex,String replacement)方法。

          黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用

4)获取:将字符串中的符合规则的子串取出。

操作步骤:

        1)将正则表达式封装成对象。

        2)让正则对象和要操作的字符串相关联。

        3)关联后,获取正则匹配引擎。

        4)通过引擎对符合规则的子串进行操作,比如取出

黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用