Java基础面试题

1、什么是OOP? 
    面向对象编程
2、类与对象的关系? 
    类是对象的抽象,对象是类的实例
3、Java中有几种数据类型标识符的命名规则?
    驼峰命名,类名首字符需要大写,方法首字符小写,之后单词之间都需要驼峰方式首字符大写;
4、instanceof关键字的作用?
    instanceof格式是(子类实例对象 instanceof 父类类名)返回boolean类型,校验是否是子父关系;
5、什么是隐式转换,什么是显式转换?
    隐式转换就是不同基本类型之间计算自动转类型,例如,int a = 1; double b = 1; System.out.println(a+b);//2.0 系统自动转成double;
    显式转换就是不同基本类型之间计算强制转换类型,例如,int a = 1;float f = (float) a;System.out.println(f);//1.0 int强制转换成flaot
6、Char类型能不能转成int类型?
    可以,chart如果是不带单引号就是数字,可以隐式转换成int,char如果是带单引号的ASCII值,会先转成ASCII对应的数值然后再与int相加;
7、能不能转化成string类能不能转成double类型?
    可以,通过Double类的parentDouble()方法,但需要注意的是String字符串的内容最好是数字,如果是别的非数字的字符会报错NumberFormatException;
8、Java中异常分为哪两种?
    error、exception(RuntimeException) error是系统异常java校验语法错误、exception程序在运行过程中的异常;
9、异常的处理机制有几种?
    1、捕获异常自己处理try{}catch(){}
    2、抛出异常别人处理throw new exception()
10、如何自定义一个异常?
    继承自Exception或者runtimeException,编写无参或有参构造器处理异常结果
11、try catch fifinally,try里有return, finally还执行么?
    执行
12、ArrayList和LinkedList的区别?
    两者都是实现List接口但实现的方式不用,ArrayList是以数组的方式去实现,LinkedList是以链表的方式去实现,
    ArrayList继承AcstractList,LinkedList继承AbstractSequentialList;
    ArrayList查看数据效率高直接通过角标,LinkedList插入跟删除数据快适合用来实现Stack(堆栈)与Queue(队列);
    两者都是线程不安全的,如果对象内存空间被多个线程共享就会出现脏读取的现象,使用Collections.syschronizedList()完成线程安全;
13、HashMap和HashTable的区别?
    两者都是实现Map,HasMap继承AbstractMap,HashTable继承Dictionary;
    HashMap非线程安全,HashTable线程安全;
    HashMap允许null键null值只允许一个null键,HashTable不允许null键null值;
    Java5提供了性能更好的ConcurrentHashMap是HashTable的替代,可以支持 16 个线程执行并发写操作;
    只要多个修改(写)操作发生在不同的段上,它们就可以并发进行;
    通过锁分段技术保证并发环境下的写操作;
    通过 HashEntry的不变性、Volatile变量的内存可见性和加锁重读机制保证高效、安全的读操作;
    通过不加锁和加锁两种方案控制跨段操作的的安全性;
14、Collection包结构,与Collections的区别?
    Collection是集合类的上级接口,子接口有 Set、List、LinkedList、ArrayList、Vector、Stack、Set;
    Collections是集合类的一个帮助类, 它包含有各种有关集合操作的静态多态方法,用于实现对各种集    合的搜索、排序、线程安全化等操作。此类不能实例化,就像一个工具类,服务于Java的Collection框架;
15、泛型常用特点?
    泛型类、泛型接口、泛型方法;规范参数类型;
16、说说List,Set,Map三者的区别?
    List:
        1.可以允许重复的对象。
        2.可以插入多个null元素。
        3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
        4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
    Set:
        1.不允许重复对象
        2.无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator  或者 Comparable 维护了一个排序顺序。
        3.只允许一个 null 元素
        4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
    Map:
        1.Map不是collection的子接口或者实现类。Map是一个接口。
        2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
        3.TreeMap 也通过 Comparator  或者 Comparable 维护了一个排序顺序。
        4.Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
        5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
17、Array与ArrayList有什么不一样?
    ArrayList是基于array,array并不提供任何方法,它仅仅暴露了一个常量的长度来表示当前数组的长度;
    array是静态的,你无法一旦创建了一个数组就无法更改它的大小;但是ArrayList因为是动态的,所以它可以做到;
    ArrayList和array之间的另外一个重要的区别就是前者能够显示的支持泛型,后者不行
18、Map有什么特点?
    map集合特点就是采用了 Key-value键值对映射的方式进行存储;
    key在Map里面是唯一的但是value可以重复,一个key对应一个value;
    key是无序、唯一的;
    value是无序不唯一的;
    Map接口有两个集合HashMap和TreeMap及LinkedHashMap;
    HashMap采用哈希表的存储结构所以里面的数据是无序但是唯一的。(实现唯一的方式就是重写 Hashcode和equals方法);
    TreeMap采用的是二叉树的存储方式里面的数据是唯一而且有序的而且一般是按升序的方式排列 (要实现comparable接口并且重写compareTo的方法用来实现它的排序);
    LinkedHashMap是HashMap的进化版它比HashMap速度更快而且还可以保证唯一性和有序性。(它的实现方式是哈希表和链表的结合);
19、集合类存放于Java.util包中,主要有几种接口?
    类型主要是set(集)、list(列表)和map(映射);
    Collection:Collection 是集合 List、 Set、 Queue 的最基本的接口;
    Iterator:迭代器,可以通过迭代器遍历集合中的数据;
    Map:是映射表的基础接口;
