1. 程式人生 > >java概述_練習&面試題

java概述_練習&面試題

java概述_練習&面試題

GC是什麼? 為什麼要有GC
答:GC是垃圾收集的意思(Gabage Collection),記憶體處理是程式設計人員容易出現問題的地方,
忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動
監測物件是否超過作用域從而達到自動回收記憶體的目的,Java語言沒有提供釋放已分配記憶體
的顯示操作方法。

--------------------------------------------------------
一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制?
答:可以。必須只有一個類名與檔名相同。

--------------------------------------------------------
垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收記憶體嗎?有什麼辦法主動通知虛擬機器進行垃圾回收
答:對於GC來說,當程式設計師建立物件時,GC就開始監控這個物件的地址、大小以及使用情況。通常,GC採用
有向圖的方式記錄和管理堆(heap)中的所有物件。通過這種方式確定哪些物件是"可達的",哪些物件是"不可達的"。
當GC確定一些物件為"不可達"時,GC就有責任回收這些記憶體空間。可以。程式設計師可以手動執行System.gc(),
通知GC執行,但是Java語言規範並不保證GC一定會執行。

--------------------------------------------------------
此處,Something類的檔名叫OtherThing.java
class Something {
    private static void main(String[] something_to_do) {        
        System.out.println("Do something ...");
    }
}
 這個好像很明顯。
答案: 正確。從來沒有人說過Java的class名字必須和其檔名相同。但public class的名字必須和檔名相同。

--------------------------------------------------------

基本語法1-運算子_練習&面試題

寫出輸出的結果.
//考查運算子的優先順序
class Demo{
    public static void main(String[] args){
        int x=0,y=1;
        if(++x==y-- & x++==1||--y==0)
            System.out.println("x="+x+",y="+y);//x = 2,y = 0;
        else
            System.out.println("y="+y+",x="+x);
    }
}

----------------------------------------------------
int n = 5,m = 13;
//插入程式碼,實現n和m值的交換
System.out.println("n="+n+",m="+m);


[answer]

int n = 5,m = 13;
//int temp = n;
//n = m;
//m = temp;
System.out.println("n="+n+",m="+m);

//n = n + m;
//m = n - m;
//n = n - m;
System.out.println("n="+n+",m="+m);

n = n ^ m;
m = n ^ m ;
n = n ^ m;
System.out.println("n="+n+",m="+m);

----------------------------------------------------
如何手動實現整型數值60的二進位制到十六進位制的轉換


[answer]
String str1 = Integer.toBinaryString(60);
String str2 = Integer.toHexString(60);
int i1 = 60;
int i2 = i1&15;
String j = (i2 > 9)? (char)(i2-10 + 'A')+"" : i2+"";

int temp = i1 >>> 4;
i2 = temp & 15;
String k = (i2 > 9)? (char)(i2-10 + 'A')+"" : i2+"";
System.out.println(k+""+j);

----------------------------------------------------
寫出輸出結果。
class Demo{
    public static void main(String[] args){
        int a=3,b=8;

        int c=(a>b)?a++:b++;
        System.out.println("a="+a+"\tb="+b+"\tc="+c);  //3  9  8

        int d=(a>b)?++a:++b;
        System.out.println("a="+a+"\tb="+b+"\td="+d);  //3  9  9

        int e=(a<b)?a++:b++;
        System.out.println("a="+a+"\tb="+b+"\te="+e);  //4  8  3

        int f=(a<b)?++a:++b;
        System.out.println("a="+a+"\tb="+b+"\tf="+f);  //4  8  4
    }
}

----------------------------------------------------
short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯

答:short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換型別)
short s1 = 1; s1 += 1;(可以正確編譯)

----------------------------------------------------
Java有沒有goto
答:java中的保留字,現在沒有在java中使用

----------------------------------------------------
用最有效率的方法算出2乘以8等於幾
答:2 << 3

----------------------------------------------------
char型變數中能不能存貯一箇中文漢字?為什麼?
答:是能夠定義成為一箇中文的,因為java中以unicode編碼,一個char佔16個位元組,
所以放一箇中文是沒問題的

