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) {
}
}
实现代码:
- 蛮力法.时间复杂度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);
}
}