重载和重写的区别? 重载:两同一异,同类同名不同参(参数顺序、个数、类型等不同),有重载构造器 重写:两异一同,子父类同名同参,重写方法门槛要低于父类方法(权限修饰符范围大,返回值为引用类型时 相同或是其子类,异常范围同上),构造器不可重写
除了空指针、数组越界等异常,还有哪些常见错误和异常? Error:如OOM、StackOverflowError等 Exception:包装类.parseXxx()转换类型错误时:NumberFormatException valueOf(name)返回指定name名称的枚举类对象,当name不存在时:IllegalArgumentException非法参数错误 线程安全问题或是在迭代器/foreach循环中增删元素:ConcurrentModificationException并发修改错误 向下转型异常:ClassCastException 编译异常通常是意外情况,如找不到文件,需要提供try-catch等方法做备用;运行异常通常是因为逻辑不够健壮,修改后能够避免
什么时候会空指针异常? 1.调用一个为null的对象的成员方法或成员属性 2.null的拆箱操作(也是第一条的情况)
final、finally、finalize三者的区别? final:修饰变量、方法、类,变量是常量,方法不能被重写,类不能被继承 finally:try-catch结构中必须执行的部分,不论异常是否捕获成功都执行,并且在其他return前执行 finalize:Object类的方法,手动计划回收资源,可能存在回收失败问题
抽象类和接口区别: 抽象类不一定都是抽象方法,接口一定是; 一个类只能继承一个抽象类,一个类可以实现多个接口
如何理解面向对象三大特征(如何理解面向对象编程思想)? 封装性:属性、方法、类用不同的权限修饰符包装成一个整体,增强安全性和简洁性,也就是可见性的大小 继承性:减少冗余、方便扩展,多态的前提 多态性:增强接口方法的灵活性,类的多态。如果没有多态性,抽象类和接口的声明就没意义了
如何理解Java万事万物皆对象? 数据库的一行数据、文件File、前端页面的各种数据等,在Java中都可以被看做一个对象
并行和并发的区别? 并行:多个CPU同时执行 并发:一个CPU交替执行
进程和线程的区别? 进程资源分配单位,线程调度执行单位;进程可存在多个线程,线程拥有独立的运行栈(虚拟机栈和本地方法栈)和计数器,共享方法区和堆
线程的生命周期(画图)? 新建->就绪<–>运行->死亡(不可逆) 就绪<-阻塞(临时状态)<-运行
Thread和Runnable两种线程创建方式的区别? 相同点:都需要重写run()方法;启动线程都需要调用Thread类的start() 不同点:实现Runnable要好于继承Thread。1.类可以实现多个接口,但是只能继承一个父类;2.实现的方式更方便共享数据 注意:Thread类实现Runnable
创建多线程的方式有几种?Callable接口有什么优势?线程池有什么优势? 4种:继承Thread,实现Runnable,实现Callable,使用线程池 Callable接口相比Runnable优势:call()方法有返回值,可抛异常,返回值泛型 线程池好处:1.减少创建新线程时间,提高速度 2.重复利用线程池中线程,降低资源消耗 3.便于线程管理
解决线程安全问题有几种加锁方式?synchronized和Lock有什么异同? 3种:同步代码块、同步方法、Locked 相同点:加锁保证线程安全 不同点:Lock需要显式调用unlock()释放共享资源的占用,使用更灵活
避免线程安全问题的方式?
线程串行(不推荐)对象内存不共享(栈)对象不共享:多例对象调用对象的方法不会出现线程安全问题,因为压栈操作是独享内存只访问属性,而不是修改等,也不会出现线程安全问题wait()和sleep()的异同? 相同点:都进入阻塞状态 不同点: wait()自动释放同步监视器,需要notify()/notifyAll()唤醒,仅在同步块或同步方法中使用(还有notify()和notifyAll(),因为需要同步监视器调用),方法来自Object sleep()不自动释放同步监视器(因为没有),不限制使用场景,方法来自Thread类 sleep是静态方法,wait是成员方法,静态方法和类型有关,和对象无关,成员方法和对象有关。所以sleep休眠的是当前正在执行的线程,wait是对象休眠
String、StringBuffer、StringBuilder区别? String:不可变 StringBuffer:可变;默认容量16+已占用空间,扩容为初始容量2倍+2;线程安全,效率低 StringBuilder:可变;默认容量16+已占用空间,扩容为初始容量2倍+2;线程不安全,效率高;jdk1.5新特性
数组和集合的区别? 1.长度:数组固定,集合可变 2.内容:数组类型一致,集合类型可不同 3.元素数据类型:数组基本类型/引用类型,集合只可引用类型
【集合List/Set特点】? Collection: –List:有序、可重复 –ArrayList:线程不安全 效率高,底层Object[],查找效率高 jdk7初始化容量为10,默认扩容1.5倍或需要容量(小于2^31-1);jdk8初始容量为0,赋值时才创建容量为10,其余跟7一样 –LinkedList:线程不安全 效率高,底层双向链表,插入、删除效率高 jdk8添加时,元素封装在Node对象中,并指明前后元素;内存中不是连续存放,所以不存在扩容问题 –Vector:线程安全 效率低,底层Object[],查找效率高 jdk7/8初始化容量为10,默认扩容2倍 –Set:无序、不可重复(重复不覆盖),线程不安全 –HashSet:无序,底层HashMap的key,数组+链表(jdk8中某个位置上的链表长度超过8且数组总长度超过64(极端情况下链表长度超过11),则改为红黑树),可以存null 底层存值过程:先二次哈希比较位置–相同–>再比较hashCode–相同–>再比较equals–>有一处不同则保存在此位置,链表插入方式:jdk7链表最上jdk8链表最下(七上八下) 存值可能导致的问题:存入对象后修改属性,由于比较的hash值不变,则可能存入“相同”对象 –LinkedHashSet:有序,添加数据时,额外用指针记录添加顺序,遍历时更快且存取同序 –TreeSet:自然排序(如a~z,自定义对象排序,且TreeSet创建时调用的是无参构造函数,那么排序对象必须要实现comparable接口),底层红黑树,添加数据类型必须相同 注意:有序是指存取同序
【Map特点】? Map:无序 –HashMap:线程不安全,效率高,key和value可存null HashMap底层实现原理: jdk7:创建长度为16的Entry数组table,存值过程比较key时同HashSet jdk8:首次put()时才初始化容量,底层Entry[]改名叫Node[],“七上八下”,某个位置上的链表长度超过8且数组总长度超过64(极端情况下链表长度超过11),则改为红黑树 HashMap扩容:初始化容量必须是2的次幂,负载因子0.75即已用75%容量时扩容,默认扩容2倍,2倍是因为存值时底层位运算计算位置需要 –LinkedHashMap:添加数据时,额外用指针记录添加顺序 注意:存自定义对象时,HashSet/LinkedHashSet必须重写hashCode()和equals()判断重复性,且重写的hashCode()和equals()要保证一致性 –TreeMap:线程不安全,效率高,底层红黑树,key自然排序(适合排序) –Hashtable:线程安全,效率低,key和value不可存null –Properties:key和value都是String,常用于配置文件
hashMap和hashTable区别? hashMap:线程不安全,key和value可存null hashTable:线程安全,key和value不可存null hashMap用containValue()替换掉了hashTable的contains(),并增加了containKey()
Iterator、foreach循环中如何增删元素? 直接用list/map方法增删会造成并发修改错误,解决方法: 1.用迭代器修改元素:Iterator的remove()和ListIterator的add()(新增元素跟在刚才迭代元素之后) 2.用普通for循环修改元素(可能会跳过某些元素)
for、Iterator和foreach的区别(foreach本质也是迭代器)? 1.for需要知道集合或数组的大小,而且需要是有序的 2.foreach不能删除集合元素 3.Iterator只能使用自身的remove()方法来删除元素,不能用集合的删除操作 4.ArrayList里,for循环较快,LinkedList里,使用iterator较快
重写equals()方法为什么要同时重写hashcode()方法? 为了保证(在HashMap等场景中)当两个对象通过equals()方法比较相等时,那么他们的hashCode值也一定要保证相等。 否则equals比较明明相等,但hashCode却不相等导致key存放位置不同而重复
说明流的三种分类方式? 输入流/输出流、字符流/字节流、节点流/处理流
对象序列化机制的作用? 把对象转成二进制流,方便持久化到磁盘或通过网络传播
实现序列化,需要满足几个条件? 对象实现序列化接口Serializable、全局常量serialVersionUID、所有属性必须可序列化(static/transient修饰的变量不参与序列化,String、基本数据类型本身就可序列化)
七层协议模型、TCP/IP协议模型? OSI模型:应用层-表示层-会话层-传输层-网络层-数据链路层-物理层 TCP/IP模型:应用层-传输层-网络层-物理+数据链路层
Class类的理解?
Class是lang包的一个类,构造器私有,由jvm生成java源程序经过javac.exe执行后,生成一个或多个字节码文件。使用java.exe命令,将字节码文件代表的类加载(使用类的加载器)到内存中(放到方法区/元空间中缓存)。加载到内存中的类称为运行时类,此运行时类可以看作是Class的实例。Class实例指向一个内存中的运行时类,可以获取运行时类的所有结构加载到内存中的运行时类,会被缓存。在整个jvm的生命周期内没有进行方法区gc时,只会存在一份反射能做什么?
动态的获取内存中的运行时类;动态的创建运行时类的对象;动态的调用运行时类中的指定结构:属性、方法等生成动态代理一个类被加载到内存并使用的三个阶段? 加载-链接(验证-准备-解析)-初始化
反射是否破坏了封装性? 不影响。反射:能否调用;封装性:(如单例模式等)建议是否调用
哪些类型可以有Class对象? 1).class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类 2).interface:接口 3).[]:数组 4).enum:枚举 5).annotation:注解@interface 6).primitive type:基本数据类型 7).void
创建对象几种方式? (主要是)new+构造器,序列化,obj.clone()
jvm创建对象一定在堆中吗? 不一定在堆中: 1.当gc没有回收足够的空间时,直接以操作系统身份划分内存作为【堆外内存】,此内存可人工参与; 2.还有一种情况,在【逃逸分析】可行的情况下,小对象可以分配在【栈】和【新生代】