----------------------------------------------------
float型float f=3.4是否正確?
答:不正確。精度不準確,應該用強制型別轉換,如下所示:float f=(float)3.4

----------------------------------------------------
String是最基本的資料型別嗎
答:基本資料型別包括byte、int、char、long、float、double、boolean和short。
java.lang.String類是final型別的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,
我們應該用StringBuffer類

----------------------------------------------------

----------------------------------------------------

----------------------------------------------------

基本語法2-流程控制_練習&面試題

寫出結果。
class Demo
{
    public static void main(String[] args)
    {
        int m=0,n=3;
        if(m>0)

            if(n>2)
                System.out.println("A");    
        else
            System.out.println("B");
        
    }
}


//沒有結果。
-------------------------------------------------------
switch是否能作用在byte上,是否能作用在long上,是否能作用在String上
答:switch(expr1)中,expr1是一個整數表示式。因此傳遞給 switch 和 case 語句的引數應該是
int、 short、 char 或者 byte。long不能作用於swtich.JDK1.7新加入了String型別。

-------------------------------------------------------
從鍵盤分別輸入年、月、日,判斷這一天是當年的第幾天。
public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("輸入year:");
        int year = scanner.nextInt();
        System.out.println("輸入month:");
        int month = scanner.nextInt();
        System.out.println("輸入day:");
        int day = scanner.nextInt();
        int sumDay = 0;
        switch (month) {
        case 12:
            sumDay += 30;
        case 11:
            sumDay += 31;
        case 10:
            sumDay += 30;
        case 9:
            sumDay += 31;
        case 8:
            sumDay += 31;
        case 7:
            sumDay += 30;
        case 6:
            sumDay += 31;
        case 5:
            sumDay += 30;
        case 4:
            sumDay += 31;
        case 3:
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                sumDay += 29;
            else
                sumDay += 28;
        case 2:
            sumDay += 31;
        case 1:
            sumDay += day;

        }
        System.out.println(year + "年" + month + "月" + day + "日是今年的第" + sumDay
                + "天");
    }
}
-------------------------------------------------------
寫出結果。
public class Demo{ 
    public static void main(String []args){ 
        int i = 0, j = 5; 
        tp: for (;;){ 
            i++; 
            for(;;){
                if(i > j--)
                    break tp; 
            }
        } 
        System.out.println("i = " + i + ", j = "+ j); //i=1,j=-1;
    } 
}
-------------------------------------------------------
1、 輸出從1到100之間所有的整數;
2、 輸出從1到100之間所有的奇數;
3、 輸出從1到100之間所有不能被3整除的數;並輸出這些整數的和

-------------------------------------------------------
1)輸入長和寬,輸出長方形,如:輸入4和3, 將輸出如下圖形
####
####
####
2)輸入高度,輸出直角三角形。如:輸入4, 將輸出如下圖形
#
##
###
####
3)輸入高度,輸出倒直角三角形。如:輸入4, 將輸出如下圖形
####
###
##
#

-------------------------------------------------------
列印九九乘法表

-------------------------------------------------------
輸入兩個正整數m和n,求其最大公約數和最小公倍數
int m = 12, n = 28;
//獲取m和n的較大值
int max = (m > n)? m : n;
//獲取m和n的較小值
int min = (m < n)? m : n;

//求m和n的最大公約數
for(int i = min;i >= 1;i--){
    if( m % i == 0 && n % i == 0){
        System.out.println("m和n的最大公約數是:" + i);
        break;
    }
}
//求m和n的最小公倍數
for(int i = max;i <= m * n;i++){
    if( i % m == 0 && i % n == 0){
        System.out.println("m和n的最小公倍數是:" + i);
        break;
    }
}
-------------------------------------------------------
分別使用if-else if-else語句和switch-case語句
根據用於指定月份,列印該月份所屬的季節。
//3,4,5 春季 6,7,8 夏季  9,10,11 秋季 12, 1, 2 冬季

[answer]
if(x==3 || x==4 || x==5)
    System.out.println(x+"春季");
