Java校招笔试题-Java基础部分(七)

导语
  Java 面试题集2021版

73、Set 和List的区别?

  List 接口对Collection进行了简单的扩充,它的具体实现类常用的有ArrayList和LinkedList。可以将任何对象放入到List容器中,并在需要的时候从中取得。

  ArrayList 从命名可以看到他是类似于一种数组的数据存储结构,所以它的访问的速度比较高,而LinkedList 的内部实现采用的是链表,它使用的场景是插入删除操作频繁的场景,在很多实际的使用中,要根据具体的操作而定。

  Set接口也是Collection 的一种扩展形式,而与List不同的是,Set中的对象元素是 不能重复的,也就是说不可以把同一个对象两次放入到Set中。它常用的具体实现类有HashSet 和TreeSet ,HashSet 能快速定位一个元素,但是放入到HashSet中的对象需要实现hashCode()方法。而TreeSet 将对象放入其中是按照元素顺序存放,这就要求放入其中的对象是可以排序的,这就用到了集合框架提供的另外两个实用类Comparable和Comparator ,一个类是可排序的,它就应该实现Comparable接口。有时多个类具有相同的排序算法,那就不需要在每个类中分别重复定义相同的排序算法,只需要实现Comparator接口即可。

74、集合框架中Collection 和Arrays 类的作用

  集合框架中有两个很实用的公共类:
  Collection 和Arrays 。Collections提供了对一个Collection 容器进行排序、复制、查找和添加等一些常用的方法,Arrays 则是提供了一些对数组类似的数据进行的快速操作。

75、TreeSet 里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用父类的compareTo方法,还是使用子类的compareTo方法,还是抛出异常?

  当前的add方法放入哪个对象,就调用哪个对象的compareTo 方法,这个是基于多态的理解。至于compareTo方法如何去做,就要看如何去编写这个类中的方法了。

76、数据结构中,数组与链表有哪些区别?为什么?

  数组就类似于身上编号的人站成一排,找到对应的人很容易,根据每个人身上的编号就可以找到对应的人,但是插入,或者是删除的时候回非常慢,因为要想再某个位置插入一个人的时候就需要将从这个位置开始到最后的人依次往后移动,当然删除也是一样的,但是如果在最后进行删除或者是插入操作的也是很快的。

  链表则像是手拉手站成一排的人,想找到第十个人就需要从第一个人开始问,但是需要插入或者是删除的时候只需要让对应位置的人放开手,然后重新牵起来,这个新人就加入了,删除也是一样道理。

77、Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以提供继承,简单说说分别是哪些类?

  Java中主要有四种流:字节输入流、字节输出流、字符输入流、字符输出流。
  字节输入流继承InputStream,字节输出流继承OutputStream。
  字符输入流继承Reader,字符输出流继承Writer。
  这些流主要定义在java.io 包中,还有许多其他的流类型,但是都是以上四种类型的子类,主要使用了装饰者设计模式来提高性能或者是使用方便。

78、字节流与字符流的区别

  要把二进制数据逐一输出到某个设备上,或者从某个设备中逐一读取二进制数据,不管输入输出设备是什么,都需要用统一的方式来完成操作,用一种抽象的方式进行描述,这个抽象描述方式起名为IO流。对应的抽象类未OutputStream和InputStream,不同的实现类就代表不同的输入设备输出设备,当然这些设备的操作主要是用来进行二进制流的操作。

  在实际应用中,需要将一段文本进行传输,这个可以用字节流,将文本转换成二进制流,但是为了简单就可以将这些字符以字符流的方式进行操作,但是底层的网络传输设备只支持字节流,还是需要将其转换成二进制流,但是在使用的时候为使用这提供了方便,这个过程中字节到字符的转换,编码问题就成为了很重要的一个点,通过什么样的编码进行转换的就需要通过什么样的编码在转换回来。

