java面试题大合集(开发者必看三)
前言
本文來自百度網絡的一篇文章,由于沒有答案,現在整理了一些比較好的回答和好的博客,可以自己擴展思路,如果大家有一下面試題的更好的答案,歡迎在評論區留言。以上全部來自網絡!此外,我的微信公眾號將每日分享下面面試題相關的知識點總結干貨,歡迎關注微信公眾號:好好學java!
文章推薦
精選java等全套學習資源
精選java電子圖書資源
精選大數據學習資源
java項目練習精選
網絡
1、用Java Socket編程,讀服務器幾個字符,再寫入本地顯示
反射
1、反射機制提供了什么功能?
得到該對象所屬的類:
Class ownerClass = owner.getClass()
在運行時構造一個類的對象:
Class newoneClass = Class.forName(className):第一步,得到要構造的實例的Class。Constructor cons = newoneClass.getConstructor(argsClass):得到構造子。cons.newInstance(args):新建實例。
在運行時判斷一個類所具有的成員變量和方法:
Class ownerClass = owner.getClass():得到該對象的Class。
Field field = ownerClass.getField(fieldName):通過Class得到類聲明的屬性。
Object property = field.get(owner):通過對象得到該屬性的實例,如果這個屬性是非公有的,這里會報IllegalAccessException。
在運行時調用一個對象的方法:
Method method = ownerClass.getMethod(methodName, argsClass):通過Method名和參數的Class數組得到要執行的Method。
method.invoke(owner, args):執行該Method,invoke方法的參數是執行這個方法的對象,和參數數組。返回值是Object,也既是該方法的返回值。
2、反射是如何實現的
所謂反射,是指在運行時狀態中,獲取類中的屬性和方法,以及調用其中的方法的一種機制。這種機制的作用在于獲取運行時才知道的類(Class)及其中的屬性(Field)、方法(Method)以及調用其中的方法,也可以設置其中的屬性值。
在Java中實現反射最重要的一步,也是第一步就是獲取Class對象,得到Class對象后可以通過該對象調用相應的方法來獲取該類中的屬性、方法以及調用該類中的方法。
Java中反射有如下幾種實現方式:
1、通過Class.forName()方法加載字符串,就可以得到該字符串做代表的Class對象。
例如:Class clazz = Class.forName("java.lang.String")就可以得到String類的Class對象。值得注意的是,字符串必須是類的全名,即包名+類名。
下邊的代碼是Struts配置文件struts.xml中的一個action的配置。
/registeResult.jsp ? /registe2.jsp
這里的class屬性給出了一個類的全名的字符串,服務器是如何通過這個字符串得到類對象的呢?就是通過反射機制RegisteAction對象的。然后再去調用這個類中的默認的execute()方法。
2、通過類名調用class屬性得到該類的Class對象。
例如:Class clazz = String.class也可以得到String類的Class對象。
3、調用實例的getClass()方法。
例如:Date date = new Date();
? ? ? ? ?Class clazz = date.getClass();
通過上邊的兩句代碼就可以得到date實例的Class對象。
4、如果是基本類型的包裝類,則可以通過調用包裝類的Type屬性來獲得該包裝類的Class對象。
? ?例如:Class clazz = Integer.TYPE;
3、哪里用到反射機制
java的反射機制就是增加程序的靈活性,避免將程序寫死到代碼里,典型應用是Spring
例如: 實例化一個 person()對象, 不使用反射, new person(); 如果想變成 實例化 其他類, 那么必須修改源代碼,并重新編譯。
? ? ?使用反射: class.forName("person").newInstance(); 而且這個類描述可以寫到配置文件中,如 **.xml, 這樣如果想實例化其他類,只要修改配置文件的"類描述"就可以了,不需要重新修改代碼并編譯。
4、反射中 Class.forName 和 ClassLoader 區別
參考:http://blog.csdn.net/qq_27093465/article/details/52262340
5、反射創建類實例的三種方式是什么
參考:http://blog.csdn.net/u012110719/article/details/45226937
6、如何通過反射調用對象的方法
參考:blog.csdn.net/handsome_fan/article/details/54862873
7、如何通過反射獲取和設置對象私有字段的值
參考:http://blog.csdn.net/u012726702/article/details/72027028
8、反射機制的優缺點
參考:http://blog.csdn.net/u010154380/article/details/78150251
數據庫
1、寫一段 JDBC 連Oracle的程序,并實現數據查詢
? ?package svn; ?import java.sql.Connection; ?import java.sql.DriverManager; ?import java.sql.PreparedStatement; ?import java.sql.ResultSet; ?public class Main { ?public static void main(String[] args) throws Exception { ?// 1、加載驅動 ?Class.forName("com.mysql.jdbc.Driver"); ?// 2、創建數據庫連接對象 ?Connection conn = null; ?conn = DriverManager ?.getConnection( ?"jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8", ?"root", "123456"); ?// 3、創建數據庫命令執行對象 ?PreparedStatement psPreparedStatement = conn ?.prepareStatement("select * from t_user"); ?// Statement stmtStatement=conn.createStatement(); ?// 4、執行數據庫命令 ?ResultSet rSet = psPreparedStatement.executeQuery(); ?//ResultSet rs=stmtStatement.executeQuery("select * from t_user"); ?//5、處理執行結果 ?while(rSet.next()){ ?int id=rSet.getInt("id"); ?String usernameString=rSet.getString("username"); ?String passwordString=rSet.getString("password"); ?} ?if(rSet!=null) ?rSet.close(); ?if(psPreparedStatement!=null) ?psPreparedStatement.close(); ?if(conn!=null) ?conn.close(); ?} ?} ?算法
1、50個人圍坐一圈,當數到三或者三的倍數出圈,問剩下的人是誰,原來的位置是多少
/*出圈算法是一類比較典型的算法面試題,它可以很好地考察求職者的編程功底。由于它是一種循環的邏輯,因此它比起一般的基礎算法題會更難一些。本例在回答該問題的同時,詳細地講解出圈算法的實現思路。 對于出圈的問題,它有一個比較大的困難點,就是它總是重復循環的,它的頭就是它的尾巴,所以,出圈問題的循環語句是比較難寫的。 該題目的圈的元素個數是50個,每次數到3或3的倍數的時候,就把當前元素出圈,并且繼續數數,直到再遇到3的倍數。這里,如果下標從0開始,一直到一圈完成以后,它就會接到圈的首部,這應該如何處理呢?其實,最好的辦法就是使用取余的辦法,就可以始終得到3個倍數,無論它的倍數是多少,也不管它的元素個數是多少。 由于每次去掉元素以后,元素的個數會少一個,因此下一個3的倍數其實只需要走兩步,在為其下標賦值的時候,需要減一,保持每次去掉的元素都是3的倍數。 說明:如果使用從0開始的下標開始計算,那么初始化的時候應該使用-1,這樣就可以模擬元素已經減少一個了。 至于元素的保存,可以使用數組,也可以使用鏈表。數組的元素去掉以后,它的下一個元素是不會自動往前移動的,不太好使用,但是也可以使用。這里,最好是使用java.util.List鏈表來表示,它既有下標,又可以很方便地獲得元素的當前個數,盡管效率比數組要稍微低一些,不過已經足夠了。*/import java.util.LinkedList; ? ?import java.util.List; ? ?//測試類 ? ?public class Cycle { ? ? ?public static int cycle(int total, int k) { ?//功能方法 ? ?List<Integer> dataList = new LinkedList<Integer>();//創建鏈表對象 ? ?for (int i = 0; i < total; i++) ?//添加數據元素 ? ?dataList.add(new Integer(i + 1)); ? ? ?int index = -1; ?//定義下標,模擬已經去掉一個元素,因此從-1開始 ?while (dataList.size() > 1) { //一直循環去除數據,直到只剩下一個元素 ? index = (index + k) % dataList.size();//得到應該出局的下標 ? ?dataList.remove(index--); ?//去除元素 ? ?} ? ? ?return ((Integer) dataList.get(0)).intValue();//返回它的值 ? ?} ? ? ?//主方法 ? ?public static void main(String[] args) { ? ? ?System.out.println("該數字原來的位置是:"+cycle(50, 3)); ? ? } ? ? ?} ?2、實現一個電梯模擬器用
基本思路: 模擬電梯運行(為單一電梯,未考慮達到承載上限,最短等待時間等問題) 基本條件: 1、電梯有三種狀態:靜止,向上,向下。 2、每層的指示燈有三種狀態:向上、向下、到達(只開門)。 3、開門上人1秒,每上或下一層用0.1秒。 /*實現方案: 使用一個隊列(可看做時間優先)將所有按鈕事件依次入隊。 當電梯靜止時首先響應隊頭的按鈕事件,并根據按鈕樓層和當前樓層的位置確定移動方向; 當向上移動時,將移動到所有亮燈的按鈕所在樓層的最高層,當按鈕方向和電梯方向一致時或該樓層內部到達按鈕亮起時開門;向下移動類似。 當隊列中沒有按鈕事件時,電梯靜止。有些類似LOOK算數,但沒有按鈕事件時不會來回掃描。 使用主線程來控制電梯上下,需要注意同步“設置和獲取電梯按鈕最高層或按鈕最底層數的方法”。*/ while(true){if(!ele.getPushedFloor().isEmpty()){int nextFloor = ele.getPushedFloor().peek();if(nextFloor > 0){//向上的按鈕if(ele.getCurFloor() - nextFloor <= 0){ele.liftUp();}else if(ele.getCurFloor() - nextFloor > 0){ele.liftDown();}}else{//向下的按鈕if(ele.getCurFloor() + nextFloor < 0){ele.liftUp();}else if(ele.getCurFloor() + nextFloor >= 0){ele.liftDown();}}}else{ele.setStat(RunningStat.INIT);}Thread.sleep(100);}3、寫一個冒泡排序
package sort; public class BubbleSort {//第一種方法完全就是按照冒泡排序的定義來寫的//代碼完全沒有經過優化public void Bubble1(int[]a,int n){int i,j;for(i=0;i<n-1;i++){for(j=1;j<n-i;j++){if(a[j-1]>a[j]){swap(a,j-1,j);//int k;//k=a[j-1];//a[j-1]=a[j];//a[j]=k;}}}}//第二種方法代碼優化一下 寫一個標志位,如果一趟下來發生交換則標志為true,如果未發生交換,為false//則代表排序已完成public void Bubble2(int[]a,int n){int u,v;boolean flag;flag=true;while(flag){flag=false;for(u=0;u<n-1;u++){for(v=1;v<n-u;v++){if(a[v-1]>a[v])swap(a,v-1,v);}flag=false;}}} //第三種方法,如果有一個50個數的數組,僅前面10個數是無序的,后面40個數是有序的,并且大于前面10個數,那么//第一次排序后,最后發生交換的位置必小于10,且這個位置之后的數據必定是有序的,記錄下這個位置后,//以后遍歷就從頭到這個位置就可以了public void Bubble3(int[]a,int n){int p,q;int flag1=n;while(flag1>0){q=flag1;flag1=0;for(p=1;p<q;p++){if(a[p-1]>a[p])swap(a,p-1,p);flag1=p;}}}public void swap(int a[],int p,int q ){int k;k=a[p];a[p]=a[q];a[q]=k;} ?}4、寫一個折半查找
? ?import java.util.Comparator; ?public class MyUtil { ?public static <T extends Comparable<T>> int binarySearch(T[] x, T key) { ?return binarySearch(x, 0, x.length- 1, key); ?} ?// 使用循環實現的二分查找 ?public static <T> int binarySearch(T[] x, T key, Comparator<T> comp) { ?int low = 0; ?int high = x.length - 1; ?while (low <= high) { ?int mid = (low + high) >>> 1; ?int cmp = comp.compare(x[mid], key); ?if (cmp < 0) { ?low= mid + 1; ?} ?else if (cmp > 0) { ?high= mid - 1; ?} ?else { ?return mid; ?} ?} ?return -1; ?} ?// 使用遞歸實現的二分查找 ?private static<T extends Comparable<T>> int binarySearch(T[] x, int low, int high, T key) { ?if(low <= high) { ?int mid = low + ((high -low) >> 1); ?if(key.compareTo(x[mid])== 0) { ?return mid; ?} ?else if(key.compareTo(x[mid])< 0) { ?return binarySearch(x,low, mid - 1, key); ?} ?else { ?return binarySearch(x,mid + 1, high, key); ?} ?} ?return -1; ?} ?} ?5、隨機產生20個不能重復的字符并排序
import java.util.HashSet; import java.util.Random; import java.util.Set; import java.util.TreeSet; public class bb {public static void main(String[] args) {Set noreapeat ?=new TreeSet();Random rdm = new Random(); ?while (noreapeat.size()<20){int ?bb =Math.abs(rdm.nextInt())%26+97;char cc =(char)bb;noreapeat.add(cc);}System.out.println(noreapeat);} }6、寫一個函數,傳入 2 個有序的整數數組,返回一個有序的整數數組
7、寫一段代碼在遍歷 ArrayList 時移除一個元素
8、古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第四個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少
9、約瑟芬環游戲
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class No10 { //約瑟芬環 游戲:有n個人站成一個圈,標上號1-n:從第一個開始報數,數到m,就拖出去殺掉,下一位從一開始數,數到m殺掉,問最后一個人的標號是多少, //下面有兩個方法 //方法2是正確的,方法只能滿足小數據,大一點的就異常了。求大神幫我改一下,看我的打印信息就知道我的思路了。 public static void main(String[] args) { // TODO Auto-generated method stub //經測試,輸入: 6 3 //12 4都成功,輸入大了就不行了,比如54 12就報錯了,求幫我修改一下 Scanner scanner = new Scanner(System.in); System.out.print("請輸入總人數:"); int totalNum = scanner.nextInt(); System.out.print("請輸入報數的大小:"); int cycleNum = scanner.nextInt(); yuesefu1(totalNum, cycleNum); System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); yuesefu2(totalNum, cycleNum); } public static void yuesefu1(int t ,int p) {//首先我把這些人給放到數組里面,方便操作List l = new ArrayList();for(int i=1;i<=t;i++){ l.add(i);}System.out.println(l.size());int wei =p;while(l.size()>1){if(l.size()==p){System.out.println("等于p");System.out.println("刪掉"+l.get(p-1));l.remove(p-1);}if(l.size()<p){System.out.println("小于p");System.out.println("刪掉"+l.get(p-l.size()-1));l.remove(l.get(p-l.size()-1));System.out.println("---------------------------------");for(int k = 0;k<l.size();k++){System.out.print(l.get(k)+".");}System.out.println("---------------------------------");}else{//先刪除一個p位置的l.remove(p-1);//---------------------------------System.out.println("---------------------------------");for(int k = 0;k<l.size();k++){System.out.print(l.get(k)+".");}System.out.println("---------------------------------");//---------------------------------for(int j=0;j<p-1;j++){l.add(l.get(j));}//---------------------------------System.out.println("---------------------------------");for(int k = 0;k<l.size();k++){System.out.print(l.get(k)+".");}System.out.println();System.out.println("---------------------------------");//---------------------------------for(int j=0;j<p-1;j++){l.remove(0);}//---------------------------------System.out.println("---------------------------------");for(int k = 0;k<l.size();k++){System.out.print(l.get(k)+".");}System.out.println();System.out.println("---------------------------------");}}System.out.println("最后的:"+l.get(0)); } public static void yuesefu2(int t,int p) {List list = new ArrayList();for(int i=1;i<=t;i++){list.add(i);}int k=0;while(list.size()>0){k = k+p; k= k%(list.size())-1;System.out.print("k="+k+"值為:");if(k<0){System.out.println(list.get(list.size()-1));list.remove(list.size()-1);k=0;}else{System.out.println(list.get(k));list.remove(k);}} } }正則
1、請編寫一段匹配IP地址的正則表達式
之前一直不太會寫正則表達式,很多要用到正則表達式的都直接百度,像上次要用正則表達式驗證是否是合法的ip地址,然后就上網找,結果就是沒找到一個對的,今天就為大家貢獻一下,寫個對的,并做一下解析。(建議大家還是去看書去規范的學一下,不要直接百度,不然都是坑)。 iPv4的ip地址都是(1~255).(0~255).(0~255).(0~255)的格式 下面給出相對應的正則表達式: "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\." +"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." +"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." +"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$" 上面的一個不漏就是正確的驗證ip的正則表達式,簡單的講解一下 \\d表示0~9的任何一個數字 {2}表示正好出現兩次 [0-4]表示0~4的任何一個數字 | 的意思是或者 ( )上面的括號不能少,是為了提取匹配的字符串,表達式中有幾個()就表示有幾個相應的匹配字符串 1\\d{2}的意思就是100~199之間的任意一個數字 2[0-4]\\d的意思是200~249之間的任意一個數字 25[0-5]的意思是250~255之間的任意一個數字 [1-9]\\d的意思是10~99之間的任意一個數字 [1-9])的意思是1~9之間的任意一個數字 \\.的意思是.點要轉義(特殊字符類似,@都要加\\轉義) 說到這里應該已經很清楚的知道了上面的正則表達式的意思。2、寫出一個正則表達式來判斷一個字符串是否是一個數字
public boolean isNumeric(String str){ ? Pattern pattern = Pattern.compile("[0-9]*"); ? Matcher isNum = pattern.matcher(str); ?if( !isNum.matches() ){ ?return false; ? } ? return true; ? } ?字符串
1、寫一個方法,入一個文件名和一個字符串,統計這個字符串在這個文件中出現的次數。
/*** 寫入一個方法,輸入一個文件名和一個字符串,統計這個字符串在這個文件中出現的次數。* @param fileName 文件名* @param str 查找的字符串* @return* @throws Exception*///方法一public static int funCount1(String fileName,String str) throws Exception {int count = 0;BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));String line ;StringBuilder sb = new StringBuilder();while((line = bf.readLine() )!= null) {sb = sb.append(line);}int a = 0;while((a = sb.indexOf(str)) != -1) {sb = sb.delete(a, a + str.length());count++;}return count;}//方法二:正則表達式public static int funCount2(String fileName,String str) throws Exception {int count =0 ;BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));String line ;StringBuilder sb = new StringBuilder();while((line = bf.readLine() )!= null) {sb = sb.append(line);}String pattern = ".*" + str + ".*";while(Pattern.matches(pattern, sb.toString())) {count ++;int a = sb.indexOf(str);sb.delete(a, a + str.length());}return count;}2、寫一個程序找出所有字符串的組合,并檢查它們是否是回文串
public static void main(String[] args) {String text = "abccb";System.out.println(isHuiwen(text));}public static boolean isHuiwen(String text){int length = text.length();for(int i=0;i<length/2;i++){if(text.charAt(i)!=text.charAt(length-i-1)){return false;}}return true;}3、寫一個字符串反轉函數,輸入abcde轉換成edcba代碼
import java.util.Scanner; public class Test6 {/*** 6、將字符串中進行反轉。abcde --> edcba* 分析:* ? ? ?字符串String 有索引 ?有最大長度* ? ? ?通過for循環從最大長度lengrh-1 ?開始到0為止倒序遍歷*/public static void main(String[] args) {//鍵盤錄入任意字符串Scanner sc = new Scanner(System.in);System.out.println("請輸入一串字符串:");String line = sc.nextLine();//將字符串倒序打印System.out.println("字符串反轉后為:");//循環條件int i = line.length()-1;i >= 0;i--for(int i = line.length()-1;i >= 0;i--){//字符串轉換成字符輸出System.out.print(line.charAt(i));}} }4、小游戲,倒轉句子中的單詞
public static void reverseWord( char[ ] s,int start,int end ?){char temp;while(start < end){ temp = s[start];s[start] = s[end];s[end] = temp;} ? ? }public static void reverseSentense(char[] s){int len = s.length;int start = 0,end = 0;reverseWord(s,0,len-1);while(start < len){if(s[start] == ' ?' ){start++;end++;continue;}else if(s[end] == ' ?' || end == len ]){reverseWord(s,start,end-1);strat = end;}else{end++;}} }5、將GB2312編碼的字符串轉換為ISO-8859-1編碼的字符串
String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1"); ?6、請寫一段代碼來計算給定文本內字符“A”的個數。分別用迭代和遞歸兩種方式
public class RecursiveCall {public int countA(String input) {// exit condition – recursive calls must have an exit conditionif (input == null || input.length( ) == 0) {return 0;}int count = 0;//check first character of the inputif (input.substring(0, 1).equals("A")) {count = 1;}//recursive call to evaluate rest of the input//(i.e. ?2nd character onwards)return count + countA(input.substring(1));}public static void main(String[ ] args) {System.out.println(new RecursiveCall( ).countA("AAA rating")); ?// Ans. 3} }7、編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串。 但是要保證漢字不被截半個,如“我ABC”,應該截為“我AB”,輸入“我ABC漢DEF”,應該輸出為“我ABC”,而不是“我ABC+漢的半個”
一、需要分析 1、輸入為一個字符串和字節數,輸出為按字節截取的字符串--------------》按照字節[byte]截取操作字符串,先將String轉換成byte類型 2、漢字不可以截半----------------------------------------------------------------------------------------------------------》漢字截半的話對應字節的ASC碼為小于0的數值 二、技術難點 1、知道漢字截半的話對應字節的ASC碼為小于0的數值 2、對字符串操作應該都要面對的一個問題,字符串是否有效null, 字符串的長度0,1這種邊界處理 代碼實現 package com.itheima; /*** 10、 編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串。* 但是要保證漢字不被截半個,如“我ABC”4,應該截為“我AB”,輸入“我ABC漢DEF”,6,應該輸出為“我ABC”而不是“我ABC+漢的半個”。* * @author 281167413@qq.com*/ public class Test10 {public static void main(String[] args) {String srcStr1 = "我ABC";String srcStr2 = "我ABC漢DEF";splitString(srcStr1, 4);splitString(srcStr2, 6);}public static void splitString(String src, int len) {int byteNum = 0;if (null == src) {System.out.println("The source String is null!");return;}byteNum = src.length();byte bt[] = src.getBytes(); // 將String轉換成byte字節數組if (len > byteNum) {len = byteNum;}// 判斷是否出現了截半,截半的話字節對于的ASC碼是小于0的值if (bt[len] < 0) {String subStrx = new String(bt, 0, --len);System.out.println("subStrx==" + subStrx);} else {String subStrx = new String(bt, 0, len);System.out.println("subStrx==" + subStrx);}} }8、給定 2 個包含單詞列表(每行一個)的文件,編程列出交集
9、打印出一個字符串的所有排列
import java.util.Scanner; public class Demo001 {public static void main(String[] args) {String str = "";Scanner scan = new Scanner(System.in);str = scan.nextLine();permutation(str.toCharArray(), 0);}public static void permutation(char[] str, int i) {if (i >= str.length)return;if (i == str.length - 1) {System.out.println(String.valueOf(str));} else {for (int j = i; j < str.length; j++) {char temp = str[j];str[j] = str[i];str[i] = temp;permutation(str, i + 1);temp = str[j];str[j] = str[i];str[i] = temp;}}} }10、將一個鍵盤輸入的數字轉化成中文輸出(例如:輸入1234567,輸出:一百二拾三萬四千五百六拾七)
public class Reader {private String strNum;private String strNumChFormat;private String strNumTemp;private int intNumLen;private String strBegin;public Reader(String strNum) {this.strNum = strNum;}public boolean check(String strNum) {boolean valid = false;if (strNum.substring(0,1).equals("0")){this.strNum = strNum.substring(1);}try {new Double(strNum);valid = true;}catch (NumberFormatException ex) {System.out.println("Bad number format!");}return valid;}public void init() {strNumChFormat = "";intNumLen = strNum.length();strNumTemp = strNum;strNumTemp = strNumTemp.replace('1', '一');strNumTemp = strNumTemp.replace('2', '二');strNumTemp = strNumTemp.replace('3', '三');strNumTemp = strNumTemp.replace('4', '四');strNumTemp = strNumTemp.replace('5', '五');strNumTemp = strNumTemp.replace('6', '六');strNumTemp = strNumTemp.replace('7', '七');strNumTemp = strNumTemp.replace('8', '八');strNumTemp = strNumTemp.replace('9', '九');strNumTemp = strNumTemp.replace('0', '零');strNumTemp = strNumTemp.replace('.', '點');strBegin = strNumTemp.substring(0, 1);}public String readNum() {if (check(strNum)) {init();try {for (int i = 1, j = 1, k = 1; i < intNumLen; i++) {if (strNumTemp.charAt(intNumLen - 1) == '零' && i == 1) {strNumChFormat = "位";}else if (strNumTemp.charAt(intNumLen - i) == '零' && j == 1) {strNumChFormat = "位" + strNumChFormat;}else if (strNumTemp.charAt(intNumLen - i) == '點') {j = 1;k = 1;strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;continue;}else {strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;}if (strNumTemp.charAt(intNumLen - i - 1) != '位' &&strNumTemp.charAt(intNumLen - i - 1) != '零') {if (j == 1 && i < intNumLen) {strNumChFormat = '拾' + strNumChFormat;}else if (j == 2 && i < intNumLen) {strNumChFormat = '百' + strNumChFormat;}else if (j == 3 && i < intNumLen) {strNumChFormat = '千' + strNumChFormat;}}if (j == 4 && i < intNumLen) {j = 0;}if (k == 4 && i < intNumLen) {strNumChFormat = '萬' + strNumChFormat;}else if (k == 8 && i < intNumLen) {k = 0;strNumChFormat = '億' + strNumChFormat;}j++;k++;}while (strNumChFormat.indexOf("位") != -1) {strNumChFormat = strNumChFormat.replaceAll("位", " ");}if (strNumChFormat.substring(0, 2) == "一拾") {strNumChFormat = strNumChFormat.substring(1, strNumChFormat.length());}if (strNumChFormat.indexOf("點") >= 0) {String rebegin = strNumChFormat.substring(0,strNumChFormat.indexOf("點"));String relast = strNumChFormat.substring(strNumChFormat.indexOf("點"),strNumChFormat.length());for (int i = 1; i <= relast.length(); i++) {relast = relast.replaceAll("拾", "");relast = relast.replaceAll("百", "");relast = relast.replaceAll("千", "");relast = relast.replaceAll("萬", "");relast = relast.replaceAll("億", "");}strNumChFormat = rebegin + relast;}}catch (ArrayIndexOutOfBoundsException ex) {ex.printStackTrace();}catch (Exception ex) {ex.printStackTrace();}int off = strNumChFormat.indexOf("點");strNumChFormat = strBegin + strNumChFormat.substring(0);}else {strNumChFormat = "";}return strNumChFormat;}public static void main(String args[]) {try {String number = args[0].toString();System.out.println("The number is: " + number);Reader reader = new Reader(number);System.out.println("Output String: " + reader.readNum());}catch (Exception ex) {System.out.println("Please input like that: javac Reader <number>");}} }11、在Web應用開發過程中經常遇到輸出某種編碼的字符,如從 GBK 到 ISO8859-1等,如何輸出一個某種編碼的字符串
public String translate (String str) {String tempStr = "";try {tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");tempStr = tempStr.trim();}catch (Exception e) {System.err.println(e.getMessage());}return tempStr;}日期
1、計算兩個日期之間的差距
? ?import java.text.DateFormat; ?import java.text.ParseException; ?import java.text.SimpleDateFormat; ?import java.util.Date; ?/** * 時間相距 * @author Ben * @version 1.0 * @date 2009-10-21 16:38:51 */ ?public class DateDistance { ?/** * 兩個時間之間相差距離多少天 * @param one 時間參數 1: * @param two 時間參數 2: * @return 相差天數 */ ?public static long getDistanceDays(String str1, String str2) throws Exception{ ?DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); ?Date one; ?Date two; ?long days=0; ?try { ?one = df.parse(str1); ?two = df.parse(str2); ?long time1 = one.getTime(); ?long time2 = two.getTime(); ?long diff ; ?if(time1<time2) { ?diff = time2 - time1; ?} else { ?diff = time1 - time2; ?} ?days = diff / (1000 * 60 * 60 * 24); ?} catch (ParseException e) { ?e.printStackTrace(); ?} ?return days; ?} ?/** * 兩個時間相差距離多少天多少小時多少分多少秒 * @param str1 時間參數 1 格式:1990-01-01 12:00:00 * @param str2 時間參數 2 格式:2009-01-01 12:00:00 * @return long[] 返回值為:{天, 時, 分, 秒} */ ?public static long[] getDistanceTimes(String str1, String str2) { ?DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ?Date one; ?Date two; ?long day = 0; ?long hour = 0; ?long min = 0; ?long sec = 0; ?try { ?one = df.parse(str1); ?two = df.parse(str2); ?long time1 = one.getTime(); ?long time2 = two.getTime(); ?long diff ; ?if(time1<time2) { ?diff = time2 - time1; ?} else { ?diff = time1 - time2; ?} ?day = diff / (24 * 60 * 60 * 1000); ?hour = (diff / (60 * 60 * 1000) - day * 24); ?min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60); ?sec = (diff/1000-day*24*60*60-hour*60*60-min*60); ?} catch (ParseException e) { ?e.printStackTrace(); ?} ?long[] times = {day, hour, min, sec}; ?return times; ?} ?/** * 兩個時間相差距離多少天多少小時多少分多少秒 * @param str1 時間參數 1 格式:1990-01-01 12:00:00 * @param str2 時間參數 2 格式:2009-01-01 12:00:00 * @return String 返回值為:xx天xx小時xx分xx秒 */ ?public static String getDistanceTime(String str1, String str2) { ?DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ?Date one; ?Date two; ?long day = 0; ?long hour = 0; ?long min = 0; ?long sec = 0; ?try { ?one = df.parse(str1); ?two = df.parse(str2); ?long time1 = one.getTime(); ?long time2 = two.getTime(); ?long diff ; ?if(time1<time2) { ?diff = time2 - time1; ?} else { ?diff = time1 - time2; ?} ?day = diff / (24 * 60 * 60 * 1000); ?hour = (diff / (60 * 60 * 1000) - day * 24); ?min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60); ?sec = (diff/1000-day*24*60*60-hour*60*60-min*60); ?} catch (ParseException e) { ?e.printStackTrace(); ?} ?return day + "天" + hour + "小時" + min + "分" + sec + "秒"; ?} ?} ?文章有不當之處,歡迎指正,同時也歡迎在評論區給你的漂亮的答案,你也可以關注我的微信公眾號:好好學java,每日更新知識點總結干貨。
總結
以上是生活随笔為你收集整理的java面试题大合集(开发者必看三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 类与接口(五)java多态、方法重写、隐
- 下一篇: java网络编程(六)