else if(x==6 || x==7 || x==8)
    System.out.println(x+"夏季");
else if(x==9 || x==10 || x==11)
    System.out.println(x+"秋季");
else if(x==12 || x==1 || x==2)
    System.out.println(x+"冬季");
else
    System.out.println(x+"月份不存在");

[第二種]
if(x>12 || x<1)
    System.out.println(x+"月份不存在");
else if(x>=3 && x<=5)
    System.out.println(x+"春季");
else if(x>=6 && x<=8)
    System.out.println(x+"夏季");
else if(x>=9 && x<=11)
    System.out.println(x+"秋季");
else
    System.out.println(x+"冬季");    

[第3種]
public static void main(String[] args) {
int x = 4;
switch(x){
    case 3:
    case 4:
    case 5:
        System.out.println(x+"春季");
        break;
    
    case 6:
    case 7:
    case 8:
        System.out.println(x+"夏季");
        break;
    case 9:
    case 10:
    case 11:
        System.out.println(x+"秋季");
        break;
    case 12:
    case 1:
    case 2:
        System.out.println(x+"冬季");
        break;
    default:
        System.out.println("nono");

}

-------------------------------------------------------
已知學生成績以100分為滿分,共分5個等級:A,B,C,D,E。
   90~100為等級A,80~89為等級B,70~79為等級C,
   60~69為等級D,0~59為等級E。
   要求定義一個成績變數,當成績變化時,可直接知道該成績對應的等級。
   例如:當成績為100時,該學生的等級時A。

class LevelDemo{
    //定義一功能,通過給定分數,獲取該分數對應的等級。
    public static void main(String[] args){
        int num = 89;
        if(num>=90 && num<=100)
            System.out.println("level = A");
        else if(num>=80 && num<=89)
            System.out.println("level = B");
        else if(num>=70 && num<=79)
            System.out.println("level = C");
        else if(num>=60 && num<=69)
            System.out.println("level = D");
        else
            System.out.println("level = E");
        
    }
    
}

-------------------------------------------------------
1)列印1~100之間 6的倍數的個數。
2)求出1~100之間,既是3又是7的倍數的自然數出現的次數?

[answer1]
public static void main(String[] args) {
    int count = 0;
    for(int x=1; x<=100; x++){            
        if(x%6==0)
            //System.out.println("x="+x);
            count++;
    }
    System.out.println("count="+count);

    /*
    計數器思想。
    通過一個變數記錄住資料的狀態變化。
    */
}
[answer2]

-------------------------------------------------------
求調和級數中從第多少項開始值大於10,調和級數的第n項形式為:1+1/2+1/3+…+1/n
(略)
-------------------------------------------------------
3000米長的繩子,每天減一半。問多少天這個繩子會小於5米?不考慮小數。
[answer]
public static void main(String[] args){
    int day = 0;
    for(int x=3000; x>=5; x/=2){
        day++;
    }
    System.out.println("day="+day);
    /*
    方法二:
    day = 0;
    for(int x=3000; x>=5; day++)
    {
        x = x/2;
    }
    System.out.println(day);
    */
}

-------------------------------------------------------
編寫程式,判斷給定的某個年份是否是閏年。
閏年的判斷規則如下:
      (1)若某個年份能被4整除但不能被100整除,則是閏年。
      (2)若某個年份能被400整除,則也是閏年。

if((year % 4 ==0 && year % 100 != 0) || year % 400 == 0){}
-------------------------------------------------------
利用程式輸出如下圖形:
   *
   * * *
   * * * * *
   * * * * * * *
   * * * * *
   * * *
   *
for (int i = 0; i < 7; i++) {
    if(i < 4){
        for (int j = 0; j < 2 * i + 1; j++) {
        System.out.print("* ");
    }
    System.out.println();
    }else{
        for (int k = 0; k < 13 - 2 * i; k++) {
        System.out.print("* ");
    }
    System.out.println();
    }
}
-------------------------------------------------------
【拓展】
列印如下圖形
    *
   * *
  * * *
 * * * *
* * * * *
 * * * *
  * * *
   * *
    *
