Java算法之经典题目篇

Java算法之经典题目篇
Java算法之经典题目篇

Java算法之经典题目篇

费式数列(Fibonacci)问题说明:

Fibonacci为1200年代的欧洲数学家,在他的著作中曾经提到:若有一只兔子每个月生一只小兔子,一个月后小兔子也开始生产。起初只有一只兔子,一个月后就有两只兔子,两个月后有三只兔子,三个月后有五只兔子(小兔子投入生产)……

这就是Fibonacci数列,一般习惯称之为费式数列,例如:1,1,2,3,5,8,13,21,34,55,89,……

算法代码(Java):

public class Fibonacci

{

public static void main(String[] args)

{

int[] fib = new int[20];

fib[0] = 0;

fib[1] = 1;

for(int i = 2; i < fib.length; i++)

fib[i] = fib[i-1] + fib[i-2];

for(int i = 0; i < fib.length; i++)

System.out.print(fib[i] + " ");

System.out.println();

}

}

巴斯卡三角形(Pascal)

问题说明:巴斯卡(Pascal)三角形基本上就是在解C

算法代码(Java):

import java.awt.*;

import javax.swing.*;

public class Pascal extends JFrame {

public Pascal() {

setBackground(Color.white);

setTitle("巴斯卡三角形");

setSize(520, 350);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

show();

}

private long combi(int n, int r){

int i;

long p = 1;

for(i = 1; i <= r; i++)

p = p * (n-i+1) / i;

return p;

}

public void paint(Graphics g) {

final int N = 12;

int n, r, t;

for(n = 0; n <= N; n++) {

for(r = 0; r <= n; r++)

g.drawString(" " + combi(n, r),

(N-n)*20 + r * 40, n * 20 + 50);

}

}

public static void main(String args[]) {

Pascal frm = new Pascal();

}

}

三色旗(ThreeColorFlags)

问题说明:三色旗的问题最早由E.W.Dijkstra所提出,塔所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来说明。

假设有一条绳子,上面有红,白,蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列蓝,白,红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。

算法代码(Java):

import java.io.*;

public class ThreeColorsFlags {

private void swap(char[] flags, int x, int y) {

char temp;

temp = flags[x];

flags[x] = flags[y];

flags[y] = temp;

}

public String move(char[] flags) {

int wFlag = 0;

int bFlag = 0;

int rFlag = flags.length - 1;

while(wFlag <= rFlag) {

if(flags[wFlag] == 'W') {

wFlag++;

}

else if(flags[wFlag] == 'B') {

swap(flags, bFlag, wFlag);

bFlag++;

wFlag++;

}

else {

while(wFlag < rFlag && flags[rFlag] == 'R') rFlag--;

swap(flags, rFlag, wFlag);

rFlag--;

}

}

return new String(flags);

}

public static void main(String[] args)

throws IOException { BufferedReader buf;

buf = new BufferedReader(

new InputStreamReader(System.in));

System.out.print("输入三色旗顺序(ex. RWBBWRWR):");

String flags = buf.readLine();

ThreeColorsFlags threeColorsFlag = new ThreeColorsFlags();

flags = threeColorsFlag.move(

flags.toUpperCase().toCharArray());

System.out.println("移动顺序后:" + flags);

}

}

老鼠走迷宫(Mouse)

问题说明:

老鼠走迷宫是循环求解的基本类型,我们在二维数组中用2来表示迷宫的墙壁,使用1来表示老鼠的行走路径,并用程序求出从入口到出口的距离。

算法代码(Java):

public class Mouse {

private int startI, startJ; // 入口

private int endI, endJ; // 出口

private boolean success = false;

public static void main(String[] args) {

int[][] maze = {{2, 2, 2, 2, 2, 2, 2},

{2, 0, 0, 0, 0, 0, 2},

{2, 0, 2, 0, 2, 0, 2},

{2, 0, 0, 2, 0, 2, 2},

{2, 2, 0, 2, 0, 2, 2},

{2, 0, 0, 0, 0, 0, 2},

{2, 2, 2, 2, 2, 2, 2}};

System.out.println("显示迷宫:");

for(int i = 0; i < maze.length; i++) {

for(int j = 0; j < maze[0].length; j++)

if(maze[j] == 2)

System.out.print("█");

else

System.out.print(" ");

System.out.println();

}

Mouse mouse = new Mouse();

mouse.setStart(1, 1);

mouse.setEnd(5, 5);

if(!mouse.go(maze)) {

System.out.println("\n没有找到出口!");

}

else {

System.out.println("\n找到出口!");

for(int i = 0; i < maze.length; i++) {

for(int j = 0; j < maze[0].length; j++) {

if(maze[j] == 2)

System.out.print("█");

else if(maze[j] == 1)

System.out.print("◇");

else

System.out.print(" ");

}

System.out.println();

}

}

}

public void setStart(int i, int j) {

this.startI = i;

this.startJ = j;

}

public void setEnd(int i, int j) {

this.endI = i;

this.endJ = j;

}

public boolean go(int[][] maze) {

return visit(maze, startI, startJ);

}

private boolean visit(int[][] maze, int i, int j) { maze[j] = 1;

if(i == endI && j == endJ)

success = true;

if(!success && maze[j+1] == 0)

visit(maze, i, j+1);

if(!success && maze[i+1][j] == 0)

visit(maze, i+1, j);

if(!success && maze[j-1] == 0)

visit(maze, i, j-1);

if(!success && maze[i-1][j] == 0)

visit(maze, i-1, j);

if(!success)

maze[j] = 0;

return success;

}

}

