分享

徐葳【2019版最新】40小时掌握Java语言之06String类

 大数据徐葳 2019-03-30

1章:String类详解

1.1 String概述

从今天开始我们学习一些java中已有对象的使用,

首先学习一个比较常用的对象,String(字符串)对象

字符串对象不用new就可以直接使用

如图1.1 所示。

定义了一个字符串类型的数据,s1是类类型变量,”abc”是一个字符串对象

注意,字符串一旦初始化就不会被改变,因为字符串是一个常量。

s1刚开始指向abc对象,后来指向了xyz对象,所以字符串不会被改变,改变的只是字符串的引用对象。

1.1 字符串

两个字符串abc  abd,在内存中会存储两个这样的字符串吗?

不会的,在内存中只会存在a b c d 4个字符。这个了解下即可,字符串类型底层都是使用char数组进行实现。

如图1.2所示。

当我们第一次创建的时候,这里我们认为没有内容为abc的对象存在。JVM通过字符串常量池查找不到内容为abc的字符串对象存在,那么会创建这个字符串对象,然后将刚创建的对象的引用放入到字符串常量池中,并且将引用返回给变量s1

当我们第二次想要创建abc的时候,JVM通过查找字符串常量池,发现内容为”abc”字符串对象存在,于是将已经存在的字符串对象的引用返回给变量s2。注意这里不会重新创建新的字符串对象。

1.2 字符串

也可以通过new来创建一个字符串对象,如图1.3所示。

当我们使用了new来构造字符串对象的时候,不管字符串常量池中有没有相同内容的对象的引用,新的字符串对象都会创建。所以s2==s3的结果为false

1.3 字符串

如果执行equals方法呢?如图1.4所示,equals的对比结果为true,这是为什么呢?

1.4 字符串对比

jdk目录下找一下jdk的源码,找到Object类,看一下里面的equals方法,发现这里比较的是内存地址值,如图1.5所示。

1.5 Object源码

但是使用Stringequals的方法比较两个相同对象的时候返回值是true,说明String复写了Objectequals方法,比较的是字符串的内容是否相同,查看String类中equals方法的源码如图1.6所示。

1.6 String类源码

注意:""null不一样,""表示是空字符串,null表示是没有指向。

String s = "";

String s1 = null;

1.2 String的构造函数

下面学习一下字符串的构造函数

如图1.7所示。

1.7 构造函数

通过字符串的构造函数,可以将一个数组中的一部分变成一个字符串对象。

1.3 String常见功能-判断

下面来学习一下String中的一般函数

我们把string中的函数按照功能来区分

l 判断

1. 判断两个字符串内容是否相同

boolean equals(Object anObject) 覆盖了Object类中的方法

2. 判断两个字符串内容是否相同,忽略大小写

boolean equalsIgnoreCase(String anotherString)

3. 判断一个字符串中是否包含另一个字符串

boolean contains(String str)

4. 判断一个字符串是否以一个字符串开头

boolean startsWith(String prefix)

5. 判断一个字符串是否以一个字符串结尾

boolean endsWith(String suffix)

6. 判断字符串是否为空

boolean isEmpty()

public boolean isEmpty(){

return this.length()==0;

}

代码如图1.8所示:

1.8 代码

1.4 String常见功能-获取

l 获取

1. 获取字符串的长度

int length()

2. 根据指导的位置获取该位置对应的字符

char charAt(int index)

3. 根据字符获取该字符第一次出现的位置

int indexOf(int ch) 

int indexOf(int ch, int fromIndex) fromIndex位置开始获取ch第一次出现的位置,找到了就返回第一次出现的位置的角标,没找到,就返回-1,所以通过-1这个返回值可以判断一个字符是否在字符串中存在

4. 根据字符串获取该字符串第一次出现的位置

int indexOf(String str) 

int indexOf(String str, int fromIndex) fromIndex位置开始获取str第一次出  现的位置,找到了就返回第一次出现的位置的角标,没找到,就返回-1,所   以通过-1这个返回值可以判断一个字符是否在字符串中存在,这其实就是    contains方法的原理。

5. 判断字符串在某个字符串中最后一次出现的位置,从末尾开始查

int lastIndexOf(int ch) 

int lastIndexOf(int ch, int fromIndex) 

int lastIndexOf(String str)

