大三Java实习小萌新血泪积累面试题

Java面试基础知识类

抽象类和接口有什么区别,以及调用方法的区别

大三Java实习小萌新血泪积累面试题_第1张图片

jvm垃圾回收

首先知道新生代老年代
新生代:存放生命周期较短的对象的区域。
老年代:存放生命周期较长的对象的区域。
标记-清除算法
遍历内存对象,把需要清除的垃圾标记一遍,再遍历一次,对标记过的内存进行回收。
缺点:
效率:要遍历两次
空间:找不到一块需求的大内存时,还得gc

复制算法
把内存分为两部分1:1 左边如果满了触发gc,把左边垃圾清理后遗留的存活对象转移到右边。
此时左边空了,右边还有遗留对象,下一次开始右边,然后接着复制到左边,循环往复。
优缺点:
解决了内存碎片化的问题,但是对内存的利用率太少
改进:
研究表明,新生代中的对象大都是“朝生夕死”的,即生命周期非常短而且对象活得越久则越难被回收。在发生GC时,需要回收的对象特别多,存活的特别少,因此需要搬移到另一块内存的对象非常少,所以不需要1:1划分内存空间。而是将整个新生代按照8 : 1 : 1的比例划分为三块,最大的称为Eden(伊甸园)区,较小的两块分别称为To Survivor和From Survivor。

首次GC时,只需要将Eden存活的对象复制到To。然后将Eden区整体回收。再次GC时,将Eden和To存活的复制到From,循环往复这个过程。这样每次新生代中可用的内存就占整个新生代的90%,大大提高了内存利用率。

但不能保证每次存活的对象就永远少于新生代整体的10%,此时复制过去是存不下的,因此这里会用到另一块内存,称为老年代,进行分配担保,将对象存储到老年代。若还不够,就会抛出OOM。

老年代:存放新生代中经过多次回收仍然存活的对象(默认15次)。

标记–整理算法

因为前面的复制算法当对象的存活率比较高时,这样一直复制过来,复制过去,没啥意义,且浪费时间。所以针对老年代提出了“标记整理”算法。

执行步骤:

标记:对需要回收的进行标记
整理:让存活的对象,向内存的一端移动,然后直接清理掉没有用的内存。

String常用的方法有什么

1.length()方法,确定字符串的长度
2.indexof()和lastindexof()索引字符串中字符的位置
3.charAt()可以获取指定索引处的字符,返回的字符的索引

eg:String s = "hello world";
   System.out.println("s.charAt(2)")

结果是4

java字符串反转

public class Test {

public static void main(String[] args) {
    String s = "abcd";
    StringBuffer sb = new StringBuffer(s);
    String a = sb.reverse().toString();
    System.out.println(a);
    }

Java容器

这个东西直接看大神讲解吧,附上链接[https://blog.csdn.net/a201148...]
ps:把容器理解为集合

集合类线程安全

Vector:就比Arraylist多了个同步化机制(线程安全)。

Hashtable:就比Hashmap多了个线程安全。

ConcurrentHashMap:是一种高效但是线程安全的集合。

Stack:栈,也是线程安全的,继承于Vector。

迭代器

public static void main(String[] args) {
        List list = new ArrayList<>();
       for (int i = 10;i<20;i++){
           list.add(i);
       }
        System.out.println(list);
        Iterator iterator = list.listIterator();
        System.out.println(iterator.toString());
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

你可能感兴趣的:(java)