當前位置:首頁 » 操作系統 » java面試題演算法

java面試題演算法

發布時間: 2022-07-12 20:29:42

❶ 誰有java面試題分享一下唄,現在復習沒有頭緒浪費了很多時間

這里有10個經典的Java面試題,也為大家列出了答案。這是Java開發人員面試經常容易遇到的問題,相信你了解和掌握之後一定會有所提高。讓我們一起來看看吧。
1.Java的HashMap是如何工作的?
HashMap是一個針對數據結構的鍵值,每個鍵都會有相應的值,關鍵是識別這樣的值。
HashMap 基於 hashing 原理,我們通過 put ()和 get ()方法儲存和獲取對象。當我們將鍵值對傳遞給 put ()方法時,它調用鍵對象的 hashCode ()方法來計算 hashcode,讓後找到 bucket 位置來儲存值對象。當獲取對象時,通過鍵對象的 equals ()方法找到正確的鍵值對,然後返回值對象。HashMap 使用 LinkedList 來解決碰撞問題,當發生碰撞了,對象將會儲存在 LinkedList 的下一個節點中。 HashMap 在每個 LinkedList 節點中儲存鍵值對對象。
2.什麼是快速失敗的故障安全迭代器?
快速失敗的Java迭代器可能會引發在底層集合迭代過程中被修改。故障安全作為發生在實例中的一個副本迭代是不會拋出任何異常的。快速失敗的故障安全範例定義了當遭遇故障時系統是如何反應的。例如,用於失敗的快速迭代器ArrayList和用於故障安全的迭代器ConcurrentHashMap。
3.Java BlockingQueue是什麼?
Java BlockingQueue是一個並發集合util包的一部分。BlockingQueue隊列是一種支持操作,它等待元素變得可用時來檢索,同樣等待空間可用時來存儲元素。
4.什麼時候使用ConcurrentHashMap?
在問題2中我們看到ConcurrentHashMap被作為故障安全迭代器的一個實例,它允許完整的並發檢索和更新。當有大量的並發更新時,ConcurrentHashMap此時可以被使用。這非常類似於Hashtable,但ConcurrentHashMap不鎖定整個表來提供並發,所以從這點上ConcurrentHashMap的性能似乎更好一些。所以當有大量更新時ConcurrentHashMap應該被使用。
5.哪一個List實現了最快插入?
LinkedList和ArrayList是另個不同變數列表的實現。ArrayList的優勢在於動態的增長數組,非常適合初始時總長度未知的情況下使用。LinkedList的優勢在於在中間位置插入和刪除操作,速度是最快的。
LinkedList實現了List介面,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。
ArrayList實現了可變大小的數組。它允許所有元素,包括null。 每個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨著不斷添加新元素而自動增加,但是增長演算法並沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。
6.Iterator和ListIterator的區別
●ListIterator有add()方法,可以向List中添加對象,而Iterator不能。
●ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向後遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator就不可以。
●ListIterator可以定位當前的索引位置,nextIndex()和previousIndex()可以實現。Iterator沒有此功能。
●都可實現刪除對象,但是ListIterator可以實現對象的修改,set()方法可以實現。Iierator僅能遍歷,不能修改。
7.什麼是CopyOnWriteArrayList,它與ArrayList有何不同?
CopyOnWriteArrayList是ArrayList的一個線程安全的變體,其中所有可變操作(add、set等等)都是通過對底層數組進行一次新的復制來實現的。相比較於ArrayList它的寫操作要慢一些,因為它需要實例的快照。
CopyOnWriteArrayList中寫操作需要大面積復制數組,所以性能肯定很差,但是讀操作因為操作的對象和寫操作不是同一個對象,讀之間也不需要加鎖,讀和寫之間的同步處理只是在寫完後通過一個簡單的"="將引用指向新的數組對象上來,這個幾乎不需要時間,這樣讀操作就很快很安全,適合在多線程里使用,絕對不會發生 ,因此CopyOnWriteArrayList適合使用在讀操作遠遠大於寫操作的場景里,比如緩存
8.迭代器和枚舉之間的區別
如果面試官問這個問題,那麼他的意圖一定是讓你區分Iterator不同於Enumeration的兩個方面:
●Iterator允許移除從底層集合的元素。
●Iterator的方法名是標准化的。
9.Hashmap如何同步?
當我們需要一個同步的HashMap時,有兩種選擇:
●使用Collections.synchronizedMap(..)來同步HashMap。
●使用ConcurrentHashMap的
這兩個選項之間的首選是使用ConcurrentHashMap,這是因為我們不需要鎖定整個對象,以及通過ConcurrentHashMap分區地圖來獲得鎖。
10.IdentityHashMap和HashMap的區別
IdentityHashMap是Map介面的實現。不同於HashMap的,這里採用參考平等。
●在HashMap中如果兩個元素是相等的,則key1.equals(key2)
●在IdentityHashMap中如果兩個元素是相等的,則key1 == key2

