zoukankan      html  css  js  c++  java
  • 深入理解String的关键点和方法

      String是Java开发中最最常见的,本篇博客针对String的原理和常用的方法,以及String的在开发中常见问题做一个整体性的概括整理.因为之前对String的特性做过一些分析,所以不在详细描述,以分条的形式

    总体记录。

    一 :String变量保存位置

       Java JVM实现中采用 用永久代保存字符串常量池,字符串常量池中实际上保存的是 String对象引用,字面量形式定义的字符串 (String s1 = "hehe") 会先判断字符串是否已存在。

       但是 如果是变量的形式 或者是 new得到的,会保存到堆中 。

       s1 s2 都是放在常量池 。s4 s5 都是运行时才可以得到值,是存在堆中的。

    String s1 = "haha";
    String s2 = "haha";
    System.out.println(s1 == s2);//true
    String s3 = "ha";
    String s4 = s3+"ha";
    System.out.println(s1 == s4); //false
    
    String s5 = new String("haha");
    System.out.println(s5 == s1);//false

    二 :String变量不可变 

        从JVM角度看,String因为用途广,为提高效率,每次都先去常量池中判断String是否存在,如果存在就复用该对象。不存在时再去添加,达到共享String,提高效率的目的。

    三:String.intern()方法

        官网描述: 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用

    四:String 使用乱码解决

        因为编码差异,经常会出现中文字符串乱码的问题。这是需要对String添加编码的控制

         String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示

        String的getBytes()方法是得到一个字串的字节数组,这是众所周知的。但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组

        而与getBytes相对的,可以通过new String(byte[], decode)的方式来还原这个“中”字时,这个new String(byte[], decode)实际是使用decode指定的编码来将byte[]解析成字符串

    public static void main(String[] args) throws UnsupportedEncodingException {
             String s1 = "测试乱码问题";
             String s2 = new String(s1.getBytes("GBK"),"GBK");
             System.out.println(s2);
        }

    五:String 和其他数据类型之间转化 

     整数转为String ,可以通过  “重载过的+运算符 ” 实现,或者是  “调用Integer.toString()”,或者是“直接用String.valueOf(int)”

       String 转为Integer  Integer.parseInt(String)   或者 Integer.valueOf(s1)

     一定注意 “可能会抛出转换异常”

     Integer i1 = 123;
    // String s1 = ""+i1;
     String s1 = Integer.toString(i1);
     System.out.println(s1 instanceof  String);//true
    System.out.println(s1.equals("123"));//true

     备注 : 结合第一条说的 利用+  将int转为String  会产生两个String对象  ,所以推荐用Integer.toString()  

    六:String 和String数组 和Char数组和byte数组的关系

       1:String 和 cahr[]数组 : 唯一的关联大概就是 String 实际上采用 char数组保存 ,下面是 我反编译String的源码。

        其次String 和char的区别就是 char只保存单个字符,String保存的是多个字符

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence
    {
        /** The value is used for character storage. */
        private final char value[];
    ....

      2:String 和byte[]数组

         主要解决中文乱码问题

      3: byte 和char  (可以参考  “char与byte的区别” )

          byte是字节数据类型有符号型的、占1个字节、大小范围为-128——127

          char是字符数据类型无符号型的、占2个字节(unicode码)、大小范围为0-65535

         所以 :

            char 不可以表示负数,byte是有符号型的,可以表示-128—127 的数 

    char c =  (char) -3; // char不能识别负数,必须强制转换否则报错,即使强制转换之后,也无法识别  
            System.out.println(c);  
            byte d1 = 1;  
            byte d2 = -1;  
            byte d3 = 127; // 如果是byte d3 = 128;会报错  
            byte d4 = -128; // 如果是byte d4 = -129;会报错  
            System.out.println(d1);  
            System.out.println(d2);  
            System.out.println(d3);  
            System.out.println(d4);

          char可以表中文字符,byte不可以 。但我试图去打印byte表示的汉字得到的是 ASCII码,当我试图转化为char时发现并没有的到中

        byte c1 = (byte)'中';
            System.out.println(c1);//45
        System.out.println((char)c1);//-    

             char、byte、int对于英文字符,可以相互转化

        byte c1 = (byte)'c';
        System.out.println((char)c1);//c
        System.out.println(c1);//99

      4:byte[] 和char的相互转化 : 参考 “Java 中byte 与 char 的相互转换” 。因为char直接强转 byte 失败 (byte一位而char是两位),所以char --byte[]--char是可以的

    class Test{
            public static byte[] charToByte(char c) {
                byte[] b = new byte[2];
                b[0] = (byte) ((c & 0xFF00) >> 8);//高位
                b[1] = (byte) (c & 0xFF);
                return b;
            }
         public static char byteToChar(byte[] b) {
                char c = (char) (((b[0] & 0xFF) << 8) | (b[1] & 0xFF));
                return c;
            }
             public static void main(String[] args) {
                    char c = '中';
                    System.out.println(Test.byteToChar(Test.charToByte(c)));
            }
        }

      参考 : “& 0xFF 与 & 0xFF00 的作用 

    七:String  在Json中的用法

      Json中经常用到字符串转为json对象或者是转为json数组,一定注意这里说的是 在java后台用到json的时候的做法。与javaScript半毛钱没关系

       json工具库万千,转化的方法也不同。在这里,我不一一列举,我用的是net.sf.json

    八:常用的拼接字符串方式

       + : String s1 = "ad"+"bc';

         Stringbuilder    stringbuilder.append("asda");

    九:String常用方法

       toLowerCase() 转换为小写

       valueOf() 转换为字符串

       trim() 去掉起始和结尾的空格

       substring() 截取字符串

       indexOf() 查找字符或者子串第一次出现的地方

       toCharArray()

       getBytes()

         charAt() 截取一个字符 

       length() 字符串的长度

  • 相关阅读:
    svn Mac
    webpack实用配置
    vuex状态管理-数据改变不刷新
    element-vue-koa2-mysql实现文件上传
    Promise的理解
    mysql Mac篇
    python 24 days
    python 7 days
    python 27 days
    python 26 days
  • 原文地址:https://www.cnblogs.com/ldh-better/p/7606699.html
Copyright © 2011-2022 走看看