zoukankan      html  css  js  c++  java
  • 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代表周六 。

  • 相关阅读:
    js相关禁止
    单例模式 俗称单例3步曲+1曲
    轮廓线重建:二维平行轮廓线重建理论和方法
    一种面向三维地质剖面的形体表面重构算法
    在不使用gluSphere()的情况下在OpenGL中绘制Sphere
    Balabolka
    jQuery学习笔记之可见性过滤选择器
    Flask学习之四 数据库
    Flask学习之三 web表单
    Flask学习之二 模板
  • 原文地址:https://www.cnblogs.com/starcrm/p/10330933.html
Copyright © 2011-2022 走看看