❷ java演算法面試題

三個for循環,第一個和第二個有啥區別?去掉一個吧
可以用迭代器remove方法,在移除的同時添加。

不知道是你記錯了還是題本身就這樣,我只想說:
寫這代碼的是二貨么?
1、每個循環的索引都是從0開始,這是什麼遍歷方式?
2、看這題的目的是想把用戶添加到相應的組里,這我就不明白了,新建一個用戶的時候就沒分配組么?那用戶的GroupId哪來的?

3、這是一個操作,難道就不會根據GroupId直接查出用戶或者組么?

這哪是優化代碼?分明是挖坑。

❸ java面試演算法題

自己算吧

❹ java 一道演算法題,阿裡面試的題,我同學給我的,希望有人解答下

  1. HashMap<String, Object> ihp = new LinkedHashMap<String, Object>();

  2. 自定義一個類

    static class MyMap
    {
    List[] lists;
    public MyMap(List... lists)
    {
    this.lists = lists;
    }

    public String toString()
    {
    if (lists == null || lists.length == 0)
    {
    return "{}";
    }
    StringBuilder sb = new StringBuilder();
    sb.append('{');
    int i = 0;
    for (List list: lists)
    {
    sb.append(list);
    i++;
    if (i == lists.length)
    return sb.append('}').toString();
    sb.append(",");
    }
    return "{}";
    }
    }

  3. ihp.put("on1",new MyMap(list2,list1));
    ihp.put("on2",new MyMap(list4,list3));
    ihp.put("on3",new MyMap(list5));
    ihp.put("on4",new MyMap(list6));
    System.out.println(ihp.toString());

    估計有更好的辦法,最開始想到的是List[],發現列印出來是[[xxx,xxx,xxx],[xx,x,x]]這種結構

❺ java面試題

Java 把內存劃分成兩種:一種是棧內存,另一種是堆內存。


在函數中定義的一些基本類型的變數和對象的引用變數都在函數的棧內存中分配。

當在一段代碼塊定義一個變數時,Java就在棧中為這個變數分配內存空間,當超過變數的作用域後,Java會自動釋放掉為該變數所分配的內存空間,該內存空間可以立即被另作他用。

堆內存用來存放由new創建的對象和數組。
在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。

在堆中產生了一個數組或對象後,還可以在棧中定義一個特殊的變數,讓棧中這個變數的取值等於數組或對象在堆內存中的首地址,棧中的這個變數就成了數組或對象的引用變數。

引用變數就相當於是為數組或對象起的一個名稱,以後就可以在程序中使用棧中的引用變數來訪問堆中的數組或對象。

java中變數在內存中的分配

1、類變數(static修飾的變數):在程序載入時系統就為它在堆中開辟了內存,堆中的內存地址存放於棧以便於高速訪問。靜態變數的生命周期--一直持續到整個"系統"關閉

2、實例變數:當你使用java關鍵字new的時候,系統在堆中開辟並不一定是連續的空間分配給變數(比如說類實例),然後根據零散的堆內存地址,通過哈希演算法換算為一長串數字以表徵這個變數在堆中的"物理位置"。實例變數的生命周期--當實例變數的引用丟失後,將被GC(垃圾回收器)列入可回收「名單」中,但並不是馬上就釋放堆中內存

3、局部變數:局部變數,由聲明在某方法,或某代碼段里(比如for循環),執行到它的時候在棧中開辟內存,當局部變數一但脫離作用域,內存立即釋放

❻ Java編程常見面試題目,要求正確答案

