美文网首页学习
Java SE,我的噩梦,你呢?

Java SE,我的噩梦,你呢?

作者: TAIKEMAN | 来源:发表于2019-06-12 20:24 被阅读5次

Java SE 是Java平台标准版的简称(Java Platform, Standard Edition) (also known as Java 2 Platform) ,用于开发和部署桌面、服务器以及嵌入设备和实时环境中的Java应用程序。Java SE包括用于开发Java Web服务的类库,同时,Java SE为Java EE和Java ME提供了基础。

图片来源:百度

1、面向对象的特征有哪些方面?

  • 封装

    • 最常见的是把属性私有化封装在一个类里面,只能通过方法去访问。
  • 继承

    • 子类继承父类,从而继承了父类的方法和属性。
  • 抽象

    • 比如一个英雄类,抽象出了name,hp这些属性,使得开发过程中更加易于理解。
  • 多态

    • 多态分操作符的多态和类的多态。类的多态指父类引用指向子类对象,并且有继承,有重写。

2、String是基本数据类型吗?

  • String是类类型,不是基本数据类型。

  • 基本数据类型有八种:

    • 整型(btye、short、int、long)
    • 字符型(char)
    • 浮点型(float、double)
    • 布尔型(boolean)

3、int和Integer有什么区别?

  • int是基本数据类型,4个字节,32位长度的整数。

  • Integer是类类型,是int的封装类。

  • int和Integer之间可以通过自动装箱/自动拆箱的方式互相转换。

4、String和StringBuffer的区别?

  • String是immutable(不可变)的,其内容一旦创建好之后,就不可以发生改变。

  • StringBuffer 是可以变长的,内容也可以发生改变。

    • 改变的原理是StringBuffer内部采用了字符数组存放数据,在需要增加长度的时候,创建新的数组,并且把原来的数据复制到新的数组这样的办法来实现。

5、运行时异常与一般异常有何异同?

  • 运行时异常又叫做非可查异常,在编译过程中,不要求必须进行显示捕捉。

  • 一般异常又叫做可查异常,在编译过程中,必须进行处理,要么捕捉,要么通过throws抛出去。

6、说说ArrayList、Vector、LinkedList的存储性能和特性?

  • ArrayList和Vector

    • 两者都继承了抽象类AbstractList,但是Vector是线程安全的,而ArrayList是非线程安全的。
  • ArrayList和LinkedList

    • ArrayList 是数组结构,所以定位很快,但是插入和删除很慢;LinkedList 是双向链表结构,所以插入和删除很快,但是定位很慢。

7、Collection和Collections的区别?

  • Collection是接口,是List和Set的父接口。

  • Collections是工具类,提供了排序,混淆等很多实用方法。

8、&和&&的区别?

  • &有两个作用,分别是位与和逻辑与。

  • && 就是逻辑与。

  • 作为逻辑与,&和&&分别表示长路与和短路与。长路与两侧,都会被运算;短路与只要第一个是false,第二个就不进行运算了。

9、HashMap和Hashtable的区别?

  • HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式。

    • 区别1:

      • HashMap可以存放 null;Hashtable不能存放null。
    • 区别2:

      • HashMap不是线程安全的类;Hashtable是线程安全的类。

10、final、finally、finalize的区别?

  • final

    • final修饰类,方法,基本类型变量,引用的时候分别有不同的意思:

      • 修饰类:表示该类不能被继承。

      • 修饰方法:表示该方法不能被重写。

      • 修饰基本数据类型变量:表示该变量只能被赋值一次。

      • 修饰引用:表示该引用只有一次指向对象的机会。

  • finally

    • finally是用于异常处理的场面,无论是否有异常抛出,都会执行。
  • finalize

    • finalize是Object的方法,所有类都继承了该方法。

    • 当一个对象满足垃圾回收的条件,并且被回收的时候,其finalize()方法就会被调用。

11、Overload和Override的区别,以及Overload的方法是否可以改变返回值的类型?

  • 区别:

    • Overload:方法重载。在同一个类里面,方法名一样,但是参数不一样。

    • Override:方法重写。子类继承了父类的某个方法后,重新又写了一遍。

  • 可以改变返回值的类型。重载本质就是完全不同的方法,只是恰好取了相同的名字。

12、Error和Exception有什么区别?

  • Error和Exception都实现了Throwable接口。

  • Error:是JVM层面的错误,比如:内存不足OutOfMemoryError。

  • Exception:是代码逻辑的异常,比如:下标越界OutOfIndexException。