//上半部分
for(int i = 0;i < 5;i++){
    //輸出“-”
    for(int j = 0;j < 4-i;j++){
        System.out.print(" ");
    }

    //輸出“* ”
    for(int k = 0;k < i+1;k++){
        System.out.print("* ");
    }
    System.out.println();
}
//下半部分
for(int i = 0;i < 4;i++){
    for(int j = 0;j < i+1;j++){
        System.out.print(" ");
    }
    for(int k = 0;k < 4-i;k++){
        System.out.print("* ");
    }
    System.out.println();

}
-------------------------------------------------------
要求使用者輸入兩個數a和b,如果a能被b整除或者a加b大於1000,則輸出a;否則輸出b。

-------------------------------------------------------
一個數如果恰好等於它的因子之和,這個數就稱為"完數"。(因子:除去這個數本身正的約數)
例如6=1+2+3.程式設計 找出1000以內的所有完數
public class WanShu {
    static int count;
    public static void main(String[] args) {
        int factor=0;
        for (int i = 1; i <= 1000; i++) {
            for (int j = 1; j < i; j++) {
                if(i%j==0)
                    factor+=j;
            } 
            if(factor == i){
                System.out.println(i);
                count++;
            }
            factor=0;
        }
        System.out.println("1-1000之間的完數個數為:"+count);
    }
}

-------------------------------------------------------
寫一個程式,找出4位數的所有吸血鬼的數字
例如:1260=21*60
      1827=21*87

public class Test2 {
    public static void main(String[] args) {
        for (int num = 1001; num < 10000; num++) {
            math(num);
        }
    }

    public static void math(int num) {
        int[] temp1 = new int[2]; 
        int[] temp2 = new int[2]; 

        int a = num / 1000;
        int b = num / 100 % 10;
        int c = num / 10 % 10;
        int d = num % 10;
        int[] data = { a, b, c, d };
        for(int i = 0;i<data.length;i++){
            for(int j = 0;j < data.length;j++){
                if(i == j){
                    continue;
                }
                temp1[0] = data[i];
                temp1[1] = data[j];
                for(int m = 0;m<data.length;m++){
                    if(m != i && m != j){
                        temp2[0] = data[m];
                        for(int n = 0;n<data.length;n++){
                            if( n != i && n != j && n != m){
                                temp2[1] = data[n];
                                multi(data,temp1,temp2);
                            }
                        }
                    }
                }
            }
        }
    }
    public static int toInt(int[] temp){
        int m = 0;
        int[] temp1 = new int[temp.length];
        for(int i = 0;i < temp.length;i++){
            temp1[i] = temp[i]*(int)Math.pow(10, temp.length-1-i);
        }
        for(int i = 0;i < temp1.length;i++){
            m+=temp1[i];
        }
        return m;
    }
    public static void multi(int[] temp ,int[] temp1,int[] temp2){
        int i = toInt(temp1);
        int j = toInt(temp2);
        int k = toInt(temp);
        if(k == i*j){
            System.out.println(k + "=" + i + "*" + j);
        }
    }
}

-------------------------------------------------------
/*
輸出所有的水仙花數,所謂水仙花數是指一個3位數,其各個位上數字立方和等於其本身。
例如: 153 = 1*1*1 + 3*3*3 + 5*5*5 

*/
class ShuiXianHua{
    public static void main(String[] args){
        for(int i = 100;i < 1000;i++){//實現所有的三位數的一個遍歷
            int j1 = 0;
            int j2 = 0;
            int j3 = 0;
            j1 = i / 100;//百位
            j2 = (i - 100*j1) / 10;//十位
            j3 = i - 100*j1 - 10*j2;//個位

            if( i == j1*j1*j1 + j2*j2*j2 + j3*j3*j3){
                System.out.println("此數值為滿足條件的水仙花數:" + i);
            }
        }
    }
}

-------------------------------------------------------
在JAVA中,如何跳出當前的多重巢狀迴圈?
答:用break; return 方法。break 標籤名

-------------------------------------------------------

-------------------------------------------------------

