目录
一、字符串长度
解析:
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接口