由于迷宫的设计,老鼠从迷宫的入口到出口的路径可能不只一条,下面我们显示所有路径。public class Mouse {

private int startI, startJ; // 入口

private int endI, endJ; // 出口

public static void main(String[] args) {

int maze[][] = {{2, 2, 2, 2, 2, 2, 2, 2, 2},

{2, 0, 0, 0, 0, 0, 0, 0, 2},

{2, 0, 2, 2, 0, 2, 2, 0, 2},

{2, 0, 2, 0, 0, 2, 0, 0, 2},

{2, 0, 2, 0, 2, 0, 2, 0, 2},

{2, 0, 0, 0, 0, 0, 2, 0, 2},

{2, 2, 0, 2, 2, 0, 2, 2, 2},

{2, 0, 0, 0, 0, 0, 0, 0, 2},

{2, 2, 2, 2, 2, 2, 2, 2, 2}};

System.out.println("显示迷宫:");

for(int i = 0; i < maze.length; i++) {

for(int j = 0; j < maze[0].length; j++)

if(maze[i][j] == 2)

System.out.print("█");

else

System.out.print(" ");

System.out.println();

}

Mouse mouse = new Mouse();

mouse.setStart(1, 1);

mouse.setEnd(7, 7);

mouse.go(maze);

}

public void setStart(int i, int j) {

this.startI = i;

this.startJ = j;

}

public void setEnd(int i, int j) {

this.endI = i;

this.endJ = j;

}

public void go(int[][] maze) {

visit(maze, startI, startJ);

}

private void visit(int[][] maze, int i, int j) {

maze[i][j] = 1;

if(i == endI && j == endJ) {

System.out.println("\n找到出口!");

for(int m = 0; m < maze.length; m++) {

for(int n = 0; n < maze[0].length; n++) {

if(maze[m][n] == 2)

System.out.print("█");

else if(maze[m][n] == 1)

System.out.print("◇");

else

System.out.print(" ");

}

System.out.println();

}

}

if(maze[i][j+1] == 0)

visit(maze, i, j+1);

if(maze[i+1][j] == 0)

visit(maze, i+1, j);

if(maze[i][j-1] == 0)

visit(maze, i, j-1);

if(maze[i-1][j] == 0)

visit(maze, i-1, j);

maze[i][j] = 0;

}

}

骑士走棋盘(Knight tour)

问题说明:

骑士游戏,在十八世纪倍受数学家与拼图迷的注意,骑士的走法为西洋棋的走发,骑士可以由任何一个位置出发,它要如何走完所有的位置。

算法代码(Java):

public class Knight {

public boolean travel(int startX,

int startY, int[][] board) {

// 对应骑士可以走的八个方向

int[] ktmove1 = {-2, -1, 1, 2, 2, 1, -1, -2};

int[] ktmove2 = {1, 2, 2, 1, -1, -2, -2, -1};

// 下一个出路的位置int[] nexti = new int[board.length];

int[] nextj = new int[board.length];

// 记录出路的个数

int[] exists = new int[board.length];

int x = startX;

int y = startY;

board[x][y] = 1;

for(int m = 2; m <= Math.pow(board.length, 2); m++) { for(int k = 0; k < board.length; k++) {

exists[k] = 0;

}

int count = 0;

// 试探八个方向

for(int k = 0; k < board.length; k++) {

int tmpi = x + ktmove1[k];

int tmpj = y + ktmove2[k];

// 如果是边界,不可以走

if(tmpi < 0 || tmpj < 0 ||

tmpi > 7 || tmpj > 7) {

continue;

}

// 如果这个方向可以走,记录下来

if(board[tmpi][tmpj] == 0) {

nexti[count] = tmpi;

nextj[count] = tmpj;

// 可走的方向加一个

count++;

}

}

int min = -1;

if(count == 0) {

return false;

}

else if(count == 1) {

min = 0;

}

else {

// 找出下个位置的出路数

for(int l = 0; l < count; l++) {

for(int k = 0; k < board.length; k++) {

int tmpi = nexti[l] + ktmove1[k];

int tmpj = nextj[l] + ktmove2[k];

if(tmpi < 0 || tmpj < 0 ||

tmpi > 7 || tmpj > 7) {

continue;

}

if(board[tmpi][tmpj] == 0)

exists[l]++;

}

}

int tmp = exists[0];

min = 0;

// 从可走的方向寻找最少出路的方向

for(int l = 1; l < count; l++) {

if(exists[l] < tmp) {

tmp = exists[l];

min = l;

}

}

}

// 走最少出路的方向

x = nexti[min];

y = nextj[min];

board[x][y] = m;

}

return true;

}

public static void main(String[] args) {

int[][] board = new int[8][8];

Knight knight = new Knight();

if(knight.travel(

Integer.parseInt(args[0]),

Integer.parseInt(args[1]), board)) {

System.out.println("走棋完成!");

}

else {

System.out.println("走棋失败!");

}

for(int i = 0; i < board.length; i++) {

for(int j = 0; j < board[0].length; j++) {

if(board[i][j] < 10) {

System.out.print(" " + board[i][j]);

}

else {

System.out.print(board[i][j]);

}

System.out.print(" ");

}

System.out.println();

}

}

}

八个皇后(Queen)

问题说明:

西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上?

算法代码(Java):

public class Queen {

// 同位置是否有皇后,1表示有

private int[] column;

// 右上至左下是否有皇后

private int[] rup;

// 左上至右下是否有皇后

private int[] lup;

// 解答

private int[] queen;

// 解答编号

private int num;

public Queen() {

column = new int[8+1];

rup = new int[2*8+1];

lup = new int[2*8+1];

for(int i = 1; i <= 8; i++)

column[i] = 1;

for(int i = 1; i <= 2*8; i++)

rup[i] = lup[i] = 1;

queen = new int[8+1];

}

public void backtrack(int i) {

if(i > 8) {

showAnswer();

}

else {

for(int j = 1; j <= 8; j++) {

if(column[j] == 1 &&

rup[i+j] == 1 &&

lup[i-j+8] == 1) {

queen[i] = j;

// 设定为占用

column[j] = rup[i+j] = lup[i-j+8] = 0;

backtrack(i+1);

column[j] = rup[i+j] = lup[i-j+8] = 1;

}

}

}

}

protected void showAnswer() {

num++;

System.out.println("\n解答" + num);

for(int y = 1; y <= 8; y++) {

for(int x = 1; x <= 8; x++) {

if(queen[y] == x) {

System.out.print(" Q");

}

else {

System.out.print(" .");

}

}

System.out.println();

}

}

public static void main(String[] args) {

Queen queen = new Queen();

queen.backtrack(1);

}

}