-------------------------------------------------------

基本語法3-陣列_練習&面試題

java能動態分配陣列嗎? 
答:可以。int i = 12;int[] myInt = new int[i];

---------------------------------------------------
我怎麼知道陣列的長度?
.length屬性獲取

---------------------------------------------------
陣列有沒有length()這個方法? String有沒有length()這個方法
答:陣列沒有length()這個方法,有length的屬性。String有length()這個方法

---------------------------------------------------
Java中的任何資料型別都可以使用System.out.pritln方法顯示。
對基本資料型別而言,輸出的往往是變數的值;
對於像陣列這一類複雜的資料型別,會如何呢?
引用地址值

---------------------------------------------------
String[] stringArray = new String[3]; // 各元素的值預設為null
for (int i = 0; i < stringArray.length; i++) { // 對各元素進行初始化,但沒有賦值。
    stringArray[i] = new String();
    System.out.println(stringArray[i]);
}
空  (有別於null)

---------------------------------------------------
操作二維陣列不應使用常數來控制維數。具體方法是array.length表示行數,
array[row].length來表示row行的列數。這樣當陣列行數和列數不相等時,
程式碼可以自動調整為正確的值。

---------------------------------------------------
下面陣列定義正確的有_____
A.String strs[] = { ‘a’ ‘b’ ‘c’};  
B.String[] strs = {“a”, “b”, “c”};
C.String[] strs = new String{“a” ”b” ”c”};
D.String strs[] = new String[]{“a”, “b”, “c”};
E.String[] strs = new String[3]{“a”, “b”, “c”};


B_D
---------------------------------------------------
寫出結果。
class Demo{
    public static void main(String[] args){
        String foo="blue"; 
        boolean[] bar=new boolean[2]; 
        if(bar[0]){   
                  foo="green"; 
           } 
        System.out.println(foo);
    }
}

[輸出]:blue
--------------------------------------------------
下面哪個陣列定義是錯誤的。
並對錯誤的答案加上單行註釋,寫出錯誤的原因。
A,float[]=new float[3]; //錯,沒有變數名
B, float f2[]=new float[];//錯,沒有指定長度
C, float[] f1=new float[3];//
D, boolean[] b={"true","false","true"};//錯,不是布林值
E, double f4[]={1,3,5}; //
F, int f5[]=new int[3]{2,3,4}; //錯
G, float f4[]={1.2F,3.0,5.4};//錯,小數預設是double
--------------------------------------------------
陣列a[n],用java程式碼將陣列元素順序顛倒

[answer]
public static void main(String[] args){
    int [] a = new int[]{
        (int)(Math.random() * 1000),
        (int)(Math.random() * 1000),
        (int)(Math.random() * 1000),
        (int)(Math.random() * 1000),                        
        (int)(Math.random() * 1000)                                                                        
        };    
        
    System.out.println(a);
    System.out.println(Arrays.toString(a));
    swap(a);
    System.out.println(Arrays.toString(a));        
}
    
public static void swap(int a[]){
    int len = a.length;
    for(int i=0;i<len/2;i++){
        int tmp = a[i];
        a[i] = a[len-1-i];
        a[len-1-i] = tmp;
    }
}

---------------------------------------------------
//任意一個人輸入年齡,就可以判斷出他是哪個年齡段的人?

/*
0-9   兒童
10-19 少年
20-29 青少年
30-39 青年
40-49 壯年
50-59 中年
60-69 中老年
70-79 老年
80-89 老老年
90-99 老老老年
*/
/*
//1.switch
    int age = 34;
    switch(age/10){
        case 0:        ....0-9....
        case 1:   ....10-19....
        case 2:   .....
}
//2.if...else.....
    if(age>=0 && age<10){
        .....
    }else if(age>=10 && age< 20){
        ....
    }else......
*/
//3.資料結構的思想
    int age = 22;
    String[] arr = {"兒童","少年","青少年","青年","壯年","中年","","","",""};
    int idx = age/10;
    System.out.println(arr[idx])

---------------------------------------------------

---------------------------------------------------

---------------------------------------------------