Java一些問題總結
##1. 包裝類的享元模式
顧名思義:共享元對象。如果在一個系統中存在多個相同的對象,那麼只需要共享一份對象的拷貝,而不必爲每一次使用創建新的對象。
測試:
String num="abs";
String num1="acd";
String num2=new String(" 67 89 we asffds ert ");
//打印 logger debug
System.out.println(Integer.toHexString(num.hashCode()));
System.out.println(Integer.toHexString(num1.indexOf('a')));
System.out.println(Integer.toHexString(num2.charAt(3)));
結果:
17872
0
20
享元模式是爲數不多的、只爲提升系統性能而生的設計模式。它的主要作用就是複用對象,以節省內存空間和對象創建時間。
##2. 什麼是Java對象序列化
Java平臺允許我們在內存中創建可複用的Java對象,但一般情況下,只有當JVM處於運行時,這些對象纔可能存在,即,這些對象的生命週期不會比JVM的生命週期更長。但在現實應用中,就可能要求在JVM停止運行之後能夠保存(持久化)指定的對象,並在將來重新讀取被保存的對象。Java對象序列化就能夠幫助我們實現該功能。
使用Java對象序列化,在保存對象時,會把其狀態保存爲一組字節,在未來,再將這些字節組裝成對象。必須注意地是,對象序列化保存的是對象的"狀態",即它的成員變量。由此可知,對象序列化不會關注類中的靜態變量。
除了在持久化對象時會用到對象序列化之外,當使用RMI(遠程方法調用),或在網絡中傳遞對象時,都會用到對象序列化。Java序列化API爲處理對象序列化提供了一個標準機制,該API簡單易用。
##3. String類的常用方法
###⑴ length()字符串的長度
String num="6789";
System.out.println(num.length());
輸出結果爲:4
###⑵ charAt()截取一個字符
String num1="abcd";
System.put.println(num1.charAt(2)); //括號中爲索引號
結果爲:c
###⑶ toCharArray()轉換爲字符數組
String num1="afsg";
System.out.println(num1.toCharArray());
結果爲:afsg
###⑷ equals()和equalsIgnoreCase()比較兩個字符串
String a="Hello";
String b="Hello";
String c="World";
String d="HELLO";
System.out.println(a.equals(b));
System.out.println(a.equals(d));
System.out.println(a.equals(c)); //比較字符串及其長度,並且區分大小寫
//比較字符串及其長度,並且不區分大小寫
System.out.println(a.equalsIgnoreCase(d));
結果爲:true false false true
###⑸ startsWith()方法決定是否以特定字符串開始
System.out.println(a.startsWith("He"));或者System.out.println(a.startsWith(b));
結果是:true
###⑹ endWith()方法決定是否以特定字符串結束
System.out.println(a.endsWith("d"));
結果是:false
###⑺ compareTo()和compareToIgnoreCase() 比較字符串
String s1 = "adger";
String s2 = "adgerfa";
String s3 = "ADGER";
String s4 = "adher";
System.out.println(s1.compareTo(s2));//-2
System.out.println(s1.compareTo(s3));//32
System.out.println(s1.compareToIgnoreCase(s3));//0
System.out.println(s3.compareToIgnoreCase(s4));//-1
compareTo()的返回值是int,它是先比較對應字符的大小(ASCII碼順序)
1、如果字符串相等返回值0
2、如果第一個字符和參數的第一個字符不等,結束比較,返回他們之間的差值(ascii碼值)(負值代表:前字符串的值小於後字符串,正值代表:前字符串大於後字符串)
3、如果第一個字符和參數的第一個字符相等,則以第二個字符和參數的第二個字符做比較,以此類推,直至比較的字符或被比較的字符有一方全比較完,這時就比較字符的長度.
compareToIgnoreCase()方法是不區分大小寫,返回值是int,比較方式與compareTo()相同
package lulu1;
import java.util.Arrays;
import java.util.Scanner;
/**
* 比較輸入字符串的大小:不分大小寫,按照字符串的大小排序
* @author chenglulu
*
*/
public class Compare {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("請輸入要比較的字符串:");
String input=sc.nextLine();
String[] s = input.trim().split(" "); //trim()是把開頭和結尾的空格去掉
for(int i=0;i<s.length-1;i++){
for(int j=0;j<s.length-1-i;j++){
if(s[j].compareToIgnoreCase(s[j+1])>0){
String temp = s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
System.out.println(Arrays.toString(s));
}
}
//測試
//輸入: fas rew ada ADE FAA re bci def BCr aC Bc
//輸出:aC ada ADE Bc bci BCr def FAA fas re rew
###⑻ indexOf() 查找字符或者子串第一次出現的地方。
package lulu1;
import java.util.Scanner;
/**
* 查找字符或字符串第一次出現的地方
* @author chenglu
*
*/
public class Date {
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
System.out.println("請輸入一個字符串:");
String input =sc.nextLine();
System.out.println(input.indexOf("sed")); //不存在的話,返回-1
System.out.println(input.indexOf('a')); //存在的話,返回相應的索引值
}
}
###⑼ lastIndexOf() 查找字符或者子串是後一次出現的地方。
import java.util.Scanner;
/**
* 查找字符或字符串最後一次出現的地方
* @author chenglu
*
*/
public class Date {
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
System.out.println("請輸入一個字符串:");
String input =sc.nextLine();
System.out.println(input.lastIndexOf('s')); //不存在的話,返回-1
System.out.println(input.indexOf('a')); //存在的話,返回相應的索引值
}
}
###⑽ substring()截取字符串
System.out.println(input.substring(2, 6)); //返回索引爲2到5的值
結果爲:請輸入一個字符串:qwerasdf
eras
###⑾ replace() 替換
String a="wertqwertq";
System.out.println(a.replace("tq", "asdf"));//全部替換
System.out.println(a.replaceFirst("w", "mnbv")); //只替換第一個w
System.out.println(a.replaceAll("w", "123456"));//全部替換
結果爲:
###⑿ concat() 連接兩個字符串
String s="123456";
String s1="78987";
System.out.println(s.concat(s1));
結果爲:12345678987
###⒀ trim() 去掉起始和結尾的空格
String d=" as df gh we qw sd df as ";
System.out.println(d.trim());//把開始和結尾的空格去掉
結果爲:as df gh we qw sd df as
###⒁ toLowerCase()/ toUpperCase() 大小寫
String b="asdfghjk";
String c="ASDFGHJ";
System.out.println(b.toUpperCase());
System.out.println(c.toLowerCase());
System.out.println(s.toLowerCase());
結果爲:
ASDFGHJK
asdfghj
123456
###⒂ split(String str)//將str作爲分隔符進行字符串分解
String d="as df gh we qw sd df as ";
String[] ss = d.split(" ");
System.out.println(d.split(" ")); //輸出地址
System.out.println(ss); //輸出地址
System.out.println(Arrays.toString(ss)); //輸出數組
結果爲: [Ljava.lang.String;@39e5b5
[Ljava.lang.String;@117f31e
[as, df, gh, we, , qw, sd, df, as]