79、什么是Java序列化,如何实现Java序列化?或者请解释Serializable接口的作用?

  在工作中常常会将Java对象变成字节流的形式或者从一个字节流中恢复成一个Java对象,例如,要将Java对象存储到硬盘中或者传送给网络上的其他计算机,这个过程可以自己写代码把一个Java对象变成某个格式的字节流再传输,但,Java虚拟机本身就提供了这种支持,我们可以调用OutputStream 的writeObject()方法来做,如果要让Java帮忙实现,就要被传输的对象实现Serializable接口,这样,javac 编译的时候就会进行特殊处理,编译的类才可以被writeObject方法进行操作。这个就是所谓的序列化。需要被序列化的类必须实现Serializable接口,这个接口是一个mini接口,里面没有任何的实现方法,继承它就是为了标识该对象可以被序列化。

80、序列化的概念和序列化ID的作用?

  对象经常要通过I/O设备进行传送,让程序传送对象,应该如何实现呢? 把对象的状态数据用某种格式写入到硬盘中,所以Java中就提供了一种统一的解决方案,会把对象变成某个格式进行输入和输出,这种格式对程序员来说是透明的,但是要想使用这种统一的方式,就必须实现Serializable接口。

ObjectOutputStream.writeObject(obje) // 对象输出流保存对象,要使用序列化操作
Object obj ObjectInputStream.readObject();//对象输入流读取对象,使用反序列化操作

  序列化ID的作用是什么?
  假设两年前保存了某个类的对象,这两年来,有人修改了这个类的,类名不变,删除了某个属性和增加了另一些方法,两年后,又去去读那个保存的对象,会出现什么样的结果呢?JDK就无法获知你保存的对象到底是未修改前的类还是修改之后的类对象,为此,就增加了一个版本号的信息,每次类的属性修改,就应该把对应的版本号进行升级,这样,在后续的读取中,比较存储对象的版本号就可以知道使用的那个版本,这个地方所说的版本号就是序列化ID。

81、描述一下JVM加载Class文件的原理机制?

  JVM中类的装载是由ClassLoader 和它的子类来实现的,Java ClassLoader 是一个非常主要的Java运行时系统组件,它负责在运行的时候查找和装载类文件。

82、ClassLoader如何加载Class?

  JVM 有很多的类加载器,每个类加载器都负责加载特定的类,例如Bootstrap类加载器负责加载 jre/lib/rt.jar中的类,常用的运行时操作类都在rt.jar 中,extclassloader 负责加载 jar/lib/ext/*.jar 中的类,Appclassloader负责classpath 指定的目录或者是jar中的类加载,当然还有自定义类加载器,可以加载自定义位置上的类。除了bootstrap之外,其他的类加载器本省就是Java类,它们的父类就是ClassLoader。

83、可不可可以自己写一个类,也叫作java.lang.String?

  当然是可以的,但是在应用的时候,需要用自定义的类加载器进行加载,否则,系统提供的类加载器永远只会去加载jre.jar 包中的java.lang.String。由于在Tomcat的web应用中,都是由webapp自己的类加载先加载自己的WEB-INF/classes目录中的类,然后才委托上级的类加载器加载,如果我们在Tomcat的web应用程序中写一个java.lang.String ,这个时候Servlet程序加载的就是自己编写的String,这么做会有很多的潜在的问题,原来的所有用了java.lang.String 类都将出现问题。

84、Heap 和Stack 有什么区别?

  Java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私有的存储空间,用于存储这个方法内部的局部变量,当这个方法结束的时候,分配这个方法的栈会释放,这个栈中的变量也将随之释放。

  堆是与栈作用不同的内存,一般用于存放那些不存如当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随着方法的结束而消失。此外,方法中的局部变量使用final 修饰后,放在堆中,而不是栈中。

85、GC是什么?为什么要有GC?

  GC 是垃圾收集的意思(Gabage Collection),内存处理室编程人员容易出现问题的地方,忘记或者错误都会导致内存溢出问题,导致程序或者整个系统的不稳定甚至是奔溃,Java提供GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法,回收内存的工作完全是由JVM控制的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nihui123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值