字符串普遍應用 在 Java 編程中,在 Java 中字符串屬於對象,Java 提供了 String 類來建立和操做字符串。可是String包含的內容很是的複雜。下面將一一列舉String的那些事兒。java
String 不屬於基礎類型,基礎類型有 8 種:byte、boolean、char、short、int、float、long、double,而 String 屬於對象。編程
不同,由於內存的分配方式不同。String str="i"的方式,java 虛擬機會將其分配到常量池中;而 String str=new String("i") 則會被分到堆內存中。數組
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); }
在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 }
直接使用雙引號聲明出來的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(); }
未完待續。。。對象