首页 > 技术文章 > 面试问题总结

ztyc 2019-05-11 22:59 原文

一、数据库事务是什么,什么情况下使用事务,怎样的情况下产生死锁

 (1)数据库事务

 事务是并发控制的基本单位,所谓事务(单个逻辑工作单元执行的一系列操作(SQL语句)),它是一个操作序列,要么完全的执行,要么完全地不执行。

  (2)、什么情况下使用事务

  在银行金融领域,特别是涉及金钱的,这得使用事务,设计金额 方便 或对数据准确性要求特稿 并且是多表才需要事务

   (3)、什么情况下产生死锁

   事务A需要先查询数据1,然后修改数据2;

   事务B需要先查询数据2,然后修改数据1;

此时2个事务并发执行,由于mysql innodb的默认隔离级别是可重复读,读锁、写锁只能在事务结束才会释放。

事务A中需要等待事务B释放数据2的共享锁,才能执行对数据2添加排他锁;事务B需要等待事务A释放数据1的共享锁,才能执行对数据1添加排他锁。这样会就出现事务死锁

这种死锁在oracle中就不会出现,因为oracle的默认隔离级别是读已提交,共享锁在执行完查询之后就会释放,不会导致排他锁无法添加的问题。

二、MySql查询分页

select  *  from table limit 0,5;

三、二维数组排序

private static double [][] sortRows(double[][] nPrint) {//行排序
        for (int i = 0; i < nPrint.length; i++) {
            Arrays.sort(nPrint[i]);
        }
        return nPrint;
    }

private static double [][] sortColumn(double[][] nPrint) {//列排序
double [][] a = new double[3][3];
for (int i = 0; i < nPrint.length; i++) {
for (int j = 0; j < a.length; j++) {
a[i][j] = nPrint[j][i];
}
}
for (int j = 0; j < a.length; j++) {
Arrays.sort(a[j]);
}
for (int i = 0; i < nPrint.length; i++) {
for (int j = 0; j < a.length; j++) {
nPrint[i][j] = a[j][i];
}
}
return nPrint;

}

四、打印杨辉三角形