13、抽象类和接口的区别?

  • 使用方式:

    • 抽象类只能够通过继承被使用。

    • 接口必须通过实现被使用。

  • 实现方法:

    • 抽象类不仅可以提供抽象方法,也可以提供实现方法。

    • 接口只能提供抽象方法,不能提供实现方法。

    • 在 Java 8 版本开始,接口可以提供实现方法了,前提是要在方法前加一个default修饰符。

14、堆和栈的区别?

  • 存放内容不一样:

    • 堆:存放对象。

    • 栈:存放基本数据类型变量、引用(对象地址)、方法调用。

  • 存取方式不一样:

    • 堆:自动增加大小,不需要指定大小,存取相对较慢。

    • 栈:固定大小,并且是FILO,先入后出的顺序,存取速度比较快。

15、GC是什么? GC的意义?

  • GC是Garbage Collection的缩写,即垃圾回收。

  • 这里所谓的垃圾,指的是那些不再被使用的对象,JVM的垃圾回收机制使得开发人员从无聊、容易犯错的手动释放内存资源的过程中解放出来。

  • 开发人员可以更加专注的进行业务功能的开发,而资源回收的工作交由更加专业的垃圾回收机制自动完成。

16、short s1 = 1; s1 = s1 + 1; 有什么错?

  • short s1 = 1; 这一句没有错误,编译器会自动把1这个整数处理为short。

  • s1 = s1 + 1; 右侧的表达式会返回一个int类型的整数,再把这个int类型的整数赋给short类型的s1的时候,就会出现强制转换错误。

17、Math.round(11.5)等于多少? Math.round(-11.5)等于多少?

  • Math.round()的意思是+0.5取整数。

  • 所以 Math.round(11.5) = 11.5 + 0.5 = 12;Math.round(-11.5) = -11.5 + 0.5 = -11。

18、String s = new String("xyz"); 创建了几个字符串对象?

  • 首先,构造方法new String("xyz"); 中的"xyz"这本身就是一个字符串对象。

  • 然后,new关键字一定会创建一个对象。

  • 所以,总共创建了两个字符串对象。

19、Java有没有goto?

  • 有。goto是关键字,但是,是保留字,并不具备功能性。

20、接口是否可继承接口? 抽象类是否可实现接口? 抽象类是否可继承实体类?

  • 可以,比如:List就继承了接口Collection。

  • 可以,比如:MouseAdapter鼠标监听适配器是一个抽象类,并且实现了MouseListener接口。

  • 可以,所有抽象类,都继承了Object。

21、List、Set、Map是否继承自Collection接口?

  • List和Set继承了Collection接口。

  • Map和Collection之间没有继承关系。因为一个是键值对容器,一个是单值容器,无法兼容。

[图片上传失败...(image-71b3a1-1563364645789)]

22、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?

  • 都不能。

  • 抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。

  • 本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。

  • synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。

23、数组有没有length()这个方法? 字符串有没有length()这个方法?

  • 数组获取长度的手段是:.length属性。

  • 字符串获取长度的手段是:.length()方法。

  • 集合获取长度的手段是:.size()方法。

  • 文件获取长度的手段是:.length()方法。

24、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?

  • 以HashSet为例,判断重复的逻辑是:

    • 首先看hashCode()是否相同,如果不同,就是不重复的。

    • 如果hashCode()一样,再比较equals(),如果不同,就是不重复的,否则就是重复的。

25、构造器是否可被override?是否可以继承String类?

  • 子类不能继承父类的构造方法,所以就不存在重写父类的构造方法。

  • super()表示子类调用父类的构造方法,这不能被叫做继承父类的构造方法。

  • String是final修饰的,所以不能够被继承。

26、switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?

  • switch可以作用在byte、short、int、String、Enum(枚举)上,但是不能作用在long上面。

  • switch作用在String上从JDK 1.7开始支持,实质是编译时将字符串替换为了其对应的hash值。

27、try {} 里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

  • try里的return和finally里的return都会执行,但是当前方法只会采纳finally中return的值。

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

  • 不对。虽然hashCode()方法和equals()方法都可以通过自定义类重写,是可以做到equals相同,但hashCode不同的。然而,在Object类的equals()方法中有这么一段话:
* Note that it is generally necessary to override the {@code hashCode}
* method whenever this method is overridden, so as to maintain the
* general contract for the {@code hashCode} method, which states
* that equal objects must have equal hash codes.
  • 翻译如下:
