java面试题总结

时间:2022-04-15 14:17:08

1.写出下面代码的打印结果:

 

public class Demo {
test te=new test();
static {
System.out.println("static test");
}
public Demo() {
System.out.println("Demo 构造函数");
}
public static void main(String[] args) {
new MyTest();
}


}
class test{
static {
System.out.println( "test 方法快");
}
public test() {
System.out.println("test gouzhaohans ");
}

public test(String str) {
System.out.println("class"+str);
}


}

class MyTest extends Demo{
test sr=new test("Mytest");

static {
System.out.println( "Mytest ");
}
public MyTest() {
System.out.println("Mytest 构造函数");
}
}

打印结果:

static test

Mytest

test 方法快

test gouzhaohans

Demo 构造函数

classMytest

Mytest 构造函数

 2.写出一个阶乘方法体(写出一个完整的方法体 3=3*2*1 2=2*1 1=1

java面试题总结java面试题总结
public class TestRecursive {  

public static void main(String[] arg) {
Scanner scanner
= new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(factorial(n));
}
/**
* 使用递归方法计算n的阶乘
*
*
@param n
*
@return
*/
private long factorial(int n) {
if (n == 0) {
System.out.println(n
+ "! = " + 1);
return 1;
}
else {
long num = n * factorial(n - 1);
System.out.println(n
+ "! = " + num);
return num;
}
}

/**
* 使用循环方式计算n的阶乘
*
*
@param n
*
@return
*/
private long test(int n) {
long num = 1;
for (int i = 1; i <= n; i++) {
num
*= i;
}
return num;
}
}
View Code

3.写出一个排序方法

package com.rimi.week3;

import java.util.Arrays;

public class ArraySort {

public static void main(String[] args) {
// TODO Auto-generated method stub
//int [] arr={5,2,3,1,7,8,3,2,2};
//System.out.println("arr 排序前 :"+Arrays.toString(arr));
//slectedSort(arr);
//bubSort( arr);
//insertSort(arr);
//insertSort2(arr);
//factorial(4);
//factorial2(4);
//System.out.println("arr 排序后 :"+Arrays.toString(arr));
//System.out.println(factorial(4));
int arr[]={3,1,5,2};
//merge(arr,0,2,arr.length-1);
System.out.println(Arrays.toString(arr));
split(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
/**
* 递归的拆分一个数组
* @param arr
* @param left
* @param right
*/
public static void split(int[] arr, int left, int right){
int mid = (right+left)/2;
if(left<right){
split(arr,left,mid);
split(arr,mid+1,right);
merge(arr,left,mid,right);

}
}



/**
* 把一个数组两边有序的元素,组合成一个有序数组。
* @param arr
* @param left
* @param mid
* @param right
*/
public static void merge(int []arr, int left, int mid, int right){
//int [] temp =new int [arr.length];
int [] temp =new int [right-left+1];
int low1= left;
int low2=mid+1;
int index= 0;
while (low1<=mid && low2<=right){
if(arr[low1]<arr[low2]){
temp[index++] =arr[low1++];

}else{
temp[index++] = arr[low2++];
}
}
while (low1<=mid){
temp[index++] = arr[low1++];
}
while(low2<=right){
temp[index++] =arr[low2++];
}
System.out.println("left = "+left);
System.out.println("arr = "+Arrays.toString(arr));
for (int i = 0; i < index; i++) {
arr[left++]=temp[i];
}
System.out.println("temp = "+Arrays.toString(temp));
System.out.println("arr = "+Arrays.toString(arr));
System.out.println("========================");
}





/*
* 递归算法 - 阶乘
* 实际的计算过程,是从最后一步开始计算;
*/



public static int factorial(int i){
while (i !=1){
System.out.println((i)+"x"+(i-1)+"!");
return factorial(i-1)*i;// 3!=3*2!
}
return 1;
}


//不是递归算法的阶乘

public static void factorial2(int i){
int result = 1;
for (int j = 1; j <=i; j++) {
result *=j;

}
System.out.println( result);
}



//while循环实现插入排序
public static void insertSort2(int [] arr){
for(int i=1;i<arr.length ;i++){
int j =i;//2,i=2,j=2
int temp= arr[i];
while(j>0 && temp<arr[j-1]){
arr[j]=arr[j-1];
j--;
}
arr[j] = temp;
}
}






//插入排序
public static void insertSort(int [] arr){
/*
* 因为第一个拿出来要做比较的数,前面必须要有数。所以说 i 从1 开始。
*/
for(int i=1;i<arr.length;i++){
int temp =arr[i]; //temp 临时数据
int index =0;
/*
* j 一定要从外循环取出到 temp 数的前一个开始,一直往前面遍历,如果一直找不到
* 比取出到temp 里面的数还小的数,就到 j==-1 的时候结束。
* 冯喆,到找到比temp 里面数还要小的数就结束。
*/
for(int j=i-1;j>=-1;j--){
index++;
System.out.println("arr 第"+i+"次外循环,第"+index+"次比较:"+Arrays.toString(arr));
if( j==-1){//如果找到最前面没有元素可找了,就把temp 放入最前面arr[0];
arr[0]= temp;
break;
}
if(temp <arr[j]){//如果找到的元素比 temp 大,就往后面移动一位。
arr[j+1]= arr[j];

}else{
arr[j+1]=temp;//如果找到的元素比 temp 小,就往该数后面放入temp。
break;
}


}
}


}




//冒泡排序
public static void bubSort( int[] arr){
for (int i=0;i<arr.length-1;i++){//控制比较次数, n-1 次 (n表示元素个数)
/**
* 控制相邻的两个元素进行比较,如果说后者小,就交换。
* 因为每次外循环完成之后,都会找到一个最大值,放在最后面。
* 所以说 j 能取到的最大值,应该依次减小。(j< arr.length-1-i)
*/

for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]= temp;
}
System.out.println("arr 第"+(i+1)+"次外循环,第"+(j+1)+"比较后"+Arrays.toString(arr));
}
}

}


//选择排序
public static void slectedSort(int[] arr){

for(int i=0; i<arr.length-1;i++){//控制遍历次数
int minIndex = i;
for (int j=i+1;j<arr.length;j++){//控制比较,找到最小值
if( arr[minIndex]>arr[j]){
minIndex = j;//找到后面的元素,比最前面的元素还要小,就记录其下标
}
System.out.println("minIndex = "+minIndex);
}
if(minIndex != i){//最小值下标改变过才交换
int temp = arr[i];
arr[i] =arr[minIndex];
arr[minIndex] = temp;
}
System.out.println("arr 第 "+(i+1)+"次排序后"+Arrays.toString(arr));
}

 

4.个SQL语句;字段有评论详情,被评论人分别在User表和content表中(效果如下)

张三:

 你好,很高兴认识你

解答:在content表中增加一个字段与user表中进行关联。然后使用内连接(inner join) 后面跟上user.id=增加字段.id

二。面试题

1.servlet和p的区别?

Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。

JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。

【1】JSP第一次运行的时候会编译成Servlet,驻留在内存中以供调用。

【2】JSP是web开发技术,Servlet是服务器端运用的小程序,我们访问一个JSP页面时,服务器会将这个JSP页面转变成Servlet小程序运行得到结果后,反馈给用户端的浏览器。

【3】Servlet相当于一个控制层再去调用相应的JavaBean处理数据,最后把结果返回给JSP。

【4】一般在多层应用中, JSP主要用作表现层,而Servlet则用作控制层,因为在JSP中放太多的代码不利于维护,而把这留给Servlet来实现,而大量的重复代码写在 JavaBean中

总结:jsp中可写java和HTML,jsp是servlet的升级。当第一次编译后jsp文件会转变为servlet文件,jsp主要用做视图。servlet主要做逻辑处理。

2.原生jsajaxjquery ajax的区别

面试官解答:jQuery中ajax的兼容性更好;js原生的ajax在不同的浏览器中可能不会响应。

3.Redis中有50条数据,现在要插入条数据在不用全部清空Redis的情况下怎么处理;

待解答:

4.MySQL的优化?

1. 为查询缓存优化你的查询

2.字段建索引

3.避免 SELECT *

4.远为每张表设置一个ID

5.用 ENUM 而不是 VARCHAR

6.可能的使用 NOT NULL

7固定长度的表会更快

8 拆分大的 DELETE 或 INSERT 语句

9 设计合适的索引,基于主键的查找,上亿数据也是很快的;
10反范式化设计,以空间换时间,避免join,有些join操作可以在用代码实现,没必要用数据库来实现;
11buffer,尽量让内存大于数据.

参考资料:https://www.zhihu.com/question/19719997

参考资料二:http://database.51cto.com/art/201505/476659.htm

5.Mysql的三范式

 第一范式:确保每列的原子性.
第二范式:在第一范式的基础上更进一层,目标是确保表中的每列都和主键相关.
第三范式:在第二范式的基础上更进一层,目标是确保每列都和主键列直接相关,而不是间接相关.

解释: 
1NF:原子性 字段不可再分,否则就不是关系数据库; 
2NF:唯一性 一个表只说明一个事物; 
3NF:每列都与主键有直接关系,不存在传递依赖; 

6.中间件

 activeMQ、

7.Faremark静态页面处理

Freemarker 是一款模板引擎,是一种基于模版生成静态文件的通用 工具,它是为java程序员提供的一个开发包,或者说是一个类库,它不是面向最终用户的,而是为程序员提供了一款可以嵌入他们开发产品的应用程序。

  Freemarker 是使用纯java编写的,为了提高页面的访问速度,需要把页面静态化, 那么Freemarker就是被用来生成html页面

参考资料:http://blog.csdn.net/chenghui0317/article/details/7832474

8.简述下你对NGINX的了解(集群;程序在高并发的情况下怎么处理)

Nginx (engine x) 是一个高性能的HTTP反向代理服务器,也是一个IMAP/POP3/SMTP服务器

其特点是占有内存少,并发能力强,能够支持高达 50,000 个并发连接数的响应(实际只有2万);

9.E-R图模型的组成是由实体,属性和联系。

10.mysql事物的四大特性?

1.原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

2.一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态。

3.隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。

4.持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。