Java基礎-String

字符串普遍應用 在 Java 編程中,在 Java 中字符串屬於對象,Java 提供了 String 類來建立和操做字符串。可是String包含的內容很是的複雜。下面將一一列舉String的那些事兒。java


1. String 屬於基礎的數據類型嗎?

String 不屬於基礎類型,基礎類型有 8 種:byte、boolean、char、short、int、float、long、double,而 String 屬於對象。編程

2. String str="i"與 String str=new String("i")同樣嗎?

不同,由於內存的分配方式不同。String str="i"的方式,java 虛擬機會將其分配到常量池中;而 String str=new String("i") 則會被分到堆內存中。數組

3.String 類的經常使用方法都有那些?

  • indexOf():返回指定字符的索引。
  • charAt():返回指定索引處的字符。
  • replace():字符串替換。
  • trim():去除字符串兩端空白。
  • split():分割字符串,返回一個分割後的字符串數組。
  • getBytes():返回字符串的 byte 類型數組。
  • length():返回字符串長度。
  • toLowerCase():將字符串轉成小寫字母。
  • toUpperCase():將字符串轉成大寫字符。
  • substring():截取字符串。
  • equals():字符串比較。

4. 如何將字符串反轉

  1. 使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。
  2. 使用String的 toCharArray(),代碼以下:【不推薦使用】
public static void main(String[] args) {  
    String str = "123456789";  
 char[] sc = str.toCharArray();  
 char[] nsc = new char[9];  
 int j = 0;  
 for (int i = sc.length-1; i >=0; i--) {  
        nsc[j] = sc[i];  
        j++;  
  }  
    String nstr = new String(nsc);  
    System.out.println(nstr);  
}

5 字符串常量池

在Java的內存分配中,總共3種常量池,分別是Class常量池、運行時常量池、字符串常量池。dom

字符串的分配和其餘對象分配同樣,是須要消耗高昂的時間和空間的,並且字符串使用的很是多。JVM爲了提升性能和減小內存的開銷,在實例化字符串的時候進行了一些優化:使用字符串常量池。每當建立字符串常量時,JVM會首先檢查字符串常量池,若是該字符串已經存在常量池中,那麼就直接返回常量池中的實例引用。若是字符串不存在常量池中,就會實例化該字符串而且將其放到常量池中。因爲String字符串的不可變性,常量池中必定不存在兩個相同的字符串。性能

public static void main(String[] args) {  
    String str1 = "hello eric";  
    String str2 = "hello eric";  
  System.out.println(str1 == str2); // true  
}

6 intern方法

直接使用雙引號聲明出來的String對象會直接存儲在字符串常量池中,若是不是用雙引號聲明的String對象,可使用String提供的intern方法。intern 方法是一個native方法,intern方法會從字符串常量池中查詢當前字符串是否存在,若是存在,就直接返回當前字符串;若是不存在就會將當前字符串放入常量池中,以後再返回。優化

JDK1.7的改動:ui

將String常量池 從 Perm 區移動到了 Java Heap區
String.intern() 方法時,若是存在堆中的對象,會直接保存對象的引用,而不會從新建立對象。code

static final int MAX = 1000 * 10000;
static final String[] arr = new String[MAX];

public static void main(String[] args) throws Exception {
    Integer[] DB_DATA = new Integer[10];
    Random random = new Random(10 * 10000);
    for (int i = 0; i < DB_DATA.length; i++) {
        DB_DATA[i] = random.nextInt();
    }
    long t = System.currentTimeMillis();
    for (int i = 0; i < MAX; i++) {
        //arr[i] = new String(String.valueOf(DB_DATA[i % DB_DATA.length]));
         arr[i] = new String(String.valueOf(DB_DATA[i % DB_DATA.length])).intern();
    }

    System.out.println((System.currentTimeMillis() - t) + "ms");
    System.gc();
}

未完待續。。。對象

相關文章
相關標籤/搜索