1、大写的Integer和String是可变类还是不可变类?怎么定义不可变类?
不可变.
用final关键字,如
public final class Integer extends Number
2、比较字符串中的compareTo() 方法是什么原理?
返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方。
如果参数字符串等于此字符串,则返回值 0;
如果此字符串小于字符串参数,则返回一个小于 0 的值;
如果此字符串大于字符串参数,则返回一个大于 0 的值。
3、如何查找字符串最后一次出现的位置?
strOrig.lastIndexOf(String name)
4、请一行代码将字符串反转。
String reverse = new StringBuffer(string).reverse().toString();
或
new StringBuilder(string).reverse().toString();
5、说一下实现字符串分割的3种以上的办法
1、使用split方法;
2、使用遍历组装数组;
3、使用StringTokenizer ,如:
String str = "a,b,c";
StringTokenizer st=new StringTokenizer(str,",");while(st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
6、如果设计一个两个字符串同长度一段区域的比较的函数,你会怎么设计方法的参数?
没有固定答案,仅考查基础逻辑。
public boolean regionMatches(boolean ignoreCase, inttoffset,
String other,int ooffset, intlen) {char ta[] =value;int to =toffset;char pa[] =other.value;int po =ooffset;//Note: toffset, ooffset, or len might be near -1>>>1.
if ((ooffset < 0) || (toffset < 0)|| (toffset > (long)value.length -len)|| (ooffset > (long)other.value.length -len)) {return false;
}while (len-- > 0) {char c1 = ta[to++];char c2 = pa[po++];if (c1 ==c2) {continue;
}if(ignoreCase) {//If characters don't match but case may be ignored,//try converting both characters to uppercase.//If the results match, then the comparison scan should//continue.
char u1 =Character.toUpperCase(c1);char u2 =Character.toUpperCase(c2);if (u1 ==u2) {continue;
}//Unfortunately, conversion to uppercase does not work properly//for the Georgian alphabet, which has strange rules about case//conversion. So we need to make one last check before//exiting.
if (Character.toLowerCase(u1) ==Character.toLowerCase(u2)) {continue;
}
}return false;
}return true;
}
6、为什么StringBuffer连接字符串在大量的修改情况下比用String的“+”要效率高?
老的不能再老的考题了。
String类对象不可改变的。字符串常量池可以将一些字符常量放在常量池中重复使用,避免每次都重新创建相同的对象、节省存储空间。但如果字符串是可变的,此时相同内容的String还指向常量池的同一个内存空间,当某个变量改变了该内存的值时,其他遍历的值也会发生改变。
String的“+”不断的新建对象(由不可变性决定了),而StringBuffer在一个对象上进行修改。
7、Collections类中的集合最小值函数min(Collection extends T> coll)内部实现原理是什么?
采用了泛型类实现Comparable接口,并且将集合通过迭代器iterator遍历得出最小值。
8、下面数组:int[] my_array = {1, 2, 5, 5, 6, 6, 7, 2, 9, 2};
请使用1次循环,找出重复的元素(即2、5、6)
分析,一般找重复元素需要2次循环,如下:
public static void findDupicateInArray2(int[] a) {int count=0;for(int j=0;j
count++;
}
}if(count==1)
System.out.println("重复元素 : " +a[j] );
count= 0;
}
}
实际上,因为数组的数量和最大值很小,所以可以用桶排序的思路来做1次循环,如下
public static void findDupicateInArray1(int[] a) {int max = 9;//本题中最大的元素是9
int[] bucket = new int[max + 1];for(int j=0;j
if(j>0 && bucket[a[j]]!=0)
System.out.println("重复元素 : " +a[j] );
bucket[a[j]]= a[j]; //将数值放入桶数组的下标
}
}
9、你来设计一个两个数组的并集函数,应该如何设计?
分析,应注意重复值的排除,使用set的特性。例子:
// 求两个字符串数组的并集,利用set的元素唯一性
public staticString[] union(String[] arr1, String[] arr2) {
Set set = new HashSet();for(String str : arr1) {
set.add(str);
}for(String str : arr2) {
set.add(str);
}
String[] result={ };returnset.toArray(result);
}
10、写一个斐波那契数列函数
分析,运用递归。
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368……
特别指出:第0项是0,第1项是第一个1。
这个数列从第三项开始,每一项都等于前两项之和。
public static long fibonacci(longnumber) {if ((number == 0) || (number == 1))returnnumber;else
return fibonacci(number - 1) + fibonacci(number - 2);
}
11、cron表达式“0 10 10 ? * 6L”是什么意思?
每月的最后一个星期五上午10:10触发,注意 第6位的星期几是从周日开始,1-7,1代表周日,2代表周一,6代表周五,7代表周六
。