JDK是Java开发工具包,提供了Java的开发环境和运行环境。
JRE是提供了Java运行所需的环境。
JDK包含JRE,JRE包含JVM.
Default:默认访问修饰符,在同一个包内可见
Private:在同一个类内可见,不能修饰外部类
Public:对所有的类可见
Protected:对同一包内的类和所有子类可见,不能修饰外部类
先后顺序:静态成员变量、成员变量、构造方法
详细的先后顺序:父类的静态变量、父类的静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数
一个类只能继承一个抽象类,而一个类却可以实现多个接口
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的
抽象类可以有构造方法,接口中没有构造方法
接口中不能含有静态代码块以及静态方法,而抽象类中可以有静态代码块和静态方法
抽象类不能用final修饰,因为抽象类的作用就是需要被其他类继承,加final修饰就矛盾了。
重写发生在子类和父类之间,重写的返回值和形参都不能改变,父类的方法访问修饰限定符要大于子类方法的
重载发生在一个类里面,方法名相同,形参个数和类型不同,返回类型可以相同也可以不同
final修饰变量、方法和类。
final修饰的变量不可变,,final修饰的变量必须初始化,通常被修饰的变量为常量。
final修饰的方法不允许任何子类重写,子类可以使用该方法。
final修饰的类不能被继承,所有方法不能被重写。
Finally 作为异常处理的一部分,只能在try/catch语句中,在这些语句中finally一定会被执行。
finalize是在object类的一个方法,也就是说每个对象都有这个方法,这个方法在该对象被回收的时候调用。一个对象的finalize方法只会被调用一次。
Static的主要作用有两个:
- 为某种特定数据类型或对象分配与创建对象个数无关的单一的存储空间
- 使得某个方法或属性与类而不是对象关联在一起,即在不创建的情况下可通过类直接调用方法或使用类的属性
具体的static又可分为4种使用方式:1.修饰成员变量 2.修饰成员方法 3.修饰代码块 4.修饰内部类
1.父类静态代码块(只执行一次)
2.子类静态代码块(只执行一次)
3.父类构造代码块
4.父类构造函数
5.子类构造代码块
6.子类构造函数
7.普通代码块
一维数组声明方式:
- typer arrayname []
- typer[] arrayname
二维数组声明方式: - typer arrayname[][]
- typer[][] arrayname
- typer[] arrayname[]
9.String和StringBuffer有什么区别
String用于字符串操作,属于不可变类。String对象一旦被创建,其值将不能被改变。
StringBuffer是可变类,当对象创建后,任然可以对其值进行修改。
如果“”比较的是基本数据类型,那么比较的两个基本数据类型的值是否相等;
如果“”比较的两个对象,那么比较的是两个对象的引用,也就是判断两个对象是否指向同一块内存区域;
Equals 主要用于对两个对象之间,检测它们是否相等。
如果类中没有重写equals方法,等价于比较两个对象是否指向同一块区域。
如果类中重写了euqals方法,等价于比较两个对象的内容是否相等。
序列化是一种将对象转换成字节序列的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统里,并在需要的额时候把该流读取出来重新构造成一个相同的对象。
12.Java反射机制是什么Java反射机制是指在程序的运行过程中可以构造任意一个类的对象、获取任意一个类的成员变量和成员方法、获取任意一个对象所属的类信息、调用任何一个对象的属性和方法。反射机制使得Java具有动态获取程序信息和动态调用对象方法的能力。可以通过以下类调用反射API。
Class类:可获得类属性方法
Field类:获得类的成员变量
Method类:获取类的方法信息
Consrtruct类:获取类的构造方法等信息
Java异常分为Error(程序无法处理的错误)和Exception(程序本身可以处理的异常)。这两个类均继承Throwable.
Error常见的有StackOverFlowError, OutOfMemoryError等等
Exception可以分为运行时异常和非运行时异常。对于运行时异常,可以利用try/catch方式进行处理,也可以不处理。对于非运行时异常,必须处理,不处理的话程序无法通过编译。
泛型,即参数化类型,解决不确定对象具体类型的问题。在编译阶段有效。在泛型的使用过程中,操作的数据类型被指定为一个参数,这种参数类型在类中称为泛型类、接口中称为泛型接口和方法中称为泛型方法。
15.简述泛型擦除Java编译器生成的字节码是不包含泛型信息的,泛型类型信息将在编译处理时被擦除,这个过程被称为泛型擦除。
16.简述自动装箱拆箱对应Java基本数据类型,均对应一个包装类。
装箱就是自动将基本数据类型转换位包装类型。
拆箱就是自动将包装类型转换为基本数据类型。
封装:封装就是将客观的事物封装成抽象的类,并且类可以把自己的数据和方法给可信的类和对象操作,对不可信的进行信息隐藏。
继承:对象的一个新类可以从现有的类中派生,子类可以从它的父类中继承方法和实例变量,且子类可以修改或新增新的方法使之更适合特殊的需求。
多态:Java多态可以分为编译时多态和运行时多态。
编译时多态主要指方法的重载,即通过参数列表的不同来区分不同的方法。
运行时多态主要指继承父类和实现接口时,可使用父类引用指向子类对象
1.hashcode:通过对象计算出的散列码,用于map或equals方法,需要保证同一个对象多次调用该方法,总返回相同的整型值。
2.euqals:判断两个对象是否一致,需要保证equals方法相同的对象对应的hashcode也相同
3.toString:用字符串表示该对象
4.clone:深拷贝一个对象
String类采用final修饰的字符数组进行字符串保存,因此不可变。如果对String类型修改,需要新建对象,将老字符和新增字符一并存进去
StringBuilder, 采用无final修饰的字符数组进行保存,因此可变。但线程不安全。
StringBuffer, 采用无final修饰的字符数组进行保存,可理解为实现线程安全的StringBuffer
HashTable:哈希表的线程安全版,效率低
ConcurrentHashMap:哈希表的线程安全版,效率高,用于替代HashTable
Vector:线程安全版ArrayList
Stack:线程安全版栈
BlockingQueue及其子类:线程安全版队列
Set即集合,该数据结构不允许元素重复且无序,Java对Set有三种实现方式:
HashSet通过HashMap实现,HashMap的Key即HashSet存储的元素。判断元素是否相等时,先比较hashcode,相同再利用equals比较。
linkedHahsSet继承自HashSet,通过linkedHashMap实现,使用双向链表维护元素插入顺序
TreeSet通过TreeMap底层实现,底层数据结构是红黑树,添加元素到集合时按照比较规则将其插入合适的位置,保证插入后的集合仍然有序,查询O(logn)
JDK8之前底层实现是数组加链表,JDK8改为数组+红黑树。主要成员变量包括存储数据的table数组、元素的数量size、加载因子loadFactor
HashMap中的数据以键值对的形式存在,键对应的hash值用来计算数组下标,如果两个元素Key的hash值一样,就会发生hash冲突,被放到同一个链表上。
table数组记录 HashMap 的数据,每个下标对应一条链表,所有哈希冲突的数据都会被存放到同一条链表,Node/Entry 节点包含四个成员变量:key、value、next 指针和 hash 值。在JDK8后链表会转化为红黑树。
若当前数据/总数据容量>负载因子(默认加载因子为0.75),Hashmap将执行扩容操作。 默认初始化容量为16,扩容容量必须是 2 的幂次方。
在JDK1.7中,HashMap采用头插法插入元素,因此在并发情况下会导致环形链表,产生死循环。
虽然JDK1.8采用了尾插法解决了这个问题,但是并发下的put操作也会使前一个key被后一个key覆盖。 由于HashMap有扩容机制存在,也存在A线程进行扩容后,B线程执行get方法出现失误的情况。
TreeMap是底层利用红黑树实现的Map结构,底层实现是一棵平衡的排序二叉树,由于红黑树的插入、 删除、遍历时间复杂度都为O(logN),所以性能上低于哈希表。但是哈希表无法提供键值对的有序输出,红黑树可以按照键的值的大小有序输出。
25.Collection和Collections有什么区别- Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如List、Set等。
- Collections是一个包装类,包含了很多静态方法、不能被实例化,而是作为工具类使用,比如提供的排序方法: Collections.sort(list);提供的反转方法:Collections.reverse(list)。
线程安全:ArrayList和linkedList都是不同步的,也就是不保证线程安全。
底层数据结构:ArrayList底层数据结构是数组;linkedList底层是双向循环链表数据结构
插入的删除是否会受元素位置影响:ArrayList采用数组存储,所以插入和删除元素的时间复杂度受元素位置影响,需要遍历的位置时间复杂度高。linkedList采用链表存储,所以插入和删除元素时间不受元素位置的影响。
是否支持快速随记访问:linkedList不支持快速随机访问,ArrayList实现了RandomAccess接口,所以支持随机元素访问。
内存空间占用:ArrayList会在列表结尾预留一定的容量空间,而linkedList则需要保留值以及后继等
- HashMap是Hashtable的轻量级实现,HashMap允许key和value为null,但最多允许一条记录的key为null. 而HashTable不允许。
- HashTable中的方法是线程安全的,而HashMap不是。在多线程访问HashMap需要提供额外的同步机制。
- Hashtable使用Enumeration进行遍历,HashMap使用Iterator进行遍历。
如果对Map进行插入、删除或定位一个元素的操作,HashMap是更好的选择。如果需要对key集合进行有序的遍历,TreeMap是更好的选择。
29.Hashcode(),equals()两种方法什么关系如果两个对象euqals,Java运行环境会认为他们的hashcode一定相等。
如果两个对象不euqals,它们的hashcode有可能相等。
如果两个对象hashcode相等,不一定equals。
如果两个对象hashcode不相等,一定不equals。
动态规划是一种编程原理,可以通过将非常复杂的问题划分为更小的子问题来解决。这个原则与递归很类似,但是与递归有一个关键点的不同,就是每个不同的子问题只能被解决一次。
什么是反射
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任何一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用方法的功能叫反射。
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝



