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);
}

11、cron表达式“0 10 10 ? * 6L”是什么意思?
每月的最后一个星期五上午10:10触发,注意 第6位的星期几是从周日开始,1-7,1代表周日,2代表周一,6代表周五,7代表周六 。

原文地址:https://www.cnblogs.com/starcrm/p/10330933.html