当前位置:文档之家› Java技术面试常见问题

Java技术面试常见问题

正文数据结构:用java代码实现链表?(代码)public class SortableLinkedList<E extends Comparable<E>> extends LinkedList<E> {public void addinOrder(E target){Predecessor<E> prev=this;ListNode<E> node =getNext();while((node!=null) && (node.getitem().compareTo(target)<0)){prev=node;node=node.getNext();}prev.setNext(new ListNode<E>(target,node));}/*链表排序*/public void insertSort(){SortableLinkedList<E> newList =new SortableLinkedList<E>();for(E e:this){newList.addinOrder(e);}setNext(newList.getNext());}public static void main(String [] args){SortableLinkedList<String> slist =new SortableLinkedList<String>();slist.add("3");slist.add("5");slist.add("2");slist.insertSort();System.out.println(slist);}}用java代码实现基本的二叉树?(代码)public class Tree{public Node root=new Node();//树的节点类private class Node{private Node left;private Node right;private Integer object;}public void add(Integer o){if(root.object==null){root.object=o;return;}Node node=root;while(node.object!=null){//小的在左边,大的在右边if(pareTo(node.object) <=0){if(node.left!=null){node=node.left;}else{node.left=new Node();node=node.left;}}else{if(node.right!=null){node=node.right;}else{node.right=new Node();node=node.right;}}}node.object=o;}}用java代码实现栈结构?(代码)public class StackX {private int maxSize; // 栈的队列大小private long[] stackArray;private int top = -1; //栈的顶部/*** 初始化* 根据参数规定的容量创建一个新栈,栈的域包括表示最大容量的变量 * 数组本身及变量top,它存储栈顶元素的下标*/public StackX(int s) {maxSize = s; //set array sizethis.stackArray = new long[maxSize]; //create array }/*** 入栈* 将top值增加一,使它指向原顶端数据项上面的一个位置* 并在一个位置存储一个数据项*/public void push(long j) {this.stackArray[++top] = j; //take item from top of stack }/*** 出栈* 返回top标识的数据项值,然后top减一* 其效果是从栈中移除一个数据项*/public long pop() {return this.stackArray[top--]; //access item, decrement top }/*** 返回位于栈top的值,但不做任何改动*/public long peek() {return this.stackArray[top];}/*** 判断是否空栈,栈空时top变量为-1*/public boolean isEmpty() {return this.top == -1;}/*** 判断栈是否以满,栈满时top变量为maxSize-1*/public boolean isFull() {return top == this.maxSize - 1;}}测试类public class StackApp {public static void main(String[] args) {//初始化栈,设置栈的队列大小StackX sx = new StackX(10);//入栈sx.push(100);sx.push(200);sx.push(300);sx.push(400);sx.push(500);//判断是否为空栈String temp;if(sx.isEmpty())temp = "空栈";elsetemp = "非空栈";System.out.println("sx栈为: " + temp);//打印顶栈System.out.println("top of stack: " + sx.peek());//循环输出栈值while(!sx.isEmpty()) {long value = sx.pop();System.out.println("出栈值为: " + value);}}}算法:各种排序的算法?(代码)冒泡排序:// 初始化变量int[] data = { 12, 8, 3, 59, 132, 1236, 3400, 8, 352, 37 };// 是否打印排序后结果// 循环整个数组for (int i = 0; i <data.length; i++) {// 循环每个数字for (int j = 0; j < data.length - 1; j++) {if (data[j] > data[j + 1]) {// 将两个数字的位置进行对调int temp = data[j];data[j] = data[j + 1];data[j + 1] = temp;}}for (int k = 0; k < data.length; k++)System.out.print(data[k] + " ");System.out.println();}插入排序:int[] data = new int[] { 12, 8, 3, 59, 132, 1236, 3400, 8, 352, 37 };int in, out;for (out = 1; out < data.length; out++) {int temp = data[out];in = out;while (in > 0 && data[in - 1] >= temp) {data[in] = data[in - 1];--in;}data[in] = temp;}选择排序:int[] data = new int[] { 12, 8, 3, 59, 132, 1236, 3400, 8, 352, 37 };int minValue;int indexMin;int temp;for (int i = 0; i < data.length; i++) {int lowIndex = i;for (int j = data.length - 1; j > i; j--) {if (data[j] < data[lowIndex]) {lowIndex = j;}}temp = data[i];data[i] = data[lowIndex];data[lowIndex] = temp;for (int k = 0; k < data.length; k++)System.out.print(data[k] + " ");System.out.println();}各种排序的优点和使用场合?冒泡排序:排序方法:相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其他的数进行类似操作。

优点–若数据已有部分排好序,则使用冒泡排序法可以很快的完成排序。

缺点–会造成反复扫描数据,比较相邻的两个数据,速度不快也没有效率。

插入排序:排序方法:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

优点:–最简单的排序缺点–比其他排序消耗时间多选择排序:排序方法:将一个记录插入到已排好序的有序表(有可能是空表)中, 从而得到一个新的记录数增1的有序表优点–利用一个一个的元素的插入比较,将元素放入适当的位置,也属于简单排序缺点–但是每次都与之前数据相比较,故耗费时间递归算法的使用和使用场合递归算法的使用递归过程一般通过函数或子过程来实现。

递归算法:在函数或子过程的内部,直接或者间接地调用自己的算法。

递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。

然后递归调用函数(或过程)来表示问题的解。

递归算法解决问题的特点:(1) 递归就是在过程或函数里调用自身。

(2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。

所以一般不提倡用递归算法设计程序。

(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。

递归次数过多容易造成栈溢出等。

所以一般不提倡用递归算法设计程序。

案例分析:●思考一下,13×4的答案是如何算出的呢,13×4是不是13连加四次呢?那我们如何得到13还要连加几次呢?何时停止呢?●分析:递归的实例步骤1:了解是否为适合用递归解题步骤2:决定递归的结束条件步骤3:决定递归执行部分public static int mul(int a, int b) {int result;if(b == 1) { //结束条件result = a;} else { //执行部分result = a + mul(a, b - 1);}return result;}模式:设计模式的分类?每种类型的作用?设计模式可以分为三大类,分别是创建型设计模式、行为型设计模式以及结构型设计模式。

相关主题