八枚银币(Coins)

问题说明:

现在有八枚银币abcdefg,已知其中一枚是假币,其重量不同于真币,但不知道是轻还是重,如何用天平以最小的比较次数决定出那个是假币,并得知假币是比真币轻还是重。

算法代码(Java):

public class Coins {

private int[] coins;

public Coins() {

coins = new int[8];

for(int i = 0; i < 8; i++)

coins[i] = 10;

}

public void setFake(int weight) {

coins[(int) (Math.random() * 7)] = weight;

}

public void fake() {

if(coins[0]+coins[1]+coins[2] ==

coins[3]+coins[4]+coins[5]) {

if(coins[6] > coins[7])

compare(6, 7, 0);

else

compare(7, 6, 0);

}

else if(coins[0]+coins[1]+coins[2] >

coins[3]+coins[4]+coins[5]) {

if(coins[0]+coins[3] == coins[1]+coins[4])

compare(2, 5, 0);

else if(coins[0]+coins[3] > coins[1]+coins[4])

compare(0, 4, 1);

if(coins[0]+coins[3] < coins[1]+coins[4])

compare(1, 3, 0);

}

else if(coins[0]+coins[1]+coins[2] <

coins[3]+coins[4]+coins[5]) {

if(coins[0]+coins[3] == coins[1]+coins[4])

compare(5, 2, 0);

else if(coins[0]+coins[3] > coins[1]+coins[4])

compare(3, 1, 0);

if(coins[0]+coins[3] < coins[1]+coins[4])

compare(4, 0, 1);

}

protected void compare(int i, int j, int k) {

if(coins[i] > coins[k])

System.out.print("\n假币" + (i+1) + " 较重");

else

System.out.print("\n假币" + (j+1) + " 较轻");

}

public static void main(String[] args) {

if(args.length == 0) {

System.out.println("输入假币重量(比10大或小)");

System.out.println("ex. java Coins 5");

return;

}

Coins eightCoins = new Coins();

eightCoins.setFake(Integer.parseInt(args[0]));

eightCoins.fake();

}

}

生命游戏(Life game)

问题说明:

生命游戏,为1970年英国数学家J.H.Conway所提出,某一细胞的邻居包括上,下,左,右,左上,左下,右上与右下相邻的细胞,游戏规则如下:

1,孤单死亡:如果细胞的邻居小于一个,则该细胞在下一个状态死亡。

2,拥挤死亡:如果细胞的邻居在四个以上,则该细胞在下一个状态死亡。

3,稳定:如果细胞的邻居为两个或三个,则该细胞在下一个状态稳定。

4,复活:如果某位置原无细胞存活,而该位置的邻居为三个,则该位置将复活一个细胞。算法代码(Java):

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class LifeGame {

private boolean[][] map;

private boolean[][] newmap;

public LifeGame(int maxRow, int maxColumn) {

map = new boolean[maxRow][maxColumn];

newmap = new boolean[maxRow][maxColumn];

}

public void setCell(int x, int y) {

map[x][y] = true;

}

public void next() {

for(int row = 0; row < map.length; row++) { for(int col = 0; col < map[0].length; col++) {

switch (neighbors(row, col)) {

case 0:

case 1:

case 4:

case 5:

case 6:

case 7:

case 8:

newmap[row][col] = false;

break;

case 2:

newmap[row][col] = map[row][col];

break;

case 3:

newmap[row][col] = true;

break;

}

}

}

copyMap();

}

public void outputMap() throws IOException { System.out.println("\n\nGame of life cell status");

for(int row = 0; row < map.length; row++) { System.out.print("\n ");

for(int col = 0; col < map[0].length; col++) if(map[row][col] == true)

System.out.print('#');

else

System.out.print('-');

}

}

private void copyMap() {

for(int row = 0; row < map.length; row++)

for(int col = 0; col < map[0].length; col++) map[row][col] = newmap[row][col];

}

private int neighbors(int row, int col) {

int count = 0;

for(int r = row-1; r <= row+1; r++)

for(int c = col-1; c <= col+1; c++) {

if(r < 0 || r >= map.length ||

c < 0 || c >= map[0].length)

continue;

if(map[r][c] == true)

count++;

}

if(map[row][col] == true)

count--;

return count;

}

public static void main(String[] args)

throws NumberFormatException, IOException { BufferedReader bufReader =

new BufferedReader(

new InputStreamReader(System.in));

LifeGame game = new LifeGame(10, 25);

System.out.println("Game of life Program");

System.out.println(

"Enter x, y where x, y is living cell");

System.out.println("0 <= x < 10, 0 <= y < 25");

System.out.println("Terminate with x, y = -1, -1");

while(true) {

String[] strs = bufReader.readLine().split(" ");

int row = Integer.parseInt(strs[0]);

int col = Integer.parseInt(strs[1]);

if(0 <= row && row < 10 && 0 <= col && row < 25) game.setCell(row, col);

else if(row == -1 || col == -1) {

break;

}

else {

System.out.print(

"(x, y) exceeds map ranage!");

}

}

while(true) {

game.outputMap();

game.next();

System.out.print(

"\nContinue next Generation ? ");

String ans = bufReader.readLine().toUpperCase();

if(!ans.equals("Y"))

break;

}

}

}

字符串核对(String Match)

问题说明:

现在的一些高级程序语言对于字符串的处理支持越来越大,不过字符串搜寻本身仍是值得探讨的课题,在这里以Boyer Moore法来说明如何进行字符串说明,这个方法速度快且容易理解。

算法代码(Java):

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class StringMatch {

private int[] skip;

private int p;

private String str;

private String key;

public StringMatch(String key) {

skip = new int[256];

this.key = key;

for(int k = 0; k <= 255; k++)

skip[k] = key.length();

for(int k = 0; k < key.length() - 1; k++)

skip[key.charAt(k)] = key.length() - k - 1;

}

public void search(String str) {

this.str = str;

p = search(key.length()-1, str, key);

}

private int search(int p, String input, String key) { while(p < input.length()) {

String tmp = input.substring(

p-key.length()+1, p+1);

if(tmp.equals(key)) // 比较两个字符串是否相同

return p-key.length()+1;

p += skip[input.charAt(p)];

}

return -1;

}

public boolean hasNext() {

return (p != -1);

}

public String next() {

String tmp = str.substring(p);

p = search(p+key.length()+1, str, key);

return tmp;

}

public static void main(String[] args)

throws IOException { BufferedReader bufReader =

new BufferedReader(

new InputStreamReader(System.in));

System.out.print("请输入字符串:");

String str = bufReader.readLine();

System.out.print("请输入搜寻关键字:");

String key = bufReader.readLine();

StringMatch strMatch = new StringMatch(key);

strMatch.search(str);

while(strMatch.hasNext()) {

System.out.println(strMatch.next());

}

}

}

双色,三色河内塔(Hanoi2Colors)

问题说明:

双色,三色河内塔是由河内塔演变而来的一种算法。算法代码(Java):

public class Hanoi2Colors {

public static void help() {

System.out.println

"Usage: java Hanoi2Colors number_of_disks");

System.out.println(

"\t number_of_disks: must be a even number.");

System.exit(0);

}

public static void main(String[] args) {

int disks = 0;

try {

disks = Integer.parseInt(args[0]);

} catch (Exception e) {

help();

}

if ((disks <= 0) || (disks % 2 != 0)) {

help();

}

hanoi2colors(disks);

}

public static void hanoi(int disks,

char source, char temp, char target) { if (disks == 1) {

System.out.println("move disk from "

+ source + " to " + target);

System.out.println("move disk from "

+ source + " to " + target);

} else {

hanoi(disks-1, source, target, temp);

hanoi(1, source, temp, target);

hanoi(disks-1, temp, source, target);

}

}

public static void hanoi2colors(int disks) {

char source = 'A';

char temp = 'B';

char target = 'C';

for (int i = disks / 2; i > 1; i--) {

hanoi(i-1, source, temp, target);

System.out.println("move disk from "

+ source + " to " + temp);

System.out.println("move disk from "

+ source + " to " + temp);

hanoi(i-1, target, temp, source);

System.out.println("move disk from "

+ temp + " to " + target);

}

System.out.println("move disk from "

+ source + " to " + temp);

System.out.println("move disk from "

+ source + " to " + target);

}

}

