1.java代码为什么能一次编译,到处运行?
因为JVM(java虚拟机)将java文件编译成.class字节码文件,解释器再将字节码文件翻译成机器码,java代码就可以在不同机器上运行。
2.java中8种基本数据类型是什么?
整型:byte、short、int、long
浮点型:double、float
字符型:char
布尔型:boolean
3.this 关键字的使用?
表示指向当前对象本身,形参与成员名字重名,用this来区分。
4.super关键字的使用?
表示指向离当前对象最近的父类,可以用super.xxx来引用父类的成员。
5.面向对象三大特征?
封装、继承、多态。
6.类加载顺序?
父类的静态成员变量->父类的静态代码块->子类的静态成员变量->子类的静态代码块->父类的成员变量->父类的代码块->父类的构造器
->子类的成员变量->子类的代码块->子类的构造器
7.构造器作用?
类初始化
8.内部类包括?
静态内部类 new Outer.Inner();
成员内部类 Outer outer = new Outer(); outer.new Inner();
方法内部类 方法内直接new
匿名内部类 匿名内部类必须继承或实现一个已有的接口
9.重载和重写的区别?
重载 : 同一个类,方法名相同,参数不同,和方法返回值和访问修饰符无关;
重写 : 父子类之间,方法名和参数相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类
10. 集合框架包括哪些类或接口,特点是什么?
Map接口和Collection接口是所有集合框架的父接口;
Collection 接口的子接口 List 和 Set ;
List接口的实现类 主要有 ArrayList 、LinkedList 、Vector
ArrayList 底层是动态数组,在内存中是连续的 。有序,可重复,允许多个null,遍历快,删除和加入慢,因为要把原数组的数据Copy到新的数组;
LinkedList 底层是双向链表,通过Node来维护,所以删除和加入快(除了头尾元素),遍历慢,最好通过迭代器来遍历;
Vector 基本同ArrayList ,但在增加了Synchronized 来实现线程同步,是线程安全的,所以性能比较慢。
Set接口的实现类 HashSet 、LinkedHashSet、TreeSet
HashSet 无序,不可重复,允许一个null,实际上调用了 HashMap,将对象存入HashMap的Key,Value始终为一空值PRESENT;
LinkedHashSet 实际上调用了LinkedHashMap;
TreeSet 有序,基于TreeMap实现;
Map 接口的实现类有 HashMap、LinkedHashMap 、ConCurrentHashMap 、HashTable
HashMap 线程不安全,允许一个Key为null,多个Value为null,底层是在jdk1.8 中是数组+链表/红黑树的结构 ,add方法通过计算hash值来确定在数组中的位置,如果发生hash冲突,则加入链表,该位置链表数大于阈值(默认8),则转化为红黑树,以减少搜索时间;
LinkedHashMap 在HashMap的基础上实现了双向链表;
ConCurrentHashMap 线程安全,1.7 实现了分段锁,1.8优化使用CAS,只在每一个链表或红黑树的头结点加锁,提升了性能;
HashTable 线程安全,加了全表锁,性能不行;
11.多线程的实现方式?
继成Thread类,实现Runable接口,实现Callable接口,线程池
12.线程的状态?
新建(new)可运行(runable)运行(runing)阻塞(block)死亡(dead)