java知识点实示例_java基础知识---String(示例代码)

一、字符串的不可变性

先看一段代码

1 packagereverse;2

3 public classReverse {4 public static voidmain(String[] args)5 {6 String c1=new String("abc");7 String c2=new String("abc");8 String c3=c1;9 System.out.println("c1==c2:"+ (c1==c2));10 System.out.println("c1.equals(c2):"+c1.equals(c2));11 System.out.println("c3==c1:"+(c3==c1));12 System.out.println("c1.equals(c3):"+c1.equals(c3));13 c1="han";14 System.out.println(c1+" "+c3);15 System.out.println(""+(c3==c1));16 }17 }

第一个输出语句c1==c2很好理解,因为c1和c2都是用new 创建的对象的引用,虽然对象的值相同,但两个对象在不同的内存空间,也就是说c1和c2是对两个不同的对象的引用,所以结果为false。第二个输出语句c1.equals(c2)是调用了String类的equals方法,该方法用于比较两个字符串对象的值是否相等,所以结果为true。

c1、c2变量在内存中的模拟:

20190221123024596714.png

对于c3==c1为true是因为将c1赋值给了c3 也就是将c1对象的引用赋值给了c3;c1和c3在内存中的模拟:

20190221123024717812.png

对于System.out.println(c1+"   "+c3),这个输出语句有人会问既然c1和c3引用的是同一个对象,为什么改变c1的值c3的值并不会改变呢?

这就涉及到了Java中String对象的不可变性,什么叫不可变性呢,简单的说就是一旦一个String对象被创建并被赋值(初始化)这个对象的值就不会变化。

一旦一个String对象在内存中创建,它将是不可改变的,所有的String类中方法并不是改变String对象自己,而是重新创建一个新的String对象。

也就是说c1=han,并不是改变了原有对象的值,而是创建了一个新的字符串对象,这个对象的值是han,并把这个对象的引用赋值给了c1。

此时c1 和c3在内存中的模拟:

20190221123025017628.png

所以此时c1==c3 为false

正因为String对象的不可变性,如果需要对字符串进行大量的修改、添加字符、删除字符等操作尽量不要使用String对象,因为这样会频繁的创建新的对象导致程序的执行效率下降

这时我们可以使用字符串生成器StringBuilder。

二、substring

String是Java中一个比较基础的类,每一个开发人员都会经常接触到。而且,String也是面试中经常会考的知识点。String有很多方法,有些方法比较常用,有些方法不太常用。今天要介绍的subString就是一个比较常用的方法,而且围绕subString也有很多面试题。

substring(int beginIndex, int endIndex)方法在不同版本的JDK中的实现是不同的。了解他们的区别可以帮助你更好的使用他。为简单起见,后文中用substring()代表substring(int beginIndex, int endIndex)方法。

substring() 的作用

substring(int beginIndex, int endIndex)方法截取字符串并返回其[beginIndex,endIndex-1]范围内的内容。

Stringx ="abcdef";

x =x.substring(1,3);

System.out.println(x);

输出内容:bc

三、replaceFirst、replaceAll、replace 区别

1、replace()

String str= "mesquite in your cellar"

str.replace(‘e‘, ‘o‘)

returns "mosquito in your collar"

由此可知replace是全替换的。

建议:单引号全部改为双引号,避免编译出错,有时可能操作多字符。

2、replaceFirst()、replaceAll()

(1)用法与replace相同,但是后面两者基于规则表达式的替换;

(2)replaceFirst只替换第一次出现的,后面就不管了;

(3)replaceAll是replace的加强版。

(4)替换数字时的格式:"\d"、也可以单换一个数字。

注意:执行了替换操作后,源字符串的内容是没有发生改变的.

四、 String.valueOf 和 Integer.toString 的区别

interger.toString()方法

作用:该方法返回指定整数的有符号位的String对象,以10进制字符串形式返回。

内部实现:

1 public static String toString(inti) {2 if (i == Integer.MIN_VALUE) //等于最小值直接返回最小值字符串,避免getChars方法遇到最小值发生错误

3 return "-2147483648";4 //判断i的位数,若位负数增加1位用来保存符号位

5 int size = (i < 0) ? stringSize(-i) + 1: stringSize(i);6 char[] buf = new char[size];7 //将i转换位buf符号数组

8 getChars(i, size, buf);9 //因为buf数组是在方法内部生成,其他地方不会有其引用,所以直接将其引用给String内部的value保存,用来初始化String

10 return new String(buf, true);11 }

可以看出Integer.toString()方法用来执行将int转换为String的操作,那么根据方法复用的原则,可以推断出String.toString(int)也应该是使用来该方法。那么我们接着往下看。

String.valueOf()方法

不同于Integer.toString(int),valueof有大量的重载方法,我们一一对其介绍。

public static String valueOf(Object obj)

作用:将对象转换成String类型

源码:

1 public staticString valueOf(Object obj) {2 return (obj == null) ? "null": obj.toString();3 }

可以看出这里调用对象的toString(),所以写对象时,最好重写其toString()方法。

public static String valueOf(char data[])

作用:将字符数组转换成String类型

源码:

1 public static String valueOf(chardata[]) {2 return newString(data);3 }

直接将字符数组作为String的构造参数入参,内部是将数组复制了一份保存在了String中,用来初始化String。

public static String valueOf(char data[], int offset, int count)

作用:将offset位置至offset+count位置的data[]数组转换成String类型

源码:

1 public static String valueOf(char data[], int offset, intcount) {2 return newString(data, offset, count);3 }

public static String valueOf(boolean b)

作用:将布尔转换成String类型

源码:

1 public static String valueOf(booleanb) {2 return b ? "true" : "false";3 }

可以看出并不能直接从boolean转换成字符,而是判断后,返回指定的字符串。

public static String valueOf(char c)

作用:将字符转换成String类型

源码:

1 public static String valueOf(charc) {2 char data[] ={c};3 return new String(data, true);4 }

这里先将字符转换成字符数组,可能好奇String(data,true)这个构造方法与上面的String(data)有什么不同,String(data, true)构造方法将引用传递给了String内部的value用来创建字符串,data在方法内部创建没有其他引用,所以可以直接传递,节约内存空间。

public static String valueOf(int i)

作用:将int类型转换成String类型

源码:

1 public static String valueOf(inti) {2 returnInteger.toString(i);3 }

与我们的推测相似,这里调用了Integer.toString()的方法,可以看出String的valueof方法是将各种类型转换成String,内部重载了不同类型转String的处理,所以推荐使用valueof方法。

public static String valueOf(long l)

作用:将long类型转换成String类型

源码:

1 public static String valueOf(longl) {2 returnLong.toString(l);3 }

public static String valueOf(float f)

作用:将float类型转换成String类型

源码:

1 public static String valueOf(floatf) {2 returnFloat.toString(f);3 }

public static String valueOf(double d)

作用:将double类型转换成String类型

源码:

public static String valueOf(doubled) {returnDouble.toString(d);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值