字符串知识点总结

 

常见API--String 类

 

 

字符串是一个特殊的对象,字符串一旦初始化就不可以被改变。

 

String 不能有子类 该类中的操作字符串的功能是不能被覆写的。

Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:

String str = "abc";

等效于:

char data[] = {'a', 'b', 'c'};

String str = new String(data);

String 类的构造函数

空参数的构造函数:

String str = new String (); 等价于 String  str = "";

String str = "abc";//str是一个类类型的变量 所以“abc”是一个对象

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

 

编译结果:第一条语句:false 第二条语句:true

原因:String类覆写了object类中的equals方法

【面试题】

S1s2的区别是什么?

S1在内存中有一个对象;s2在内存中有两个对象

字符串其实在内存中有个常量池,池子中是数组来存放一个个字符。

 

【试题1

String s1 = "a";

String s2 = s1 + "b";

String s3 = "a" + "b";

System.out.println(s2 == "ab");

System.out.println(s3 == "ab");

 

第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。

 

【试题2

下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

 

题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,

String s = "a" + "b" + "c" + "d";

System.out.println(s == "abcd");//只创建了一个对象

 

 

String类是用于描述字符串事物的。该类提供了一系列方法对字符串进行操作。

常见操作字符串的方法

 

(一)获取

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

int length() //获取字符串的长度

注意:数组的长度用的是属性length,字符串的长度用的是方法length();

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

char charAt(int index)

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

int indexOf(int ch)//

返回的是ch在字符串中第一次出现的位置,接受的是ASCII码

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);

 

(二)判断

字符串中是否包含某一个子串 boolean contains(str)

特殊之处:indexOf(str)可以索引str第一次出现的位置,如果返回-1表示该str不在字符串中存在,所以也可以用于对指定字符串的判断是否包含。

而且该方法既可以判断又可以获取出现的位置。

字符串中是否有内容 boolean isEmpty(str)//原理就是判断长度是否为零

字符串是否是以指定内容开头 boolean startsWith(str)

字符串是否是以指定内容结尾 boolean endsWith(str)

判断字符串的内容是否相同 boolean equals(str)//覆写了object类中的equals方法

判断内容是否相同并忽略大小写 boolean equalsIgnoreCase()

方法的应用:

 

 

(三)转换

将字符数组转成字符串

构造函数:String(char[] buf)在字符串初始化的时候就能完成字符数组转成字符串

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

 

 静态方法:

Static copyValueOf(char[] buf)

Static valueOf(char[] buf);

将字符串转成字符数组

Char[]  toCharArray(str):

将字节数组转成字符串

String(byte[] buf)

String(byte[] buf ,offset,count):将数组中的一部分转成字符串

将字符串转成字节数组

Byte[] getBytes()

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

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

Static valueOf()

 

 (四)替换

替换字符串中某个字符String replace(oldchar,newchar);

替换字符串  String replace(str,str1) 

 

(五)切割

切割字符String[] split(regx);

 

 获取子串:String subString(begin)

           String subString(begin,end)

 

 (六)转换 去掉空格 比较

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

String toUpperCase();

String toLowerCase();

将字符串两端的空格去掉

String trim();

 

 字符串比较

int compareTo(str);

返回:

如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 的值。

 

compareTo

public int compareTo(String anotherString)

按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。按字典顺序将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0compareTo 只在方法 equals(Object) 返回 true 时才返回 0

返回:

如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 的值。

 

总结:

 

练习一:模拟一个trim方法,去除字符串两端的空格

思路:判断字符串第一个位置是否为空,依次判断直到不为空为止。结尾处判断也是一样。

 

【代码体现】

 

 

练习二:

将一个字符串进行反转

 

练习三:

获取一个字符串在另一个字符串中出现的次数

 

StringBuffer 是字符串缓冲区

特点:

1,是一个容器,长度可变。

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

3,最终通过toString方法变成字符串

//与数组的区别

一、存储

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

 插入 StringBuffer insert(offset,数据) 可以将数据插入到指定index位置

二、删除

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

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

三、获取

 String subString(start,end);

四、修改

 void setCharAt(int index,char ch)

 StringBuffer replace(start,end,string)

五、反转

StringBuffer reverse()

六、将缓冲区中的指定数据存储到指定数组中

Void getChars(int srcstart,int srcend,char[] dest,destBegin)

StringBuilder升级的三个因素:

1,提高效率

2,简化书写

3,提高安全性

StringBuilder 与StringBuffer

StringBuffer是线程同步的,StringBuilder 是线程不同步的。

 

【面试题】

StringStringBuffer的区别

String类表示内容不可改变的字符串。而StringBuffer类表示内容可以被修改的字符串。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false

基本数据类型包装类

int

 Integer

char

 Character

long 

 Long

float 

 Float

byte 

 Byte

short 

 Short

boolean

 Boolean

 

基本数据类型包装类的作用:

 基本数据类型和字符串之间的转换:

1,基本数据类型+" "

2,基本数据类型. toString( 基本数据类型值)

Integer.toString(34);

 

 字符串转成基本数据类型

parseInt(str);

Integer i = new Integer("123");

int x = i.intValue();

十进制转其他进制

toBinaryString();

toOctalString();

toHexString();

parseInt(" ", radix); 将指定字符串按指定进制转化

  

JDK5.0以后新特性

Integer x = 4;//Integer x = new Integer(4);自动装箱

X = x+2; //自动拆箱 自动转化成int类型进行运算 

拆箱原理:x.intValue();

 

字符串总结:

new String()new String("")都是申明一个新的空字符串,是空串不

null

String s0="kvill"; String s1="kvill"; String s2="kv" + "ill";

System.out.println( s0==s1 ); //true

System.out.println( s0==s2 ); //true

 

例子中的s0 s1 中的"kvill"都是字符串常量,它们在编译期就被确

定了,放在常量池中,所以s0==s1 true;而"kv""ill"也都是字符串常

量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串

常量,所以s2 也同样在编译期就被解析为一个字符串常量,所以s2 也是

常量池中"kvill"的一个引用。此时我们应该知道,常量池中只有一个字符串

"kvill"所以我们得出s0==s1==s2;用new String() 创建的字符串不是常量,

不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它

们有自己的地址空间。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值