int lastIndexOf(String str, int fromIndex)

6. 获取字符串中的一部分字符串

String substring(int beginIndex)  begin开始截取,一直到结尾

String substring(int beginIndex, int endIndex) begin开始截取,到end为止,     包含begin位,不包含end

代码如图1.9所示。

1.9 代码

1.5 String常见功能-转换

l 转换

1. 将字符串转成字节数组

byte[] getBytes()

2. 将字符串转为字符数组

char[] toCharArray()

3. 将字符数组或者数组中的一部分转成字符串

static String valueOf(char[] data)

4. 基本数据类型变成字符串

static String valueOf(float f) 返回float 参数的字符串表示形式。

static String valueOf(int i) 返回int 参数的字符串表示形式。

static String valueOf(long l) 返回long 参数的字符串表示形式。

...

int x = 3;

String.valueOf(x); --> "3";

或者x+"" --> "3";

5. 将对象变成字符串

static String valueOf(Object obj)  

6. 将字符串转成大写或者小写

String toLowerCase() 转小写

String toUpperCase() 转大写

代码如图1.10所示。

1.10 代码

1.6 String常见功能-替换&切割&比较

l 替换

String replace(char oldChar, char newChar) 

l 切割

String[] split(String regex) 

l 去除字符串前后的空格

String trim() 

l 字符串比较compareTo

int compareTo(String anotherString) 

代码如图1.11所示。

1.11 代码

以上这些就是javastring类常用的方法

1.7 StringBuffer概述

Buffer就是传说中的缓冲区,StringBuffer就是字符串缓冲区,缓冲区用于存储数据,所以它也可以称之为一个容器。

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

StingBuffer是可变长度的。

其实stringbuffer之所以可以存储数据,就是因为底层封装了一个字符数组。

1.8 StringBuffer常见功能

1.8.1 添加

StringBuffer append(String b) 

StringBuffer append(int b)

...

可以将基本数据类型和引用数据类型添加到缓冲区中

将数据添加到缓冲区的末尾,属于数据追加,这个方法返回的还是原来的缓冲区对象

注意:不可以直接操作short byte类型。

代码如图1.12所示。

1.12 代码

缓冲区的特点:

(1)可以添加基本数据类型和引用类型

一般需要将其转成字符串进行使用,通过调用toString方法转成字符串

(2)该容器和数组不一样,数组是固定长度的,而且只能添加同一类型

StringBuffer长度是可变的,可以添加不同类型。

类型一直的数据,可以使用数组,也可以使用StringBuffer

但是数组添加元素,可以保证数据的类型不变,而StringBuffer添加完数据,全变成字符串。

(3)StringBuffer可以对字符串进行修改。

还要一个insert方法,功能和append类似,只不过insert是可以指定把数据添加到哪个位置上,代码如图1.13所示

1.13 代码

1.8.2 删除

StringBuffer delete(int start, int end)   根据startend角标进行删除(包含start不包含end)

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

代码如图1.14所示。

1.14 代码

1.8.3 获取字符串出现的位置

int indexOf(String str) 判断字符串中某一个字符第一次出现的位置,没找到返回-1

int indexOf(String str, int fromIndex) 从字符串的指定角标处进程查找某一个字符第一次出现的位置,没找到返回-1

int lastIndexOf(String str) 从末尾开始自右向左查,str第一次出现的位置,没找到返回-1

int lastIndexOf(String str, int fromIndex) 从指定角标开始,自右向左查,str第一次出现的位置,没找到返回-1

代码如图1.15所示。

1.15 代码

1.8.4 替换

StringBuffer replace(int start, int end, String str)   start为到end位的字符串替换为str(包含start位,不包含end)

代码如图1.16所示。

1.16 代码

1.8.5 修改

void setCharAt(int index, char ch)   修改指定角标的字符

代码如图1.17所示。

1.17 代码

1.8.6 反转

StringBuffer reverse()   字符串顺序翻转

代码如图1.18所示。

1.18 代码

1.8.7 切割

 String substring(int start)  参考1.6节中String的用法

 String substring(int start, int end) 参考1.6节中String的用法

void setLength(int newLength)  保留指定长度数据

代码如图1.19所示。

1.19 代码

1.9 StringBuilder

Jdk1.5的时候出现了一个StringBuilder

