• java面试题总结


    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

    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):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。

       

  • 相关阅读:
    Jsp 中文乱码,解决
    dojox.grid.EnhancedGrid 和 dojox.grid.DataGrid 的继承关系
    使用 Maven 部署 artifact 到 Nexus 教程
    [LeetCode] 187. Repeated DNA Sequences 解题思路
    [LeetCode] 204. Count Primes 解题思路
    [LeetCode] 219. Contains Duplicate II 解题思路
    [LeetCode] 310. Minimum Height Trees 解题思路
    [LeetCode] 200. Number of Islands 解题思路
    PHP7添加mysqli扩展
    MySQL中的锁(表锁、行锁)
  • 原文地址:https://www.cnblogs.com/sbj-dawn/p/7815178.html
Copyright © 2020-2023  润新知