通常来讲,在重写这个方法的时候,也需要对hashCode方法进行重写,以此来保证这两个方法的一致性,当equals返回true的时候,这两个对象一定有相同的hashCode。

[图片上传失败...(image-c2603-1563364645789)]

29、垃圾回收的优点和原理?并考虑2种回收机制?

  • 优点:

    • 与C语言开发人员需要手动进行内存资源的释放不同,Java提供垃圾回收机制,自动进行GC,将开发人员从容易犯错的内存资源管理中解放出来。
  • 原理:

    • 当某个一个对象,没有任何引用指向它的时候,那么它就满足垃圾回收的条件,在适当的时候,JVM虚拟机进行GC将其回收,释放空间,以供后续再利用。
  • 两种常见的回收机制:

    • 定时回收

      • 每隔30分钟进行一次回收,这种机制的弊端是如果垃圾产生的比较快,有可能30分钟之内垃圾已经把内存占用光了,导致性能变慢。
    • 当垃圾占到某个百分比的时候,进行回收

      • 比如,当垃圾占到70%的时候,进行回收。

      • 这种机制的弊端是,如果垃圾产生的频率很快,那么JVM就必须高频率的进行垃圾回收。

      • 而在垃圾回收的过程中,JVM会停顿下来,只做垃圾回收,而影响业务功能的正常运行。

  • 一般说来,JVM会采用两种机制结合的方式进行垃圾回收。

30、你所知道的集合类都有哪些?主要方法?

  • 常见的集合

    • ArrayList、LinkedList、HashSet、HashMap、TreeSet......
  • 常见方法:

    • size()、add()、remove()......

31、char型变量中能不能存贮一个中文汉字?

  • char是16位的,占两个字节。

  • 汉字通常使用GBK或者UNICODE编码,也是使用两个字节,所以可以存放汉字。

32、解析XML文档有哪几种方式?

  • 主要是两种:SAX和DOM。

    • SAX就是逐行读取,直到找到目标数据为止。

    • DOM是先全文档加载,然后读取。

33、关键字:throws、throw、try、catch、finally分别代表什么意义?

  • throws:用在方法声明上面,表示该方法有可能抛出某个异常。

  • throw:抛出一个指定的异常。

  • try catch:在try中有可能会抛出某个异常,一旦某个异常抛出后,就会在catch中进行捕捉,他俩一般说来都是成对出现的。

  • finally:表示无论是否捕捉住异常,都会执行。

34、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

  • 可以包括多个类,但是只能出现一个public修饰的类,但是可以出现多个非public修饰的类。

35、java中有几种类型的流?

  • Java中所有的流都是基于字节流,所以最基本的流是:

    • 输入输出字节流

      • InputStream

      • OutputStream

    • 在字节流的基础上,封装了字符流

      • Reader

      • Writer

    • 进一步,又封装了缓存流

      • BufferedReader

      • PrintWriter

    • 以及数据流

      • DataInputStream

      • DataOutputStream

    • 对象流

      • ObjectInputStream

      • ObjectOutputStream

36、java中会存在内存泄漏吗?

  • 因为Java是自动进行垃圾回收管理的,所以不存在C语言中同等概念的内存泄漏。

  • 但是,存在Java特色的内存泄漏。

  • 当某些对象不被使用,但是又有非直接引用指向的时候,那么就不满足垃圾回收的条件,而形成内存泄漏。

  • 比如:代码中的例子,每个Object创建的时候,有一个引用o指向,接着就被放进了集合al中。下一个Object创建的时候,上一个Object就没有引用指向了。这些Object都没有引用指向,但是却放在ArrayList中,而这个Arraylist忘记了回收,那么里面的所有对象,都会一直存活下去,虽然不再被使用了。

package j2se;
import java.util.ArrayList;

public class MemoryLeak {
     static ArrayList<Object> al = new ArrayList<Object>();
     public static void main(String[] args) {
         for (int i = 0; i < 100; i++) {
             Object o = new Object();
            al.add(o);
         }
    }
}

37、java中实现多态的机制是什么?

  • 类的多态的条件:

    • 父类(接口)引用指向子类对象。

    • 方法有重写。

38、静态变量和实例变量的区别?

  • 静态变量:直接通过类就可以访问,无需实例。

  • 实例变量:通过类的某个具体实例,才可以访问。

