java常見面試題一

在這裏插入圖片描述
1、JDK和JRE:
JDK:java Development Kit:Java開發工具,提供了java開發的工具和運行環境
JRE:java Runtime Environment:java運行環境,提供了java運行的環境需求
我們在開發中,下載JDK一般就包含了JRE,如果只是運行java的話可以只安裝JRE,但是一般情況下,都是安裝JDK就可以。下載好JDK,然後配置好環境變量,這是java開發的第一步
2、javax和java兩個命令
javax:是將java文件編譯成.class結尾的字節碼文件
java:執行字節碼文件
所以說java是跨平臺的語言,可以實現一次編譯,多次運行。
3、float f=1.2;;正確嘛?
不正確,對於float來說,需要後面加上f表示float常量,其實我們可以這樣理解,1.2一般默認情況下是double型數據,將一個double型數據賦值給float型數據肯定會編譯出錯,所以修改的方式有兩種,第一就是float a=1.2f;
或者float f=(float)1.2,強制類型的轉換,說到類型轉換,這邊有必要記一下,數值範圍小的會自動轉換爲數值範圍大的,數值範圍大的要轉爲數值範圍小的就必須強制類型轉換,如:
double a=3;
int a=(int)3.0;
數值範圍從低到高:
byte–>short–>int–>long–>float–>double
4、==和equals()的比較:
對於基本數據類型==就是比較值不是是相同,對於引用類型,比較的就是引用是不是相同,我們來看一段代碼:

       String str1="yxc";
       String str2="yxc";
       String str3=new String("yxc");
       System.out.println(str1==str2);//true
       System.out.println(str2==str3);//false
       System.out.println(str1.equals(str3));//true

通過結果我們可以發現,雖然字符串中的內容都是一樣的,但是比較起來還是有區別的,對於str1和str2,它們都指向常量池中的同一個值,所以引用時相同的,但是對於str3來說,它開闢了新的對象,那麼對象的引用肯定就不一樣了,所以返回false.而對於equeal()方法,其實是因爲string類中重寫了這個方法,比較的是值,所以返回的纔會是true
5、使用equals()方法返回true的兩個對象,那麼他們的hasCode()也相同?
相同:但是反過來說就不一定了,如果兩個對象的hasCode相同,那麼那麼調用的equals()方法的值不一定相同。
6、String類型是基本數據類型嗎?
不是,它是引用類型
7、String類可以被繼承嗎
不可以,因爲String類是被final修飾的類,不可以被繼承
8、那麼final在java中的作用有哪些?
修飾類:不能被繼承
修飾方法:不能被重寫
修飾變量:必須是常量,不可以改變,而且要有初值。
9、String與其它基本數據類型的相互轉換?

        String str="23";
        String str2="123.1";
        //將字符串轉換爲基本類型,要求字符串中的數據必須是對應數字類型
        int a=Integer.parseInt(str);
        double d=Double.parseDouble(str2);
        System.out.println(a);
        System.out.println(d);
        //將基本數據類型轉換爲String類型
        //要將什麼數據類型轉換爲String類型就在括號內填入值
        float f=123.456f;
        String str3=String.valueOf(f);
        System.out.println(str3);

10、操作字符串的三個類以及他們之間的區別:

        String str1 = "123";
        StringBuffer str2 = new StringBuffer("123");
        StringBuilder str3=new StringBuilder("123");
        //System.out.println(str2.equals(str3));//false 類都不相同,比較起來肯定不同
        /**
         *  其實三者都是操作字符串的類,String創建的是不可變的量,也就是每一次創建以後它的值是不會發生改變
         *  而我們平時使用的字符串的拼接+,如果使用String來拼接的話,沒拼接一次就會產生一個新的對象
         *  這樣的效率是很低的,所以纔有了後面的兩個類,它們兩個可以在原來的對象中直接修改,也就是我們說的append方法
         *  後面兩者的主要區別是:StringBuffer是線程安全的,StringBuilder是線程不安全的,但是效率會很高
         *  下面我們通過字符串的拼接來查看時間效率
         *  對於後面兩者,其實數據量小的是時候兩者的速度都差不多,都很快,但是當數據量大的時候可以看出StringBuilder時間會短一點
         *  對於String的話,效率就很低,需要將近一分鐘的時間。
         */
        //測試使用String的時間
        //獲取當前時間的毫秒數
       long startTime=System.currentTimeMillis();
       for(int i=0;i<100000;i++){
           str1+=i;
       }
       long endTime=System.currentTimeMillis();
       System.out.println("使用String拼接用時"+(endTime-startTime));

       //測試用時StringBuffer的時間
        startTime=System.currentTimeMillis();
        for(int i=0;i<100000;i++){
            str2.append(i);
        }
        endTime=System.currentTimeMillis();
       System.out.println("使用StringBuffer拼接用時"+(endTime-startTime));

       //測試使用StringBuilder的時間
        startTime=System.currentTimeMillis();
        for(int i=0;i<100000;i++){
            str3.append(i);
        }
        endTime=System.currentTimeMillis();
        System.out.println("使用StringBuffer拼接用時"+(endTime-startTime));
    }

