java面试(二十一)--(1)请问在什么情况下会使用assert?(2)请说明一下MyBatis中命名空间(namespace)的作用是什么?(3)数组中的逆序对

1.请问在什么情况下会使用assert?

assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制.在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出.一般来说,assertion用于保证程序最基本、关键的正确性.assertion检查通常在开发和测试时开启.为了提高性能,在软件发布后,assertion检查通常是关闭的.
断言可以有两种形式:
(1)assert Expression1;
(2)assert Expression1 : Expression2 ;
(1)Expression1 应该总是产生一个布尔值。
(2)当Expression1为true的时候后面Expression2被忽略,如果false的话,后面的表达式的结果会被计算出来并作为AssertionError得构造器参数

要在运行时启用断言,可以在启动JVM时使用-enableassertions或者-ea标记。要在运行时选择禁用断言,可以在启动JVM时使用-da或者-disableassertions标记。要在系统类中启用或禁用断言,可使用-esa或-dsa标记。还可以在包的基础上启用或者禁用断言。
注意:断言不应该以任何方式改变程序的状态。简单的说,如果希望在不满足某些条件时阻止代码的执行,就可以考虑用断言来阻止它。

2.请说明一下MyBatis中命名空间(namespace)的作用是什么?

在大型项目中,可能存在大量的SQL语句,这时候为每个SQL语句起一个唯一的标识(ID)就变得并不容易了。为了解决这个问题,在MyBatis中,可以为每个映射文件起一个唯一的命名空间,这样定义在这个映射文件中的每个SQL语句就成了定义在这个命名空间中的一个ID。只要我们能够保证每个命名空间中这个ID是唯一的,即使在不同映射文件中的语句ID相同,也不会再产生冲突了。

3.数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。
示例代码:

public class TestInverseArray {
    public int InversePairs(int [] array) {
        
    }
}

实现代码:

  1. 蛮力法.时间复杂度O(n^2)
 public class TestInverseArray {
    //1.蛮力法
    public int InversePairs(int [] array) {
        //记录总个数
        int length=0;
        for(int i=0;i<array.length-1;i++){
            for(int j=i+1;j<array.length;j++){
                if(array[i]>array[j]){
                    length++;
                }
            }
        }
        return length;
    }
}

2.归并排序 时间复杂度O(nlogn)

 public class TestInverseArray {
    static int count=0;

    public void InversePairs(int[] a) {
        int[] p = new int[a.length];
        InversePairs(a, 0, a.length - 1, p);
    }

    static void InversePairs(int a[], int first, int last, int temp[]) {
        if (first < last) {
            int mid = (first + last) / 2;
            InversePairs(a, first, mid, temp); // 左边有序
            InversePairs(a, mid + 1, last, temp); // 右边有序
            InversePairs(a, first, mid, last, temp); // 再将二个有序数列合并
        }
    }

    static void InversePairs(int a[], int first, int mid, int last, int temp[]) {
        int i = first, j = mid + 1;
        int m = mid, n = last;
        int k = 0;
        while (i <= m && j <= n) {
            if (a[i] > a[j]) {
                // 左数组比右数组大
                temp[k++] = a[j++];
                // 因为如果a[i]此时比右数组的当前元素a[j]大,
                // 那么左数组中a[i]后面的元素就都比a[j]大
                // 【因为数组此时是有序数组】
                count += mid - i + 1;
            } else {
                temp[k++] = a[i++];
            }
        }
        while (i <= m) {
            temp[k++] = a[i++];
        }
        while (j <= n) {
            temp[k++] = a[j++];
        }
        for (i = 0; i < k; i++)
            a[first + i] = temp[i];
        System.out.println(count);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值