基础语法
JRE与JDK的区别
- JRE(Java Runtime Environment):Java运行环境,包含JVM+基础类库
- JDK(Java Development Kit):Java 开发工具包,包含JRE+Java源码的编译器javac + 监控工具jconsole + 分析工具 + jvisualvm
== 与 equals的区别
- ==
-
- 当比较基本数据类型时,比较其值是否相等
-
- 当比较引用数据类型时,比较其引用是否相同,即比较地址值是否相同
-
- 不能比较没有父子关系的两个类
- equals
-
- JDK中的类一般已经重写了equals(), 比较的是内容
-
- 自定义类如果没有重写equals(),将调用父类的equals()方法, Object的equals方法比较使用了 this == obj
-
- 可以按照逻辑要求,重写对象的equals方法,(重写equals方法,一般需重写hashCode方法)
什么是装箱?什么是拆箱?装箱拆箱的执行过程
- 装箱:基本数据类型转化为包装器类型的过程
- 拆箱:包装器类型转化为基本数据类型的过程
- 装箱是通过包装器类的ValueOf方法实现的
- 拆箱是通过包装器类的xxxValue方法实现的
final在Java中的作用
- final修饰变量:表示为常量,须在定义的时候初始化,不能改变
- final修饰方法:不能被重写
- final修饰类:不能被继承,表示最终类
final,finally,finalize()的区别
- final 表示最终的,不可改变的。用于修饰类、方法和变量
- finally异常处理的一部分,他只能用在try - catch中
- finalize():对象被回收的时候,会被调用
final 与 static 的区别
- static
-
- 表示静态或全局,被修饰的属性和方法属于类,可以直接使用类名.静态属性/方法名访问
-
- 修饰的代码块表示静态代码块,当Java虚拟机加载类时,就会执行该代码块,只会被执行一次
-
- 修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,只会被创建一次
-
- 修饰的变量可以重新赋值
-
- static方法中不能使用this和super关键字
-
- static方法必须被实现,而不能是抽象的abstract
-
- static 方法只能被static方法覆盖
- final
-
- final修饰表示常量,一旦创建不可改变
-
- final标记的成员变量必须在声明的同时赋值,或在该类的构造方法中赋值,不可重新赋值
-
- final修饰的方法不能被重写
-
- final类不能被继承,没有子类,final类中的方法默认是final的
对于try和finally至少一个语句块包含return语句的情况
- finally语句块会执行
- finally没有return, finally对return变量的重新赋值修改无效
- try 和 finally都包含return ,return 值会以finally语句块return值为准
String对象中的replace和replaceAll的区别
- replace 方法:支持字符和字符串
- replaceAll方法:基于正则表达式的字符串替换
Java中操作字符串都有哪些类?
- String: final修饰,String类的方法都是返回new String。即对String对象的任何变化都不影响原对象,对字符串的修改操作都会生成新的对象
- StringBuffer:对字符串的操作的方法都加了synchronized,保证了线程安全
- StringBuilder:不保证线程安全,在方法体内需要进行字符串的修改操作,可以new StringBuilder对象,调用StringBuilder对象的append(), replace(), delete()等方法修改字符串
如何实现字符串的反转
- 利用字符数组
- 利用StringBuilder
- 利用递归
String类的常用的方法
- equals()
- equalsIgnoreCase()
- compareTo(): 根据字符串中每个字符的Unicode编码进行比较
- compareToIgnoreCase():
- indexOf():
- lastIndexOf()
- valueOf()
- charAt()
- concat()
- isEmpty()
- contains()
- startsWith()
- endsWidth()
- format(): 格式化字符串
- getBytes()
- getChars()
- toCharsArray()
- replace
- length
- join
- trim
普通类与抽象类的区别
- 抽象类不能被实例化
- 含有抽象方法的一定为抽象类
- 抽象方法不能被声明为静态
- 抽象方法不能用private
- 抽象方法不能用final修饰
接口与抽象类有什么区别
- 接口中不能含有构造方法,而抽象类中可以有
- 接口中没有普通成员变量,而抽象类中可以有
- 接口中的方法必须都是抽象的,而抽象类中可以含有非抽象方法
- 接口中的抽象方法只能是public类型的
- 抽象类和接口都可以包含静态成员变量,抽象类中的静态成员变量可以是任意访问权限,接口中变量默认是public static final类型
- 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类
- 接口不可以实现接口,但可以继承接口并且可以继承多个接口,用逗号隔开
javap的作用是什么?
- javap是Java class文件分解器,可以反编译,也可以查看Java编译器生成的字节码等
常见的异常类
- Throwable是异常的根类
- Throwable包含子类 错误Error和异常Exception
- Exception又分为一般异常和运行时异常
什么是反射?有什么作用
- Java反射,就是运行状态中
-
- 获取任意类的名称,package信息,所有属性,方法,注解。类型。类加载器,modifiers, 父类,现实接口等
-
- 获取任意对象的属性,并且能改变对象的属性
-
- 调用任意对象的方法
-
- 判断任意一个对象所属的类
-
- 实例化任意一个类的对象
- Java的动态就体现在反射。通过反射我们可以实现动态装配,降低代码的耦合度,动态代理等。反射的过度使用会严重消耗系统资源
- JDK中java.lang.Class类,就是为了实现反射提供的核心类之一
动态代理是什么?应用场景
- 动态代理:在运行时,创建目标类,可以调用和扩展目标类的方法
- Java中实现动态的方式:
-
- JDK中的动态代理
-
- Java类库CGLib
- 应用场景
-
- 统计每个api的请求耗时
-
- 统一的日志输出
-
- 校验被调用的api是否已经登录和权限鉴定
-
- Spring的AOP功能模块就是采用动态代理的机制来实现切面编程
怎样实现动态代理
- JDK动态代理
- CGLib动态代理
- 使用Spring aop模块完成动态代理功能
什么是Java序列化?什么情况下需要序列化
- 序列化:将Java对象转化成字节流的过程
- 反序列化:将字节流转化成Java对象的过程
- 当Java对象需要在网络上传输或者持久化存储到文件中时,就需要对Java对象进行序列化处理
- 序列化的实现:类实现Serializable接口,这个接口没有需要实现的方法。
Java跨平台运行的原理
- .java源文件要先编译成与操作系统无关的.class字节码文件,然后字节码文件通过Java虚拟机解释成机器码运行
- .class字节码文件面向虚拟机,不面向任何具体操作系统
- 不同平台的虚拟机是不同的,但它们给JDK提供了相同的接口
- Java跨平台依赖于不同系统的Java虚拟机
Java的安全性体现在哪里
- 使用了引用取代了指针,指针的功能强大,但也容易造成错误
- 拥有一套异常处理机制,使用关键字throw, throws, try, catch, finally
- 强制类型转化需要符合一定规则
- 字节码传输使用了加密机制
- 运行环境提供保障机制:字节码校验器->类装载器->运行时内存布局->文件访问限制
- 不用程序员显示控制内存释放,JVM有垃圾回收机制
类与对象的关系
- 类是对象的抽象;对象是类的具体实例
- 类是抽象的,不占用内存;对象是具体的,占用存储空间
- 类是一个定义包括在一类对象中的方法和变量的模板