39、什么是java序列化,如何实现java序列化?

  • 序列化:指的是把一个Java对象,通过某种介质进行传输,比如Socket输入输出流,或者保存在一个文件里。

  • 实现java序列化的手段是让该类实现接口Serializable,这个接口是一个标识性接口,没有任何方法,仅用于表示该类可以序列化。

40、是否可以从一个static方法内部发出对非static方法的调用?

  • 不行。

  • 因为非static方法需要一个具体的实例才可以调用,而调用 static方法的时候,不一定存在一个实例。

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

  • 在外部循环的前一行,加上标签;

  • 在break的时候使用该标签。

public class HelloWorld {
    public static void main(String[] args) {   
        //打印单数    
        outloop: //outloop这个标示是可以自定义的,比如:outloop1,ol2,out5......
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                System.out.println(i+":"+j);
                if(0==j%2) 
                    break outloop; //如果是双数,结束外部循环
            }    
        }       
    }
}

42、List、Map、Set三个接口,存取元素时,各有什么特点?

  • List:是有顺序的,并且可以重复。

  • Set:是无序的,不可以重复。

  • Map:保存数据的方式是键值对。

43、匿名内部类是否可以继承其它类,是否可以实现接口?

  • 匿名内部类本质上就是在继承其他类,实现其他接口。

  • 如:

    • 匿名类1,就是继承了Thread;

    • 匿名类2 ,就是实现了Runnable接口。

package j2se;
 
public class HelloWorld { 
     public static void main(String[] args) {
  
         // 匿名类1
         new Thread() {
            public void run() {
               
            }
         };
  
         // 匿名类2
         new Runnable() {
             public void run() {
  
            }
        };
     }
}

44、内部类可以引用外部类的成员吗?有没有什么限制?

  • 可以。

  • 如果是非静态内部类,可以使用外部类的所有成员;如果是静态内部类,只能使用外部类的静态成员。

45、多线程有几种实现方法,都是什么?

  • Java创建一个线程有三种方式:

    • 继承一个Thread类

    • 实现Runnable接口

    • 匿名内部类

46、sleep()和wait()的区别?

  • 首先,sleep()和wait()之间没有任何关系:

    • sleep():是Thread类的方法,指的是当前线程暂停。

    • wait():是Object类的方法,指的占用当前对象的线程临时释放对当前对象的占用,以使得其他线程有机会占用当前对象。所以调用wait方法一定是在synchronized 中进行。

47、数据连接池的工作机制是什么?

  • 数据库连接池原理:

    • 因为创建连接和关闭连接的行为是非常耗时的,会显著降低软件的性能表现。

    • 解决办法就是先创建n条数据库连接Connection,循环使用,但是不进行关闭,这样再执行SQL语句,就不需要额外创建连接了,直接使用现成的连接就可以了,从而节约了创建连接和关闭连接的时间开销。

48、简述synchronized和java.util.concurrent.locks.Lock的异同?

  • Lock是一个接口,而synchronized是Java中的关键字

  • synchronized是内置的语言实现,Lock是代码层面的实现。

  • Lock可以选择性的获取锁,如果一段时间获取不到,可以放弃。synchronized不行,会一根筋一直获取下去。借助Lock的这个特性,就能够规避死锁,synchronized必须通过谨慎和良好的设计,才能减少死锁的发生。

  • synchronized在发生异常和同步块结束的时候,会自动释放锁。而Lock必须手动释放, 所以如果忘记了释放锁,一样会造成死锁。

49、Class.forName()的作用?为什么要用?

  • Class.forName()常见的场景是在数据库驱动初始化的时候调用。

  • 本身的意义是加载类到JVM中,一旦一个类被加载到JVM中,它的静态属性就会被初始化,在初始化的过程中就会执行相关代码,从而达到"加载驱动的效果"。

50、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

  • 看情况而定。

  • 如果该对象的其他方法也是有synchronized修饰的,那么其他线程就会被挡在外面。否则其他线程就可以进入其他方法。

51、举例五个最常见到的runtime exception?

  • NullPointerException:空指针异常

  • ArithmeticException:算术异常,比如除数为零

  • ClassCastException:类型转换异常

  • ConcurrentModificationException:同步修改异常,遍历一个集合的时候,删除集合的元素,就会抛出该异常

  • IndexOutOfBoundsException:数组下标越界异常

  • NegativeArraySizeException:为数组分配的空间是负数异常

相关文章

网友评论

    本文标题:Java SE,我的噩梦,你呢?

    本文链接:https://www.haomeiwen.com/subject/bfmrfctx.html