牛客网Java错题总结(2)

目录

一、字符串长度

二、JVM堆内存

三、ArrayList和LinkedList的区别

四、Java基础概念

五、多线程


一、字符串长度

解析:

length() 方法返回的就是字符串的长度,一个 char 可以存下汉字,所以一共有八个汉字,字符串长度为8,

如果想获得占用字节数的话,可以用 s.getBytes(“GBK”).length,结果就是16了。

二、JVM堆内存

解析:

在JDK1.7版本之前,JVM堆内存划分如图所示:

  • JVM内存划分为堆内存和非堆内存,堆内存分为年轻代(Young Generation)、老年代(Old Generation),非堆内存就一个永久代(Permanent Generation)。
  • 年轻代又分为Eden和Survivor区。Survivor区由FromSpace和ToSpace组成。Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:1。
  • 堆内存用途:存放的是new出来的对象,垃圾收集器就是收集这些对象,然后根据GC算法回收。
  • 非堆内存用途:永久代,也称为方法区,存储程序运行时长期存活的对象,比如类的元数据、方法、常量、属性等。常量池就放在永久代中。

注意:

在JDK1.8版本废弃了永久代,替代的是元空间(MetaSpace),元空间与永久代上类似,都是方法区的实现,

他们最大区别是:元空间并不在JVM中,而是使用本地内存。

元空间有两个参数:

  • MetaspaceSize :初始化元空间大小,控制发生GC阈值
  • MaxMetaspaceSize : 限制元空间大小上限,防止异常占用过多物理内存

三、ArrayList和LinkedList的区别

解析:

ArrayList和LinkedList的区别:

  • 1、数据结构不同
    • ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构。
  • 2、效率不同
    • 当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
    • 当对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
  • 3、自由性不同
    • ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。
  • 4、主要空间开销不同
    • ArrayList主要空间开销在于需要在List列表预留一定空间;而LinkedList主要空间开销在于需要存储结点信息以及结点指针信息。

四、Java基础概念

解析:

  • A、错误(Error)的基类是Throwable
  • C、基本类型不是对象
  • D、finalize在被JVM回收时会进行判断:
    • 1、如果此对象finalize未被执行过,则执行,并放置此对象到F-Queue中,此时,若在下次GC之前,重新与GC ROOTS建立引用连接,则对象"复活",下次GC时如果此对象又被GC,则直接进行回收,因为finalize只执行一次。
    • 2、如果此对象finalize已经执行过一次,则在GC时不执行finalize,直接回收
  • E、使用高版本JDK编写的JAVA程序,可能无法在低版本的JRE中运行;因为有些高版本JDK提供的新特性,低版本的JRE不支持

五、多线程

解析:

  • B、在java中线程是有分优先等级的,所以优先级不能相同
  • C、Thread实现了Runnable接口,是一个类不是接口
  • D、实现多线程的三种方式,一种是继承Thread类使用此方式就不能继承其他的类了;还有两种是实现Runnable接口或者实现Callable接口

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/114989713