三色河内塔

public class Hanoi3Colors {

public static void help() {

System.out.println(

"Usage: java Hanoi3Colors number_of_disks");

System.out.println(

"\tnumber_of_disks: must be a number divisible by 3.");

System.exit(0);

}

public static void main(String[] args) {

int disks = 0;

try {

disks = Integer.parseInt(args[0]);

} catch (Exception e) {

help();

}

if ((disks <= 0) || (disks % 3 != 0)) {

help();

}

hanoi3colors(disks);

}

public static void hanoi(int disks,

char source, char temp, char target) { if (disks == 1) {

System.out.println("move disk from "

+ source + " to " + target);

System.out.println("move disk from "

+ source + " to " + target);

System.out.println("move disk from "

+ source + " to " + target);

} else {

hanoi(disks-1, source, target, temp);

hanoi(1, source, temp, target);

hanoi(disks-1, temp, source, target);

}

}

public static void hanoi3colors(int disks) { char source = 'A';

char temp = 'B';

char target = 'C';

if (disks == 3) {

System.out.println("move disk from "

+ source + " to " + temp);

System.out.println("move disk from "

+ source + " to " + temp);

System.out.println("move disk from "

+ source + " to " + target);

System.out.println("move disk from "

+ temp + " to " + target);

System.out.println("move disk from "

+ temp + " to " + source);

System.out.println("move disk from "

+ target + " to " + temp);

} else {

hanoi(disks/3-1, source, temp, target);

System.out.println("move disk from "

+ source + " to " + temp);

System.out.println("move disk from "

+ source + " to " + temp);

System.out.println("move disk from "

+ source + " to " + temp);

hanoi(disks/3-1, target, temp, source);

System.out.println("move disk from "

+ temp + " to " + target);

System.out.println("move disk from "

+ temp + " to " + target);

System.out.println("move disk from "

+ temp + " to " + target);

hanoi(disks/3-1, source, target, temp);

System.out.println("move disk from "

+ target + " to " + source);

System.out.println("move disk from "

+ target + " to " + source);

hanoi(disks/3-1, temp, source, target);

System.out.println("move disk from "

+ source + " to " + temp);

for (int i = disks / 3 - 1; i > 0; i--) {

if (i>1) {

hanoi(i-1, target, source, temp);

}

java经典面试题汇总

Java基础方面: 1、作用域public,private,protected,以及不写时的区别 答:区别如下: 作用域当前类同一package 子孙类其他package public √√√√ protected √√√ × friendly √√ × × private √ × × × 不写时默认为friendly 2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现 3、Static Nested Class 和 Inner Class的不同 答:Nested Class (一般是C++的说法),Inner Class (一般是JA V A的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注:静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象 4、&和&&的区别 答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and) 5、Collection 和 Collections的区别 答:Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作 6、什么时候用assert 答:assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的 7、String s = new String("xyz");创建了几个String Object 答:两个,一个字符对象,一个字符对象引用对象 8、Math.round(11.5)等於多少? Math.round(-11.5)等於多少 答: Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回与参数最接近的长整数,参数加1/2后求其floor 9、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;(可以正确编译) 10、Java有没有goto 答:java中的保留字,现在没有在java中使用 11、数组有没有length()这个方法? String有没有length()这个方法 答:数组没有length()这个方法,有length的属性。String有有length()这个方法 12、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型

JAVA框架面试题汇总

1.SpringMVC Framework的理解: 1、它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是java组件。并且和Spring提供的其他基础结构紧密集成 2、不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的) 3、可以任意使用各种视图技术,而不仅仅局限于JSP 4、支持各种请求资源的映射策略 5、它应是易于扩展的 2.简单的谈一下SpringMVC的工作流程? 流程? 1、用户发送请求至前端控制器DispatcherServlet? 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。? 3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。? 4、DispatcherServlet调用HandlerAdapter处理器适配器? 5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。? 6、Controller执行完成返回ModelAndView? 7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet? 8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器? 9、ViewReslover解析后返回具体View? 10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。? 11、DispatcherServlet响应用户 3.如何解决POST请求中文乱码问题,GET的又如何处理呢? 在web.xml中加入: . .CharacterEncodingFilter . .???? .????????encoding .?????? utf-8

2019最新Java面试题,常见面试题及答案汇总

ava最新常见面试题+ 答案汇总 1、面试题模块汇总 面试题包括以下十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示: 可能对于初学者不需要后面的框架和JVM 模块的知识,读者朋友们可根据自己的情况,选择对应的模块进行阅读。 适宜阅读人群 需要面试的初/中/高级java 程序员 想要查漏补缺的人 想要不断完善和扩充自己java 技术栈的人 java 面试官 具体面试题 下面一起来看208 道面试题,具体的内容。 一、Java 基础 1.JDK 和JRE 有什么区别? 2.== 和equals 的区别是什么? 3.两个对象的hashCode()相同,则equals()也一定为true,对吗? 4.final 在java 中有什么作用? 5.java 中的Math.round(-1.5) 等于多少? 6.String 属于基础的数据类型吗? 7.java 中操作字符串都有哪些类?它们之间有什么区别? 8.String str="i"与String str=new String(“i”)一样吗? 9.如何将字符串反转? 10.String 类的常用方法都有那些? 11.抽象类必须要有抽象方法吗? 12.普通类和抽象类有哪些区别? 13.抽象类能使用final 修饰吗?

14.接口和抽象类有什么区别? 15.java 中IO 流分为几种? 16.BIO、NIO、AIO 有什么区别? 17.Files的常用方法都有哪些? 二、容器 18.java 容器都有哪些? 19.Collection 和Collections 有什么区别? 20.List、Set、Map 之间的区别是什么? 21.HashMap 和Hashtable 有什么区别? 22.如何决定使用HashMap 还是TreeMap? 23.说一下HashMap 的实现原理? 24.说一下HashSet 的实现原理? 25.ArrayList 和LinkedList 的区别是什么? 26.如何实现数组和List 之间的转换? 27.ArrayList 和Vector 的区别是什么? 28.Array 和ArrayList 有何区别? 29.在Queue 中poll()和remove()有什么区别? 30.哪些集合类是线程安全的? 31.迭代器Iterator 是什么? 32.Iterator 怎么使用?有什么特点? 33.Iterator 和ListIterator 有什么区别? 34.怎么确保一个集合不能被修改?

百一测评——Java经典面试题 带答案

职业技能题库&在线云笔试平台https://www.360docs.net/doc/e44566399.html, 试卷名称:Java经典面试题带答案 试卷描述:java笔试题目、招聘笔试、微信考试、在线考试 试卷链接:https://www.360docs.net/doc/e44566399.html,/store/open/paperInfo/41651 试卷限时:50分 一.单项选择题 每题分值:2.5分 是否题目乱序:是 是否选项乱序:是 是否可回溯:是 难度:中 1.[单选]Java是从()语言改进重新设计。 A.Ada B.C++ C.Pasacal D.BASIC 答案:B 2.[单选]下列语句哪一个正确() A.Java程序经编译后会产生machine code B.Java程序经编译后会产生byte code C.Java程序经编译后会产生DLL D.以上都不正确

职业技能题库&在线云笔试平台https://www.360docs.net/doc/e44566399.html, 答案:B 3.[单选]下列说法正确的有() A.class中的constructor不可省略 B.constructor必须与class同名,但方法不能与class同名 C.constructor在一个对象被new时执行 D.一个class只能定义一个constructor 答案:C 4.[单选]提供Java存取数据库能力的包是() A.java.sql B.java.awt C.https://www.360docs.net/doc/e44566399.html,ng D.java.swing 答案:A 5.[单选]下列运算符合法的是() A.&& B.<> C.if D.:= 答案:A 6.[单选]执行如下程序代码 a=0;c=0;

职业技能题库&在线云笔试平台https://www.360docs.net/doc/e44566399.html, do{ --c; a=a-1; }while(a>0); 后,C的值是() A.0 B.1 C.-1 D.死循环 答案:C 7.[单选]下列哪一种叙述是正确的() A.abstract修饰符可修饰字段、方法和类 B.抽象方法的body部分必须用一对大括号{}包住 C.声明抽象方法,大括号可有可无 D.声明抽象方法不可写出大括号 答案:D 8.[单选]下列语句正确的是() A.形式参数可被视为localvariable B.形式参数可被字段修饰符修饰 C.形式参数为方法被调用时,真正被传递的参数 D.形式参数不可以是对象

Java经典面试题大全_带答案

Java经典面试题带答案一、单项选择题 1.Java是从()语言改进重新设计。 A.Ada B.C++ C.Pasacal D.BASIC 答案:B 2.下列语句哪一个正确() A.Java程序经编译后会产生machine code B.Java程序经编译后会产生byte code(字节码) C.Java程序经编译后会产生DLL D.以上都不正确 答案:B 3.下列说法正确的有() A.class中的constructor不可省略 B.constructor必须与class同名,但方法不能与class同名C.constructor在一个对象被new时执行(构造器) D.一个class只能定义一个constructor 答案:C 4.提供Java存取数据库能力的包是() A.Java.sql /sql/数据库还有Oracle 也是一种数据库 B.java.awt C.https://www.360docs.net/doc/e44566399.html,ng D.java.swing 答案:A 5.下列运算符合法的是() A.&& B.<> C.if D.:= 答案:A 6.执行如下程序代码 a=0;c=0; do{ --c; a=a-1; }while(a>0); 后,C的值是() A.0 B.1 C.-1 D.死循环

答案:C 7.下列哪一种叙述是正确的() A.abstract修饰符可修饰字段、方法和类 B.抽象方法的body部分必须用一对大括号{}包住 C.声明抽象方法,大括号可有可无 D.声明抽象方法不可写出大括号 答案:D 8.下列语句正确的是() A.形式参数可被视为localvariable B.形式参数可被字段修饰符修饰 C.形式参数为方法被调用时,真正被传递的参数 D.形式参数不可以是对象 答案:A 9.下列哪种说法是正确的() A.实例方法可直接调用超类的实例方法 B.实例方法可直接调用超类的类方法 C.实例方法可直接调用其他类的实例方法 D.实例方法可直接调用本类的类方法 答案:D 二、多项选择题 1.Java程序的种类有() A.类(Class) B.Applet C.Application D.Servlet 2.下列说法正确的有() A.环境变量可在编译sourcecode时指定 B.在编译程序时,所能指定的环境变量不包括class path C.javac一次可同时编译数个Java源文件 D.javac.exe能指定编译结果要置于哪个目录(directory)答案:BCD 3.下列标识符不合法的有() A.new B.$Usdollars C.1234 D.car.taxi 答案:ACD 4.下列说法错误的有() A.数组是一种对象 B.数组属于一种原生类 C.intnumber=[]={31,23,33,43,35,63} D.数组的大小可以任意改变 答案:BCD 5.不能用来修饰interface的有()

java面试题大全(整理版)

2018年(整理版) 1、面向对象的特征有哪些方面? - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。 - 继承:继承是从已有类得到继承信息创建新类的过程。提供继承的类叫父类(超类、基类)、得到继承的类叫子类(派生类)。 - 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。 - 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类中的方法);2). 对象造型(用父类型引用引用子类型对象,

这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为) 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? 答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。 4、float f=3.4;是否正确? 答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。

这76道Java面试题及答案

这76道Java面试题及答案,祝你能成功通过面试 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。 2、Java有没有goto? java中的保留字,现在没有在java中使用。 3、说说&和&&的区别。 &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。 &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。 &还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作。 4、在JAVA中如何跳出当前的多重嵌套循环? 在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。

5、switch语句能否作用在byte上,能否作用在long上,能否作用在String 上? 在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char 都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。 6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。 对于short s1 = 1; s1 += 1;由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。 7、char型变量中能不能存贮一个中文汉字?为什么? char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。 8、用最有效率的方法算出2乘以8等於几? 2 << 3,

Java经典面试笔试题及答案

1.什么是对象序列化,为什么要使用? 所谓对象序列化就是把一个对象以二进制流的方式保存到硬盘上。好处:方便远程调用。 2.值传递与引用传递的区别? 所谓值传递就是把一个对象的值传给一个新的变量,但是系统会给这个新的变量开辟一个新的内存空间。不会改变原有的值所谓引用传递就是把一个对象在堆中保存的数据传递给一个变量,此时新的变量与原有的变量对应同一个内存存储空间,当新的变量修改对象的属性时,内存中的数据也会修改。 3.接口与抽象类的区别? 1:接口里面不可以实现方法体,抽象类可以实现方法体。 2:接口可以多继承接口,抽象类不可以。 3:接口需要被子类实现,抽象类是要被子类继承(单一继承)。 4:接口中只能有公有的方法和属性而且必须赋初始值,抽象类中可以有私有方法和属性. 5: 接口中不能存在静态方法,但属性可以和final,抽象类中方法中可以有静态方法,属性也可以。 4.谈谈继承,为什么要使用继承? 所谓继承就是找出几个类中共同的部分,提取出来作为父类。而子类只需要继承父类,就可以共享父类的方法。 使用继承能够减少重复的代码。 5.方法重载的好处?

所谓重载就是在一个类中可以定义多个相同的方法,但是方法的参数类型和参数的个数以及顺序要不同。 重载的好处就是能够让我们很快的掌握该方法的功能,我们只要要记住该方法就能很快的理解该方法的参数以及参数的作用 6.项目中印象最深的部分? 我觉得在该项目中我体现到了反射技术的强大之处,原来我一直不清楚反射是一种什么样的技术,只知道一些概念上的知识,经过这个项目之后,终于知道该怎样灵活运用反射,以及在什么时候运用。 谈谈你对面向对象的理解与认识? 我觉得使用面向对象这种思维的方式比较符合我们人类的思想,不需要去学习一些什么新的思考方式,就按照现实生活做的一些故事就能让人理解该内容的知识以及他们的作用。 我的看法就是: 1:当加入新的功能的时候不会修改原有的代码。(面向接口编程) 2: 当我们写的一个类可以重复的运用在其他项目中。(代码的复用性) 3:当写一个新类的时候要考虑到他的可扩展性。(灵活性) 7.谈谈集合框架? 集合框架分为三部分,第一部分是collection接口,第二部分是Map接口、第三部分是collections帮助类 首先说一下collection接口,collection接口下面的接口分为set 接口、list接口,在往下面就是他们一些实现类。

JAVA基础面试题(经典)

基础知识部分: 1. JDK是什么?JRE是什么? a) 答:JDK:java开发工具包。JRE:java运行时环境。 2. 什么是java的平台无关性? a) 答:Java源文件被编译成字节码的形式,无论在什么系统环境下,只要有java虚拟机就能运行这个字节码文件。也就是一处编写,处处运行。这就是java的跨平台性。 3. 在一台电脑上配置java环境,path起什么作用?如何配置? a) 答:path的作用是在DOS环境下,能在任意位置使用JD K目录中bin文件夹中的可执行程序,来编译执行java程序。 b) 在环境变量中找到path变量,把bin文件夹的绝对路径加上即可。