/采用一个二维数组打印杨辉三角
  2 class Yanghui1 {
  3   public static void main(String[] args)
  4   {
  5     //设置杨辉三角的行数
  6     int num = 10;
  7 
  8     //申请二维数组存放杨辉三角数值
  9     int[][] yangHui = new int [num][];
 10     for(int i = 0; i < yangHui.length; i ++)
 11       yangHui[i] = new int[i + 1];
 12 
 13     //利用杨辉三角的计算公式,初始化数组
 14     for(int i = 0; i < yangHui.length; i ++)
 15       for(int j = 0; j < yangHui[i].length; j ++)
 16       {
 17         //每一行第一个数和最后一个数都为1
 18         yangHui[i][0] = yangHui[i][i] = 1;
 19 
 20         if(i > 1 && j > 0 && j < i)
 21           //杨辉三角的值等于其上一层两个值之和
 22           yangHui[i][j] = yangHui[i - 1][j] + yangHui[i -1][j -1];
 23       }
 24 
 25     //遍历数组,以输出
 26     for(int i = 0; i < yangHui.length; i ++)
 27     {
 28       for(int j = 0; j < (num - i - 1) / 2; j ++)
 29         System.out.print("\t");
 30       for(int j = 0; j < yangHui[i].length; j ++)
 31         System.out.print(yangHui[i][j] + "\t");
 32 
 33       System.out.println();
 34     }
 35   }
 36 
 37 }
 38 
 39 //采用两个一维数组打印杨辉三角
 40 class YangHui2
 41 {
 42   public static void main(String[] args)
 43   {
 44     int num = 20;
 45 
 46     //申请UP数组用以存储上一层的数据
 47     int[] up = new int[num];
 48     for(int i = 0; i <= num; i ++)
 49     {
 50       //申请a数组用以存放本层的运算结果
 51       int[] a = new int[i];
 52       for(int j = 0; j < i; j ++)
 53       {
 54         //将本层第一个和最后一个数值赋值为1
 55         if(j == 0 || j == i)
 56           a[j] = up[j] = 1;
 57 
 58         //当从第三行起,非首尾数字的值等于上方两数只和
 59         if(i > 2 && j !=0 && j != i )
 60           a[j] = up[j - 1] + up[j];
 61       }
 62 
 63       //将本层的运算结果存到up数组中,以供一下次运算使用
 64       for(int k = 0; k < i; k ++)
 65         up[k] = a[k];
 66 
 67       //打印本层数字
 68       for(int k = 0; k < (num - i - 1) / 2; k ++)
 69         System.out.print("\t");
 70       for(int k = 0; k < i; k ++)
 71         System.out.print(a[k] + "\t");
 72 
 73       System.out.println();
 74     }
 75   }
 76 }
 77 
 78 //采用一个一维数组打印杨辉三角
 79 class YangHui3
 80 {
 81   public static void main(String[] args)
 82   {
 83     int num = 10;
 84     
 85     //申请数组存放杨辉三角的数值
 86     int yangHui[] = new int[(1 + num) * num / 2];
 87     for(int i = 0; i < num; i ++)
 88     {
 89       for(int j = 0; j < (num - i - 1) / 2; j ++)
 90         System.out.print("\t");
 91       
 92       //temp表示已经存储的数字个数
 93       int temp = (1 + i) * i / 2;
 94       for(int j = 0; j <= i; j ++)
 95       {
 96           //每一层的首尾数值为1
 97         if(j == 0 || j == i)
 98           yangHui[temp + j] = 1;
 99           
100         else        
101             //非首尾数值为上面两数之和
102           yangHui[temp + j] = yangHui[temp + j - i] + yangHui[temp + j - i - 1];
103           System.out.print(yangHui[temp + j] + "\t");
104       }
105     }
106     System.out.println();
107   }
108 }

  六、对于三百万数据量,怎样提高查询效率

             1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

             2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

             3、缓存,已查过的放内存,没查过的才查

             4、 并行,可以多线程/多进程甚至分布式

             5、分离读写,使用数据仓库,专门面对查询

七、输入年月日,求一年的第几天

    // 实例化Scanner
        Scanner scan = new Scanner(System.in);
        
        // 声明年份,月份,日期
        int year, month, day;

        // 提示用户输入年份
        System.out.println("请输入年份:");
        // 接受用户输入的年份
        year = scan.nextInt();

        // 提示用户输入月份
        System.out.println("请输入月份:");
        // 接受用户输入的月份
        month = scan.nextInt();

        // 提示用户输入日期
        System.out.println("请输入日期:");
        // 接受用户输入的日期
        day = scan.nextInt();

        // 判断月份(注意break位置)
        switch (month - 1) {
        case 11:
            // 日期加上11月的全天数
            day += 30;
        case 10:
            // 日期加上10月的全天数
            day += 31;
        case 9:
            // 日期加上9月的全天数
            day += 30;
        case 8:
            // 日期加上8月的全天数
            day += 31;
        case 7:
            // 日期加上7月的全天数
            day += 31;
        case 6:
            // 日期加上6月的全天数
            day += 30;
        case 5:
            // 日期加上5月的全天数
            day += 31;
        case 4:
            // 日期加上4月的全天数
            day += 30;
        case 3:
            // 日期加上3月的全天数
            day += 31;
        case 2:
            /*
             * 日期加上2月的全天数
             * 闰年判断
             */
            if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {//// 天数加29
                day += 29;
            } else {// 不是
                    // 天数加28
                day += 28;
            }
        case 1:
            //日期加上1月的全天数
            day += 31;
        default:
            // 错误提示
            System.out.println("请输入正确月份");
            break;
        }

        // 判断月份是否有误
        if(month >= 1 && month <= 12){
            // 打印判断结果
            System.out.println("今天是" + year + "年的第" + day + "天");
        }
原文:https://blog.csdn.net/qq_38652288/article/details/84553033 

 

推荐阅读