zoukankan      html  css  js  c++  java
  • java基础知识---String

    一、字符串的不可变性

          先看一段代码 

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

     五、switch 对 String 的支持

    switch case的判断条件是: int、boolean、char、short(后三者都能转换为int)

    在JDK 5中加入的枚举Enum类型也是可以作为case值的;

    在Java JDK7后,我们就可以使用String类型进行判断!

     1 package com.mzsds.wlk;
     2 
     3 public class Main {
     4     public static void main(String... args) {
     5         String str = new String("条件C");
     6 
     7         switch(str){
     8         case "条件A":
     9             System.out.println("我是条件A。");
    10             break;
    11         case "条件B":
    12             System.out.println("我是条件B。");
    13             break;
    14         case "条件C":
    15             System.out.println("我是条件C。");
    16             break;
    17         case "条件D":
    18             System.out.println("我是条件D。");
    19         }
    20 
    21     }
    22 }

    输出结果:我是条件C。

    六、字符串池、常量池(运行时常量池、Class 常量池)、intern

      

  • 相关阅读:
    折半插入排序-ACM题
    xcode 常用快捷键
    折半插入排序-算法
    插入排序
    HTML5 data-* 自定义属性
    vertical-align属性baseline(转)
    CSS 基础点
    解决-word里无论怎么改变字体颜色,字体总是红色的
    css属性前加*号的作用
    php 函数的嵌套
  • 原文地址:https://www.cnblogs.com/udbyygysai/p/10411590.html
Copyright © 2011-2022 走看看