JAVA基础面试题 三

用最有效率的方法计算2乘以8?

  • 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。
public static void main(String[] args) {
    int a = 2;
    int b = 32;
    System.out.println("2 * 8 " + (a << 3));
    System.out.println("32 / 8" + (b >> 3));
}

----结果输出---

2 * 8 :16
32 / 8:4
Process finished with exit code 0

数组有没有length()方法?String有没有length()方法?

  • 数组没有length()方法,有length 的属性
  • String 有length()方法
  • JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。
public class UserTest {
    public static void main(String[] args) {
        String[] strings = new String[3];
        System.out.println(strings.length);
        System.out.println("123".length());
    }

-------JavaScript 写法如下----

$(function () {
    var str = new String("123");
    var arr = new Array(5);
    console.log("str.length"+str.length);
    console.log("arr.length"+arr.length);

在Java中,如何跳出当前的多重嵌套循环?

设置循环条件

public static void main(String[] args) {
    /**循环标识*/
    boolean flag = true;
    for (int i = 0; i < 10 && flag; i++) {
        for (int j = 0; j < 10; j++) {
            System.out.print(i + "" + j + " ");
            /**i=2j=2时退出循环*/
            if (i == 2 && j == 2) {
                flag = false;
                break;
            }
        }
    }
}

--------结果输出---

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 

Process finished with exit code 0

break + lable

public static void main(String[] args) {
    /**循环外边设置标记"out:",记得带冒号*/
    out:for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            System.out.print(i + "" + j +" ");
            /**i=2j=3时跳出到循环外面的"out"
             * 跳出了就不会再进来*/
            if (i == 2 && j == 3) {
                break out;
            }
        }
    }
}

-------结果输出-----------

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 

Process finished with exit code 0

封装成方法

public static void main(String[] args) {
    forEach();
}
public static void forEach() {
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            System.out.print(i + "" + j + " ");
            /**i=2j=4时直接方法返回,从而达到退出循环的目的*/
            if (i == 2 && j == 4) {
                return;
            }
        }
    }
}

---------结果输出---------

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
Process finished with exit code 0

构造器(constructor)是否可被重写(override)?

  • 构造器不能被继承,因此不能被重写,但可以被重载。
  • 构造器的方法名是必须与类名一致的

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

  • 不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。
  • Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。
public static void main(String[] args) {
    String str1 = new String("张无忌");
    String str2 = "张无忌";
    System.out.println("str1.equals(str2):"+str1.equals(str2));
    System.out.println("str1.hashCode():"+str1.hashCode());
    System.out.println("str2.hashCode():"+str2.hashCode());
}

----输出结果---

str1.equals(str2):true
str1.hashCode():24235276
str2.hashCode():24235276
Process finished with exit code 0

是否可以继承String类?

  • String 类是final类,不可以被继承。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

  • 是值传递。Java语言的方法调用只支持参数的值传递。
  • 当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。

String和StringBuilder、StringBuffer的区别?

  • Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。
  • String是只读字符串,String引用的字符串内容是不能被改变的
  • StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。
  • StringBuilder是Java 5中引入的,它和StringBuffer的方法基本相同,区别在于它是在单线程环境下使用的,因为它的所有方法都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

String

  • String只适合固定不变的字符串,如果需要动态修改值的不建议使用String。

public static void main(String[] args) {
    String str1 = new String("张无忌");
    Long startTime = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        str1 += i;
    }
    Long endTime = System.currentTimeMillis();
    System.out.println((endTime - startTime)+"毫秒");
}

------输出结果-----这样做效率是最低的-------要避免使用----

14855毫秒

Process finished with exit code 0

StringBuffer

  • 同样的操作,StringBuffer将String的15秒缩短到了13毫米
  • StringBuffer所有的方法采用了synchronized修饰,加了对象锁,更适合多线程操作

public static void main(String[] args) {
    StringBuffer str1 = new StringBuffer("张无忌");
    Long startTime = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        str1.append(i);
    }
    Long endTime = System.currentTimeMillis();
    System.out.println((endTime - startTime)+"毫秒");
}

------输出结果----------推荐方式一--------

13毫秒
Process finished with exit code 0

StringBuilder

  • StringBuilder与StringBuffer基本一致,只是StringBuilder的方法没有用synchronized修饰,效率更高

public static void main(String[] args) {
    StringBuilder str1 = new StringBuilder("张无忌");
    Long startTime = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        str1.append(i);
    }
    Long endTime = System.currentTimeMillis();
    System.out.println((endTime - startTime)+"毫秒");
}

------输出结果-----推荐方式-------------

12毫秒

Process finished with exit code 0

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

Overloading 

  • 同一个类中,同名的方法如果参数列表各不相同(个数、类型、顺序不同)被视为重载
  • 不能通过访问权限synchronized、返回值类型、抛出异常等进行重载
  • 构造器就是典型的重载

public void show(){
    System.out.println("show()");
}

public void show(String show){
    System.out.println(show);
}
public String show(Integer showId){
    return String.valueOf(showId);
}

Overriding

  • 子类继承父类,对父类方法的重新编写叫方法重写
  • 重写方法的方法名与参数列表(参数类型、个数、顺序)以及返回值类型都应该与父类相同
  • 子类的重写方法不能抛出比父类更多的异常,只能抛出相同或是更少的异常,或者抛出父类异常的子异常(因为子类的方法重写是用来解决父类中的问题的,而不是增加问题)
  • 子类重写方法的访问权限只能与父类的相同或者更大,不能缩小(必须遵循访问更加友好的原则)
  • 父类中private修饰的方法,子类不能继承,所以更加无法重写
  • 父类final修饰的方法,子类可以继承,却不能重写

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/80603813