查看JDK文档查看信息,如图1.20所示。

1.20 StringBuilder解释

这个里面的方法和StringBuffer里面的一样。

区别:

StringBuffer:是线程安全的。

StringBuilder:是线程不安全的。

日后开发,常用的是StringBuilder.因为一般都是单线程。

如果真的有了多线程,那么建议使用StringBuffer.

StringBuilder的出现,是为了提高了效率。

1.21 构造函数

注意图1.21中的这个初始容量,就算默认是16个字符,但是超过16个字符也能往里面放。

里面还有一个带有构造参数的StringBuilder(int capacity) ,这个里面可以指定初始化容量,如果指定30个,那么多于30个的字符也能存到里面。

如果你能确定字符串的长度,就使用带有参数的创建

如果不能确定字符串的长度,就使用默认的,

这主要是牵扯到性能的问题,

如果你能确定字符串的长度,就直接指定,假设长度是50的话,你还使用默认的构造参数,这样只能存16个字符,当添加第17个字符的时候,底层是需要重新创建一个新数组,这样频繁的创建数组是非常消耗性能和资源的。所以,建议,如果能确定字符串的长度,就直接指定长度即可。

1.10 StringStringBuilder的区别

String对数据相连接变成新的字符串

StringBuilderString效率高些

String一旦被初始化不可以被改变

StringBuilder可以对字符串进行修改

1.11 字符串缓冲区和数组的区别

数组是固定长度的,而且只能添加同一类型

字符串缓冲区的长度是可变的,可以添加不同类型。

类型一致的数据,可以使用数组,也可以StringBuffer

数组添加元素,需要保证数据的类型不变。而StringBuffer添加完数据,全变成字符串

1.12 StringUtils工具类

下载工具包commons-lang3

注意:还有一个commons-lang包也可以使用

它们的区别是lang3要求jdk版本在1.5以上

commons-lang3-3.7.jar

在这里我们使用3.7版本,不建议使用最新的版本,可以在最新版本往下回退一两个版本

把这个jar包添加到项目的classpath中,如果想要查看这个jar包中的功能的实现源码的话,还需要在这里管理对应的源码包。

下载地址:https:///

StringUtils封装了String类中的功能,并且还提供了很多额外的功能

常用的功能如图1.22所示。

1.22 StringUtils工具类常用功能

2章:基本数据类型对象包装类

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

这个名字比较长,我们在学习java的时候学习过八种基本数据类型。

这八种基本数据类型只是表示一些基本的常量值。

如果想对这些值做一些复杂操作的话,就需要这个值具备一些功能。

可是值本身是不具备任何属性功能的。

所以就把基本数据类型,封装成了对象。

封装之后,这些对象就具备了很多功能。

将基本数据类型封装成了对象,提供了更多的属性和行为,可以对具体数据进行操作。

byte              Byte

short      Short

int          Integer

long       Long

char        Character

boolean  Boolean

float       Float

double   Double

我们主要讲一下Integer,这个是最常用,其他的使用起来也是类似的。

查看Integer类的API文档描述,如图2.1所示。

2.1 API文档介绍

把一个整数封装成对象有什么好处呢?

基本数据类型对象包装类的功能,可以完成基本数据和字符串之间的转换。

l 第一种转换方式

代码如图2.2所示。

2.2 代码

转换的规律:

XXX parseXXX(XXX );

只有一个类型没有:Character

l 第二种转换方式

代码如图2.3所示。

2.3 代码

封装成对象之后,好处是简化了书写,但是也有弊端,

对象的话是可以指定为null的,这个时候再执行就会报空指针异常,因为null不能调用intValue这个方法。

把数字转成字符串

Integer中一个tostring方法

如图2.4所示。

2.4 代码

equals方法

如图2.5所示。

2.5 代码

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

JDK1.5以后,简化了定义方式

Integer x = new Integer(4);

可以直接写成

Integer x = 4;//自动装箱。  其实内部执行了这句代码 Integer x = new Integer(4);

x  = x + 5;//自动拆箱。其实内部执行了这句代码 x.intValue()+5;相加完的结果9又自动装箱成Integer类型赋值给了x

看下面这一个案例,如图2.6所示。

2.6 代码

当把值改为128的时候,再执行代码,如图2.7所示。

2.7 代码

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多