20、什么是list接口?
    Java 的 List 是非常常用的数据类型。List 是有序的 Collection。
    Java List 一共三个实现类:分别是 ArrayList、 Vector 和 LinkedList 。
21、说说ArrayList(数组)?
    ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔, 当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中。当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
22、说说Vector(数组实现、线程同步)跟LinkList(链表)?
    Vector 与 ArrayList 一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写 Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问 ArrayList 慢;
    LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用;
23、什么Set集合?
    Set 注重独一无二的性质,该体系集合用于存储无序(存入和取出的顺序不一定相同)元素, 值不能重复。对象的相等性本质是对象 hashCode 值(java 是依据对象的内存地址计算出的此序号) 判断的, 如果想要让两个不同的对象视为相等的,就必须重写Object 的 hashCode 方法和 equals 方法;
24、java反射的作用?                
    要正确使用Java反射机制就得使用java.lang.Class这个类。它是Java反射机制的起源。
    当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。
    通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。
25、哪里会用到反射机制?
    ①我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;
    ②Spring框架也用到很多反射机制,最经典的就是xml的配置模式。Spring 通过 XML 配置模式装载 Bean 的过程:
        1) 将程序内所有 XML 或 Properties 配置文件加载入内存中; 
        2)Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息; 
        3)使用反射机制,根据这个字符串获得某个类的Class实例; 
        4)动态配置实例的属性。
26、反射的实现方式?
    Student stu = new Student();
    1) Class s1 = stu.class;
    2) Class s2 = stu.getClass();
    3) Class s3 = Class.forName("Student的相对路径");
27、实现Java反射的类?
28、反射机制的优缺点?

优点:

  1. 反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。
  2. 通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类。
  3. 使用反射机制能够在运行时构造一个类的对象、判断一个类所具有的成员变量和方法、调用一个对象的方法。
  4. 反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。

缺点:

  1.  性能问题:Java反射机制中包含了一些动态类型,所以Java虚拟机不能够对这些动态代码进行优化。因此,反射操作的效率要比正常操作效率低很多。我们应该避免在对性能要求很高的程序或经常被执行的代码中使用反射。而且,如何使用反射决定了性能的高低.如果它作为程序中较少运行的部分,性能将不会成为一个问题。
  2. :安全限制:使用反射通常需要程序的运行没有安全方面的限制。如果一个程序对安全性提出要求,则最好不要使用反射。
  3. 程序健壮性:反射允许代码执行一些通常不被允许的操作,所以使用反射有可能会导致意想不到的后果。反射代码破坏了Java程序结构的抽象性,所以当程序运行的平台发生变化的时候,由于抽象的逻辑结构不能被识别,代码产生的效果与之前会产生差异。

29、Java反射API?

  1. 动态加载对象。在运行状态中,对于任何一个类,能够获取这个类的所有属性和方法,对于一个对象,能够调用它的的任意一个属性和方法,这种动态获取类的内容和动态调用对象的方法称为反射机制。
  2. 通过反射机制相关的API就可以获取任何Java类的包括属性、方法、构造器、修饰符等信息。元素不必在JVM运行时进行确定,反射可以使得它们在运行时动态地进行创建或调用。
  3. JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中

Class类:代表一个类

Constructor类:代表类的构造方法

Field类:代表类的成员变量

Method:代表类的方法

30、反射使用步骤(获取Class 对象、调用对象的方法)?

26题是反射类的三种创建方法,调用反射对象的方法通过:Method[] methods=c1.getDeclaredMethods();
31、获取Class对象有几种方法?

26题是反射类的三种创建方法

32、利用反射动态创建对象实例? 

26题是反射类的三种创建方法
33、什么是java序列化,如何实现java序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。这个类应该实现Serializable接口或者Externalizable接口之一。

//序列化对象
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\objectFile.obj"));
Customer customer = new Customer("王麻子", 24);    
out.writeObject("你好!");    //写入字面值常量
out.writeObject(new Date());    //写入匿名Date对象
out.writeObject(customer);    //写入customer对象
out.close();
//反序列化对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\objectFile.obj"));
System.out.println("obj1 " + (String) in.readObject());    //读取字面值常量
System.out.println("obj2 " + (Date) in.readObject());    //读取匿名Date对象
Customer obj3 = (Customer) in.readObject();    //读取customer对象
System.out.println("obj3 " + obj3);
in.close();

执行结果: 

 

34、保存(持久化)对象及其状态到内存或者磁盘?

Java 平台允许我们在内存中创建可复用的 Java 对象,但一般情况下,只有当 JVM 处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比 JVM 的生命周期更长。 但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java 对象序列化就能够帮助我们实现该功能。
35、序列化对象以字节数组保持-静态成员不保存?

使用 Java 对象序列化, 在保存对象时,会把其状态保存为一组字节,在未来, 再将这些字节组装成对象。必须注意地是, 对象序列化保存的是对象的”状态”,即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。
36、序列化用户远程对象传输?

除了在持久化对象时会用到对象序列化之外,当使用 RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。 Java序列化API为处理对象序列化提供了一个标准机制,该API简单易用。
37、Serializable实现序列化?

在 Java 中, 只要一个类实现了 java.io.Serializable 接口,那么它就可以被序列化。ObjectOutputStream 和 ObjectInputStream 对对象进行序列化及反序列化通过 ObjectOutputStream 和 ObjectInputStream 对对象进行序列化及反序列化。
38、writeObject和readObject自定义序列化策略?

在类中增加 writeObject 和 readObject 方法可以实现自定义序列化策略。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值