1.
final關鍵字,修飾類,方法,或者成員變數為最終的,使其不可被修改
finally可跟在try catch語句或者try語句後使用,表示這個方法一定會被執行
finalize通知垃圾回收機制回收被finalize標示的對象,但不保證馬上就會執行
2.
可以繼承也可以實現介面
由於構造方法必須與類型一致,所以其沒有構造方法,繼承有參構造方法必須調用父類的
直接new interface就是實現介面
3.
Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。
Java內部類與C++嵌套類最大的不 同就在於是否有指向外部的引用上
4.
&&短路與,當兩個條件,如a>b&&b>c,中a>b為假時b>c這個語句不會被執行而直接返回false
&兩個條件都會被執行
5.
最重要區別是hashtable是線程安全的(同步)而hashMap不是。。
6.
Collection 層次結構中的根介面,而Collections是一個工具類,它包含有各種有關集合操作的靜態方法
7.
系統測試的時候
8.
垃圾回收機制,因為java不能手動清理內存,而內存不清理系統資源會被耗盡,所以要有GC
9.
兩個,String pool一個"xyz",堆裡面一個String 對象
10.
11 -11
11.
s1+1,s1自動轉換成int類型,其結果返回一個int,所以報錯
12.
sleep在睡眠一段時間後會自己醒來,而wait不能,它必須別的線程喚醒它(notify或者notifyAll)
13.
java有標簽但是沒goto
14.
數組沒length()方法只有length這個屬性,String有
15.
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被「屏蔽」了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。
16.
用equals ==只判斷內存地址是否一致,而equals判斷是否引用的是同一個對象
17.
IndexOutOfBoundsException 數組越界
NullPointerException 空指針異常
SystemException 系統異常
18.
error表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。
exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況
19.
List,Set是 Map不是
20.
abstract class可以有實現方法interface不能
21.
都不能
22.
都可以
23.
start()
24.
可以
25.
不可以,String 是final
26.
不能
27.
會,先執行finally里的,再return
28.
2<<3
29.
如果不重寫方法是不可以,但是重寫了就難說
30.
引用
31.
byte可以,因為其可以自動轉換成int類型,其他都不可以
32.
public class Singleton

