JAVA面试题-数组字符串基础
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, int toffset,
String other, int ooffset, int len) {
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<a.length;j++) {
for(int k =j+1;k<a.length;k++) {
if(a[j]==a[k]) {
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<a.length;j++) {
//如果对应位上有值,则代表有重复值
if(j>0 && bucket[a[j]]!=0)
System.out.println( "重复元素 : " + a[j] );
bucket[a[j]]= a[j]; //将数值放入桶数组的下标
}
}
9、你来设计一个两个数组的并集函数,应该如何设计?
分析,应注意重复值的排除,使用set的特性。例子:
// 求两个字符串数组的并集,利用set的元素唯一性
public static String[] union(String[] arr1, String[] arr2) {
Set<String> set = new HashSet<String>();
for (String str : arr1) {
set.add(str);
}
for (String str : arr2) {
set.add(str);
}
String[] result = { };
return set.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(long number) {
if ((number == 0) || (number == 1))
return number;
else
return fibonacci(number - 1) + fibonacci(number - 2);
}