4. 什么样的标识符是合法的? a) 由字母、数字、_和$组成,长度不限。其中字母可以是大写或小写的英文字母,数字为0到9。 b) 标识符的第一个字符不能是数字。 c) 标识符区分大小写。 d) 标识符不能包含空格。 5. Java有几种基本数据类型? a) byte,short,int,long,float,double,char,bool ean 6. 什么是隐式类型转换?什么是显示类型转换? a) 当将占位数少的类型赋值给占位数多的类型时,Java自动使用隐式类型转换。

b) 当把在级别高的变量的值赋给级别底变量时,必须使用显示类型转换运算。 7. &&和&区别,||和|区别? a) &&和||是短路与,短路或,当左边的表达式能判断当前结果,则不判断右边的表达式。 b) 而& 和|则将两边的表达式都运算完毕后,再算结果。 8. break,continue区别? a) break结束所有循环,continue结束当次循环,进入下次循环。 9. 类的命名规则是什么? a) 如果类名使用拉丁字母,那么名字的首写字母使用大写字母。

Java经典笔试题01

1. Given: 1. public class test ( 2. public static void main (String args[]) { 3. int i = 0xFFFFFFF1; //0001 4. int j = ~i;//1110,取反 5. 6. } 7. ) What is the decimal value of j at line 5? A. 0 B. 1 C. 14 D. -15 E. An error at line 3 causes compilation to fail. F. An error at line 4 causes compilation to fail. 2. Given: Integer i = new Integer (42); Long 1 = new Long (42); Double d = new Double (42.0); Which two expressions evaluate to True? (Choose Two) A. (i ==1) B. (i == d) C. (d == 1) D. (i.equals (d)) E. (d.equals (i)) F. (i.equals (42))

3. Click the exhibit button: 1. public class test ( 2. private static int j = 0; 3. 4. private static boolean methodB(int k) ( 5. j += k; 6. return true; 7. ) 8. 9. public static void methodA(int i) { 10. boolean b; 11. b = i < 10 | methodB (4);//非短路 12. b = i < 10 || methodB (8);//短路,后面不执行 13. ) 14. 15. public static void main (String args[] } ( 16. methodA (0); 17. system.out.printIn(j); 18. ) 19. ) What is the result? A. The program prints “0” B. The program prints “4” C. The program prints “8” D. The program prints “12” E. The code does not complete 4. Given: 1.Public class test ( 2. Public static void main (String args[]) ( 3. System.out.printIn (6 ^ 3); //0110 ^ 0011 = 0101 4. ) 5.) What is the output? 5 1.Which statement is correctly declare a variable a which is suitable for refering to an array of 50 string empty object? (长度为50的空数组引用) A. String [] a B. String a[]

【2020最新Java面试题资料】30个Java经典的集合面试题

1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的版本包含几种集合类:Vector Stack HashTable和Array。 随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,已经经历了很久。它还包括在并发包中,阻塞接口以及它们的实现。 集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类。 (2)随着使用经过严格测试的集合框架类,代码质量会得到提高。 (3)通过使用JDK附带的集合类,可以降低代码维护成本。 (4)复用性和可操作性。 2.集合框架中的泛型有什么优点? 1.Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。 2.泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。 3.这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。 4.泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符。 5.它也给运行时带来好处,因为不会产生类型检查的字节码指令。 3.Java集合框架的基础接口有哪些? Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。平台不提供这个接口任何直接的实现。 Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。 List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。 Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。

JAVA基础面试题(经典)

第一阶段题库 基础知识部分: 1.JDK是什么?JRE是什么? a)答:JDK:java开发工具包。JRE:java运行时环境。 2.什么是java的平台无关性? a)答:Java源文件被编译成字节码的形式,无论在什么系统环境下,只要有java虚 拟机就能运行这个字节码文件。也就是一处编写,处处运行。这就是java的跨平 台性。 3.在一台电脑上配置java环境,path起什么作用?如何配置? a)答:path的作用是在DOS环境下,能在任意位置使用JDK目录中bin文件夹中的 可执行程序,来编译执行java程序。 b)在环境变量中找到path变量,把bin文件夹的绝对路径加上即可。 4.什么样的标识符是合法的? a)由字母、数字、_和$组成,长度不限。其中字母可以是大写或小写的英文字母,数 字为0到9。 b)标识符的第一个字符不能是数字。 c)标识符区分大小写。 d)标识符不能包含空格。 5.Java有几种基本数据类型? a)byte,short,int,long,char,boolean,float,double 6.什么是隐式类型转换?什么是显示类型转换? a)当将占位数少的类型赋值给占位数多的类型时,Java自动使用隐式类型转换。 b)当把在级别高的变量的值赋给级别底变量时,必须使用显示类型转换运算。 7.&&和&区别,||和|区别? a)&&和||是短路与,短路或,当左边的表达式能判断当前结果,则不判断右边的表 达式。 b)而& 和|则将两边的表达式都运算完毕后,再算结果。 8.break,continue区别? a)break结束最近的一个循环,continue结束当次循环,进入下次循环。 9.类的命名规则是什么? a)如果类名使用拉丁字母,那么名字的首写字母使用大写字母。 b)类名最好见名得意,当类名由几个单词复合而成时,每个单词的首写字母使用大写。 10.类体的内容由两部分构成,哪两部分? a)一部分是变量的定义,用来刻画属性。 b)另一部分是方法的定义,用来刻画功能。 11.解释什么是类的成员变量,局部变量,实例成员变量,类成员变量? a)变量定义部分所定义的变量被称为类的成员变量。 b)在方法体中定义的变量和方法的参数被称为局部变量。 c)成员变量又分为实例成员变量和类成员变量(static修饰)。 12.简述this关键字用法。 a)this关键字使用在实例方法中,代表调用该方法的当前对象。 13.如何确定方法的返回类型?

