1.String能被继承吗?为什么?

不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。平常我们定义的String str=”a”;其实和String str=new String(“a”)还是有差异的。
前者默认调用的是String.valueOf来返回String实例对象,至于调用哪个则取决于你的赋值,比如String num=1,调用的是
public static String valueOf(int i) {
return Integer.toString(i);
}
后者则是调用如下部分:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
最后我们的变量都存储在一个char数组中
private final char value[];


    2.String, Stringbuffer, StringBuilder 的区别。

    String 字符串常量(final修饰,不可被继承),String是常量,当创建之后即不能更改。(可以通过StringBuffer和StringBuilder创建String对象(常用的两个字符串操作类)。)
    StringBuffer 字符串变量(线程安全),其也是final类别的,不允许被继承,其中的绝大多数方法都进行了同步处理,包括常用的Append方法也做了同步处理(synchronized修饰)。其自jdk1.0起就已经出现。其toString方法会进行对象缓存,以减少元素复制开销。
    public synchronized String toString() {
    if (toStringCache == null) {
    toStringCache = Arrays.copyOfRange(value, 0, count);
    }
    return new String(toStringCache, true);
    }
    
    StringBuilder 字符串变量(非线程安全)其自jdk1.5起开始出现。与StringBuffer一样都继承和实现了同样的接口和类,方法除了没使用synch修饰以外基本一致,不同之处在于最后toString的时候,会直接返回一个新对象。
    public String toString() {
    // Create a copy, don’t share the array
    return new String(value, 0, count);
    }


      3.ArrayList 和 LinkedList 有什么区别。

      ArrayList和LinkedList都实现了List接口,有以下的不同点:
      1、ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
      2、相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
      3、LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。


        4.讲讲类的实例化顺序

        此题考察的是类加载器实例化时进行的操作步骤(加载–>连接->初始化)。
        父类静态代变量、
        父类静态代码块、
        子类静态变量、
        子类静态代码块、
        父类非静态变量(父类实例成员变量)、
        父类构造函数、
        子类非静态变量(子类实例成员变量)、
        子类构造函数。


          5.抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么

          1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
          2、抽象类要被子类继承,接口要被类实现。
          3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
          4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
          5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
          6、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
          7、抽象类里可以没有抽象方法
          8、如果一个类里有抽象方法,那么这个类只能是抽象类
          9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
          10、接口可继承接口,并可多继承接口,但类只能单根继承。


            6.请结合 OO 设计理念,谈谈访问修饰符 public、private、protected、default 在应用设计中的作用。

            Private √
            Default √ √
            Protected √ √ √
            Public √ √ √ √
            public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不
                 仅可以跨类访问,而且允许跨包(package)访问。
            private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以
                 及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
            protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、
                 属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
            default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访
                 问。


              7.在 jdk1.5 中,引入了泛型,泛型的存在是用来解决什么问题。

              泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率


                8.什么情况下会发生栈内存溢出。

                如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。