线程池面试点 Callable类型的任务是可以返回执行结果的,而Runnable类型的任务不可以返回执行结果。execute()方法主要用于启动任务的执行,而任务的执行结果和可能的异常调用者并不关心。submit()方法也用于启动任务的执行,但是启动之后会返回Future对象,代表一个异步执行实例,可以通过该异步执行实例去获取结果。当有任务的时候,线程池会不断创建核心线程数直到设置的数量,如果还是有任务,就会加入到等待队列当中去;线程池的作用是什么?其中核心线程数如果没满,即使有的线程在空转也会新建线程。
Mybatis缓存 二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactroy创建SqlSession查询结果会被缓存;此后若再次执行相同的查询语句,结果会从一个缓存中获取。flushinterval(刷新间隔) 可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。打印发现2个对象的地址值不一样,但是确实只发送了一次SQL语句的查询,二级缓存中存储的是数据,不是对象。2.sqlSession相同,查询条件不同,多次查询不同的情况,不会导致缓存失效。3.什么样的数据能使用缓存。
JVM 垃圾回收 大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 s0 或者 s1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。):“Hotspot 遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了 survivor 区的一半时,取这个年龄和 MaxTenuringThreshold 中更小的一个值,作为新的晋升年龄阈值”。
Java 内存区域详解 大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 s0 或者 s1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。也就是说,永久代是 HotSpot 的概念,方法区是 Java 虚拟机规范中的定义,是一种规范,而永久代是一种实现,一个是标准一个是实现,其他的虚拟机实现并没有永久代这一说法。对象的访问方式由虚拟机实现而定,目前主流的访问方式有。
类加载简述 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加 载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的 加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请 求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节 流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。
面向对象三大特性 继承性:允许通过继承原有类的某些特性或全部特性而产生全新的类,原有的累称为父类,产生的新类称为子类。子类不仅可以直接继承父类的共性,而且也可以创建它特有的个性。多态性:是指在基类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同行为,多态性有两种表现形式:重载和覆盖。封装性:类的封装性为类的成员提供公有、缺省、保护和私有等访问权限,目的是隐藏类中的私有变量和类中方法的实现细节。类具有封装性、继承性和多态性。
abstract class 和 interface 有什么区别? D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体),实现类必须要实现。A. interface需要实现,要用implements,而abstract class需要继承,要用extends。不可有私有的,默认是public static final 型,且必须给其初值,实现类中不能重新定义,不能改变其值。A. 两者都是抽象类,都不能实例化。
类初始化顺序 通过这种方式,Java确保了父类的初始化在子类之前完成,从而保证了继承关系中的正确性和一致性。在Java中,当一个子类被实例化时,其父类也会被初始化。按照从父类到子类的顺序,依次执行静态变量的初始化和静态初始化块。先执行父类的实例变量初始化和实例初始化块。再执行子类的实例变量初始化和实例初始化块。Parent 类的构造方法紧接着执行。Child 类的构造方法最后执行。Parent 类的静态块先执行。Parent 类的实例块先执行。Child 类的静态块后执行。Child 类的实例块后执行。
redis简单理解 在集合类型的基础上有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。c语言对字符串的存储是使用字符数组,遇到'\0'字符则认为字符串结束,redis的字符串可以存储任何类型的数据,因为任何类型数据都可以表示成二进制,sds结构中的char buf[]就是存储了二进制数据。1、列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。
jvm笔记 内存分一半,只操作一半内存的数据,标记活下来的放到另一半内存,原先内存数据全部删除。不同的锁标志位,会导致32bit的数据展示的不一样,对象的hashcode在其他锁状态没有是因为存到其他地方了。指针碰撞和空闲列表,都有并发问题,可以通过同步或TLAB,每个线程都分块地方,各自忙自己的。记忆集:将老年代存在跨代引用的加入记忆集,垃圾回收找记忆集,不用再遍历老年代。遍历对象,标记活下来的对象,删除其余对象。标记活着的,统一放到一块地方,删除其他的。哪些内存要回收,什么时候回收,怎么回收。
128陷阱 Java 5引入了自动装箱和拆箱机制,允许将基本数据类型自动转换为对应的包装类对象,反之亦然。例如,Integer a = 128;实际上会调用Integer.valueOf(128)方法。-128到127由于是热点数据,所以缓存了起来。Integer.valueOf()方法。