经典java面试题

Java面试经典试题及答案 第一,谈谈final, finally, finalize的区别。 final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract 的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。 finally---在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize---方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //https://www.360docs.net/doc/e44566399.html,/articles/services/view.asp?id=704&page=1 注:静态内部类(Inner Class)意味着 1.创建一个static内部类的对象,不需要一个外部类对象。 2.不能从一个static内部类的一个对象访问一个外部类对象 第四,&和&&的区别。 &是位运算符。&&是布尔逻辑运算符。 第五,HashMap和Hashtable的区别。 都属于Map接口的类,实现了将惟一键映射到特定的值上。 HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 Ha shMap 慢,因为它是同步的。 第六,Collection 和 Collections的区别。 Collections是java.util下的类,它包含有各种有关集合操作的静态方法。 Collection是个java.util下的接口,它是各种集合结构的父接口。 第七,什么时候用assert? 断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为true。如果表达式计算为 false,那么系统会报告一个 Assertionerror。它用于调试目的: assert(a > 0); // throws an Assertionerror if a <= 0 断言可以有两种形式: assert Expression1 ; assert Expression1 : Expression2 ;

JAVA框架面试题汇总

JAVA框架面试题汇总

1.SpringMVC Framework的理解: 1、它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是java组件。而且和Spring提供的其它基础结构紧密集成 2、不依赖于Servlet API(目标虽是如此,可是在实现的时候确实是依赖于Servlet的) 3、能够任意使用各种视图技术,而不但仅局限于JSP 4、支持各种请求资源的映射策略 5、它应是易于扩展的 2.简单的谈一下SpringMVC的工作流程? 流程 1、用户发送请求至前端控制器DispatcherServlet 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 4、DispatcherServlet调用HandlerAdapter处理器适配器 5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。 6、Controller执行完成返回ModelAndView 7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet 8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器 9、ViewReslover解析后返回具体View

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。 11、DispatcherServlet响应用户 3.如何解决POST请求中文乱码问题,GET的又如何处理呢? 在web.xml中加入: . .CharacterEncodingFilter .org.springframework.web.filter.CharacterEncodingFilter . .encoding . utf-8 . . . .CharacterEncodingFilter ./* . 以上能够解决post请求乱码问题。对于get请求中文参数出现乱码解决方法 有两个: 修改tomcat配置文件添加编码与工程编码一致,如下: 另外一种方法对参数进行重新编码: String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8") ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码

Java经典面试题及答案

1、访问修饰符public,private,protected,以及不写(默认)时的区别? 答:区别如下: 作用域当前类同包子类其他 public √ √ √ √ protected √ √ √ × default √ √ × × private √ × × × 类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。 2、float f=3.4;是否正确? 答:不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型 转换float f =(float)3.4; 或者写成float f =3.4F;。 3、Java 有没有goto? 答:goto 是Java中的保留字,在目前版本的Java中没有使用。其中有goto 和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉 C 语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字) 4、&和&&的区别? 答:&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals(“”),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。 补充:如果你熟悉JavaScript,那你可能更能感受到短路运算的强大,想成为JavaScript的高手就先从玩转短路运算开始吧。 5、Math.round(11.5) 等于多少? Math.round(-11.5)等于多少? 答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。 6、用最有效率的方法计算2乘以8? 答:2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次

10道经典java编程笔试题

10道经典java编程笔试题 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少 //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.println("第1个月的兔子对数: 1"); System.out.println("第2个月的兔子对数: 1"); int f1 = 1, f2 = 1, f, M=24; for(int i=3; i<=M; i++) { f = f2; f2 = f1 + f2; f1 = f; System.out.println("第" + i +"个月的兔子对数: "+f2); } } } 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 public class lianxi02 { public static void main(String[] args) { int count = 0; for(int i=101; i<200; i+=2) { boolean b = false; for(int j=2; j<=Math.sqrt(i); j++) { if(i % j == 0) { b = false; break; } else { b = true; } } if(b == true) {count ++;System.out.println(i );} } System.out.println( "素数个数是: " + count);

常见的java面试笔试题大汇总

1. 抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String 是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean 和short。 https://www.360docs.net/doc/e44566399.html,ng.String 类是final 类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer 类 6、int 和Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int 是java 的原始数据类型,Integer 是java 为int 提供的封装类。Java 为每个原始类型提供了封装类。原始类型封装类boolean Boolean char Character byte Byte short Short int Integer long Long float Float double Double 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为null ,而原始类型实例变量的缺省值与它们的类型有关。 7、String 和StringBuffer 的区别 JAVA 平台提供了两个类:String 和StringBuffer ,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String 类提供了数值不可改变的字符串。而这个StringBuffer 类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer 。典型地,你可以使用StringBuffers 来动态构造字符数据。 8、运行时异常与一般异常有何异同?

相关文档
最新文档