{
private Singleton(){}
//在自己內部定義自己一個實例,是不是很奇怪?
//注意這是private 只供內部調用
private static Singleton instance = new Singleton();
//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次
//使用時生成實例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}

❼ java演算法面試題:排序都有哪幾種方法

一、冒泡排序
[java] view plain
package sort.bubble;
import java.util.Random;
/**
* 依次比較相鄰的兩個數,將小數放在前面,大數放在後面
* 冒泡排序,具有穩定性
* 時間復雜度為O(n^2)
* 不及堆排序,快速排序O(nlogn,底數為2)
* @author liangge
*
*/
public class Main {
public static void main(String[] args) {
Random ran = new Random();
int[] sort = new int[10];
for(int i = 0 ; i < 10 ; i++){
sort[i] = ran.nextInt(50);
}
System.out.print("排序前的數組為");
for(int i : sort){
System.out.print(i+" ");
}
buddleSort(sort);
System.out.println();
System.out.print("排序後的數組為");
for(int i : sort){
System.out.print(i+" ");
}
}
/**
* 冒泡排序
* @param sort
*/
private static void buddleSort(int[] sort){
for(int i=1;i<sort.length;i++){
for(int j=0;j<sort.length-i;j++){
if(sort[j]>sort[j+1]){
int temp = sort[j+1];
sort[j+1] = sort[j];
sort[j] = temp;
}
}
}
}
}
二、選擇排序
[java] view plain
package sort.select;
import java.util.Random;
/**
* 選擇排序
* 每一趟從待排序的數據元素中選出最小(或最大)的一個元素,
* 順序放在已排好序的數列的最後,直到全部待排序的數據元素排完。
* 選擇排序是不穩定的排序方法。
* @author liangge
*
*/
public class Main {
public static void main(String[] args) {
Random ran = new Random();
int[] sort = new int[10];
for (int i = 0; i < 10; i++) {
sort[i] = ran.nextInt(50);
}
System.out.print("排序前的數組為");
for (int i : sort) {
System.out.print(i + " ");
}
selectSort(sort);
System.out.println();
System.out.print("排序後的數組為");
for (int i : sort) {
System.out.print(i + " ");
}
}
/**
* 選擇排序
* @param sort
*/
private static void selectSort(int[] sort){
for(int i =0;i<sort.length-1;i++){
for(int j = i+1;j<sort.length;j++){
if(sort[j]<sort[i]){
int temp = sort[j];
sort[j] = sort[i];
sort[i] = temp;
}
}
}
}
}
三、快速排序
[java] view plain
package sort.quick;
/**
* 快速排序 通過一趟排序將要排序的數據分割成獨立的兩部分, 其中一部分的所有數據都比另外一部分的所有數據都要小,
* 然後再按此方法對這兩部分數據分別進行快速排序, 整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
* @author liangge
*
*/
public class Main {
public static void main(String[] args) {
int[] sort = { 54, 31, 89, 33, 66, 12, 68, 20 };
System.out.print("排序前的數組為:");
for (int data : sort) {
System.out.print(data + " ");
}
System.out.println();
quickSort(sort, 0, sort.length - 1);
System.out.print("排序後的數組為:");
for (int data : sort) {
System.out.print(data + " ");
}
}
/**
* 快速排序
* @param sort 要排序的數組
* @param start 排序的開始座標
* @param end 排序的結束座標
*/
public static void quickSort(int[] sort, int start, int end) {
// 設置關鍵數據key為要排序數組的第一個元素,
// 即第一趟排序後,key右邊的數全部比key大,key左邊的數全部比key小
int key = sort[start];
// 設置數組左邊的索引,往右移動判斷比key大的數
int i = start;
// 設置數組右邊的索引,往左移動判斷比key小的數
int j = end;
// 如果左邊索引比右邊索引小,則還有數據沒有排序
while (i < j) {
while (sort[j] > key && j > start) {
j--;
}
while (sort[i] < key && i < end) {
i++;
}
if (i < j) {
int temp = sort[i];
sort[i] = sort[j];
sort[j] = temp;
}
}
// 如果左邊索引比右邊索引要大,說明第一次排序完成,將sort[j]與key對換,
// 即保持了key左邊的數比key小,key右邊的數比key大
if (i > j) {
int temp = sort[j];
sort[j] = sort[start];
sort[start] = temp;
}
//遞歸調用
if (j > start && j < end) {
quickSort(sort, start, j - 1);
quickSort(sort, j + 1, end);
}
}
}
[java] view plain
/**
* 快速排序
*
* @param a
* @param low
* @param high
* voidTest
*/
public static void kuaisuSort(int[] a, int low, int high)
{
if (low >= high)
{
return;
}
if ((high - low) == 1)
{
if (a[low] > a[high])
{
swap(a, low, high);
return;
}
}
int key = a[low];
int left = low + 1;
int right = high;
while (left < right)
{
while (left < right && left <= high)// 左邊向右
{
if (a[left] >= key)
{
break;
}
left++;
}
while (right >= left && right > low)
{
if (a[right] <= key)
{
break;
}
right--;
}
if (left < right)
{
swap(a, left, right);
}
}
swap(a, low, right);
kuaisuSort(a, low, right);
kuaisuSort(a, right + 1, high);
}
四、插入排序
[java] view plain
package sort.insert;
/**
* 直接插入排序
* 將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據
* 演算法適用於少量數據的排序,時間復雜度為O(n^2)。是穩定的排序方法。
*/
import java.util.Random;
public class DirectMain {
public static void main(String[] args) {
Random ran = new Random();
int[] sort = new int[10];
for (int i = 0; i < 10; i++) {
sort[i] = ran.nextInt(50);
}
System.out.print("排序前的數組為");
for (int i : sort) {
System.out.print(i + " ");
}
directInsertSort(sort);
System.out.println();
System.out.print("排序後的數組為");
for (int i : sort) {
System.out.print(i + " ");
}
}
/**
* 直接插入排序
*
* @param sort
*/
private static void directInsertSort(int[] sort) {
for (int i = 1; i < sort.length; i++) {
int index = i - 1;
int temp = sort[i];
while (index >= 0 && sort[index] > temp) {
sort[index + 1] = sort[index];
index--;
}
sort[index + 1] = temp;
}
}
}
順便添加一份,差不多的
[java] view plain
public static void charuSort(int[] a)
{
int len = a.length;
for (int i = 1; i < len; i++)
{
int j;
int temp = a[i];
for (j = i; j > 0; j--)//遍歷i之前的數字
{
//如果之前的數字大於後面的數字,則把大的值賦到後面
if (a[j - 1] > temp)
{
a[j] = a[j - 1];
} else
{
break;
}
}
a[j] = temp;
}
}
把上面整合起來的一份寫法:
[java] view plain
/**
* 插入排序:
*
*/
public class InsertSort {
public void sort(int[] data) {
for (int i = 1; i < data.length; i++) {
for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) {
swap(data, j, j - 1);
}
}
}
private void swap(int[] data, int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
五、順便貼個二分搜索法
[java] view plain
package search.binary;
public class Main {
public static void main(String[] args) {
int[] sort = {1,2,3,4,5,6,7,8,9,10};
int mask = binarySearch(sort,6);
System.out.println(mask);
}
/**
* 二分搜索法,返回座標,不存在返回-1
* @param sort
* @return
*/
private static int binarySearch(int[] sort,int data){
if(data<sort[0] || data>sort[sort.length-1]){
return -1;
}
int begin = 0;
int end = sort.length;
int mid = (begin+end)/2;
while(begin <= end){
mid = (begin+end)/2;
if(data > sort[mid]){
begin = mid + 1;
}else if(data < sort[mid]){
end = mid - 1;
}else{
return mid;
}
}
return -1;
}
}

❽ java 演算法簡單面試題:要源碼

package tv.bilibili;

import java.util.Scanner;
import java.util.regex.MatchResult;

public class test3 {
public static void main(String[] args) {
double price, money;
Scanner input = new Scanner(System.in);
System.out.println("請輸入物品價格:");
price = input.nextDouble();// 接受輸入數字
System.out.println("請輸入支付金額:");
money = input.nextDouble();// 接受輸入數字
if (price <= money) {

money = money - price;
int , wushi, ershi, shi, wu, yi, wujiao, yijiao;
= (int) (money / 100);
money = money - * 100;
wushi = (int) (money / 50);
money = money - wushi * 50;
ershi = (int) (money / 20);
money = money - ershi * 20;
shi = (int) (money / 10);
money = money - shi * 10;
wu = (int) (money / 5);
money = money - wu * 5;
yi = (int) (money / 1);
money = money - yi * 1;
wujiao = (int) (money / 0.5);
money = money - wujiao * 0.5;
yijiao = (int) (money / 0.1);
money = money - yijiao * 0.1;
System.out.println("主要支付給顧客100元:" + + "張;" + "50元:" + wushi
+ "張;" + "20元:" + ershi + "張;" + "10元:" + shi + "張;"
+ "5元:" + wu + "張;" + "1元:" + yi + "張;" + "5角:"
+ wujiao + "張;" + "1角:" + yijiao + "張;");
} else {
System.out.println("您所支付的金額不足!");
}
}
}

算是寫完了,其實很簡單自己不動手只會害了自己,既然選擇這個,以後問問題不要直接求代碼,而是求方法,不然你永遠從事不了這一行

❾ JAVA演算法面試題:哪位高人會做

就把演算法給你寫一下:
for(int i = 1;i<=n;i++)
for(int j = 1;j<=n;j++)
for(int k = 1;k<=n;k++)
{
if(i==j || i==k || j==k)
continue;
else
System.out.println(i*100+j*10+k);

}

熱點內容
戰地4亞洲伺服器為什麼被攻擊 發布:2025-01-22 23:45:42 瀏覽:668
javascript反編譯 發布:2025-01-22 23:37:57 瀏覽:429
夏天來了你的巴氏奶存儲對嗎 發布:2025-01-22 23:37:56 瀏覽:203
求最大值c語言 發布:2025-01-22 23:22:35 瀏覽:247
一鍵清理系統腳本 發布:2025-01-22 23:21:10 瀏覽:59
防疫宣傳腳本 發布:2025-01-22 23:21:05 瀏覽:632
編譯程序編譯後是什麼語言 發布:2025-01-22 23:20:08 瀏覽:368
電腦文件夾設密碼 發布:2025-01-22 23:17:21 瀏覽:7
anyconnect伺服器地址2018 發布:2025-01-22 23:05:56 瀏覽:530
教師資格面試試講腳本 發布:2025-01-22 22:51:37 瀏覽:684