码迷,mamicode.com
首页 > 编程语言 > 详细

java基础知识---String

时间:2019-02-21 12:30:24      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:builder   修改   增加   没有   data   截取字符串   实现   def   存在   

一、字符串的不可变性

      先看一段代码 

 1 package reverse;
 2 
 3 public class Reverse {
 4     public static void main(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变量在内存中的模拟:

     技术图片

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

技术图片

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

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

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

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

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

  技术图片

所以此时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]范围内的内容。

     String x = "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(int i) {
 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 static String 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(char data[]) {
2     return new String(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, int count) {
2     return new String(data, offset, count);
3 }

public static String valueOf(boolean b)
作用:将布尔转换成String类型
  源码:

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

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

public static String valueOf(char c)
作用:将字符转换成String类型
源码:

1 public static String valueOf(char c) {
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(int i) {
2     return Integer.toString(i);
3 }

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

public static String valueOf(long l)
作用:将long类型转换成String类型
源码:

1 public static String valueOf(long l) {
2     return Long.toString(l);
3 }

public static String valueOf(float f)
作用:将float类型转换成String类型
源码:

1 public static String valueOf(float f) {
2     return Float.toString(f);
3 }

public static String valueOf(double d)
作用:将double类型转换成String类型
源码:

public static String valueOf(double d) {
    return Double.toString(d);
}

 

java基础知识---String

标签:builder   修改   增加   没有   data   截取字符串   实现   def   存在   

原文地址:https://www.cnblogs.com/udbyygysai/p/10411590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!