11、如果實現字符串的反轉:

        //將字符串進行反轉
        String str1 = "abcdefg";
        StringBuffer str2 = new StringBuffer("abcd");
        StringBuilder str3 = new StringBuilder("abcd");
        //對於StringBuffer和StringBuilder來說,通過方法reverse()可以直接實現字符串反轉
        StringBuffer reverse = str2.reverse();
        StringBuilder reverse1 = str3.reverse();
        System.out.println(reverse);
        System.out.println(reverse1);
        //對於String類的,我們將其轉化爲StringBuffer類或者StringBuilder類
        //可以通過構造方法直接轉爲其它兩者類型
        StringBuffer str4=new StringBuffer(str1);
        StringBuffer reverse2 = str4.reverse();
        System.out.println(reverse2);
        //順便再將stringBuffer類型轉爲String類型
        String s = str4.toString();

12、說說length()方法,length屬性,還有size()方法分別用在什麼情況下?
length()方法用在String類中,length屬性是數組,size()方法是集合中計算長度的

        int[] a=new int[10];
        String str="yxd123";
        List<String> list=new ArrayList<>();
        list.add("詹姆斯");
        list.add("韋德");
        list.add("歐文");
        //三種計算長度的方法如下:
        System.out.println(str.length());
        System.out.println(a.length);
        System.out.println(list.size());

13、Math.round(-10.4);等於多少?

        //這個最後輸出的是一個長整型數據
        //long round = Math.round(-10.9);
        //四捨五入對於正數,對於負數的話,也是一樣,但是是在數軸上,我們可以自己畫一個數軸,在靠近那一邊就去哪一邊的值
        System.out.println(Math.round(-10.4));  //-10
        System.out.println(Math.round(10.4));   //10
        //大於這個數的最小整數
        System.out.println(Math.ceil(10.9));    //11
        System.out.println(Math.ceil(-10.9));  //-10
        //小於這個數的最大整數
        System.out.println( Math.floor(10.9));  //10
        System.out.println(Math.floor(-10.9)); //-11

14、寫出下面代碼的執行結果:

        int a1=100;
        Integer a=100;
        Integer b=100;
        int c1=190;
        Integer c=190;
        Integer d=190;
        System.out.println(a1==a);
        System.out.println(c1==c);
        System.out.println(a==b);
        System.out.println(c==d);

答案:
true
true
true
false
對於前面兩個因爲java中有自動裝箱和自動拆箱機制(就是自動將int基本數據類型轉爲Interger類,將Integer類直接轉爲int基本數據類型),但是後面兩個不是一樣的結果呢,我們通過看源碼可以發現,如果Integer數據在-128~127之間的話是不會創建新的對象的,所以使用==就是比較值,而超過上面的範圍以後,就會創建一個新的Integer對象,這樣對象的引用肯定不一樣,所以返回的是false,其它的基本數據類型也是同樣的。
15、用最有效的方法計算2*8;
2<<3
16、switch是否可以作用在byte上,是否可以作用在long上,是否可以作用在String上
當我們在switch()括號內輸入錯誤時,會給出如下提示
Incompatible types. Found: ‘long’, required: ‘char, byte, short, int, Character, Byte, Short, Integer, String, or an enum’,其中String類型是jdk1,7以後支持的
17、&和&&的區別:

       //&和&&
        System.out.println(4&5);
        //4&5做位運算,首先將它們轉爲二進制,然後每一位進行與運算,同時爲1結果才爲1

        //&&短路與運算,理論上會將&&兩邊的boolean值都計算出來,但是實際上當左側不滿足條件時,就產生了短路現象,後面的是不會進行判斷的
        if(1>2&&2>3){
            System.out.println("這句話不會被輸出");
        }

18、怎麼將GB2312編碼的字符串轉換爲ISO-8859-1編碼的字符串?

       String str1="新春";
       String str2=new String(str1.getBytes("GB2312"),"ISO-8859-1");
       System.out.println(str2);

這樣打印的話肯定會出現中文亂碼的嗎,因爲默認情況下ISO-8859-1編碼是不支持中文的。
19、如何獲取當前時間以及以我們希望的格式輸出?

 //獲取當前的時間
        Date date=new Date();
        //按照自己的方式格式化時間
        SimpleDateFormat DateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = DateFormat.format(date);
        System.out.println(format);

20、如何使用日曆類:

//它是一個接口,所以不能直接通過new或得實例
        //下面的cal對象中就包含了現在時間的所有信息。我們可以獲取
        Calendar cal=Calendar.getInstance();
        //下面通過Calendar類中的常量屬性直接獲取年月日 時分秒 還有很多其它屬性,比如第幾周,這一天是一週的第幾天
        System.out.println(cal.get(Calendar.YEAR));
        System.out.println(cal.get(Calendar.MONTH)+1);
        System.out.println(cal.get(Calendar.DAY_OF_MONTH));
        System.out.println(cal.get(Calendar.HOUR_OF_DAY));
        System.out.println(cal.get(Calendar.MINUTE));
        System.out.println(cal.get(Calendar.SECOND));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章