面试篇一:Java基础
Posted 时光编辑师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试篇一:Java基础相关的知识,希望对你有一定的参考价值。
- String、StringBuffer、StringBuilder
String s1 = "abc"; 是放在字符串常量池中,如再创建一个String s2 = "abc";s1和s2都是abc,这时s1,s2指向的是同一个内存地址。
String s3 = new String("abc"); 是在堆中创建一个对象,同时也会在字符串常量池中创建一个abc。
String s4 = new String("abc"); 仍然会在堆中创建一个新的对象。
上述s1,s2,s3,s4都为abc,字符串常量池中只会存在一个abc,但堆中会存在两个地址分别存放abc。
String s5 = s + "c"; s5在堆中,s是一个变量,故s5实际上是先创建一个StringBuffer对象,通过append拼接后,再转换成String类型赋值给s5。
String s6 = "ab" + "c"; s6在字符串常量池中
在构造过程中,会先按默认大小申请一个字符数组,当超过默认大小后,会创建一个更大的数组,并且将原来的数组复制到新的数组,丢弃旧的数组。
StringBuffer的底层有synchronize,是线程安全的。
操作少量数据,使用String
单线程下操作大量数据,使用StringBuilder
多线程下操作数据,使用StringBuffer
- 自动装箱和自动拆箱
Integer i = 1; 自动装箱,实际上是调用的 Integer.valueOf(1);
拆箱:将包装类型转换为基本类型。
int ii = i; 自动拆箱,实际上是调用 i.intValue();
- 重写@Override和重载Overload
子父类中的方法名和参数列表一样。
子类返回范围和抛出的异常不能大于父类的范围。
重载:发生在一个类中,方法名必须相同,参数类型、个数、顺序不同,方法返回值和修饰符不作要求。
- 多态
实现方式是同一个接口有不同的实现类,或者继承同一父类的各子类有不同的实现方式,各子类对象的引用指向父类或接口。
- 接口和抽象类
抽象类:用abstract修饰,抽象类可以有抽象方法和非抽象方法,一个类只能继承一个抽象类,可以new。
- 异常
Exception是程序本身可以处理的异常。如RuntimeException、NullPointException、
Error是程序无法处理的异常,表示运行过程中出现了严重的异常,如内存不够,报OutOfMemoryError。
逻辑异常:如检查不通过等的无法按照业务预期进行下去的异常,是用户造成的。
代码错误:程序bug造成的。
专有异常:出现意外情况,程序无法处理。
使用try-catch-finally进行处理
把异常抛给上层框架统一处理
如果需要try-catch异常,看情况记录日志信息。
- 反射
import java.lang.reflect.Field; import java.lang.reflect.Method; import static java.lang.Class.*; public class Redis { public void testRef() throws Exception { // 获取Class Class<?> classObj = Class.forName("com.xcj.mapper.RedisMapper"); // 创建对象 Object obj = classObj.newInstance(); // 获取私有属性 Field fieldTag = classObj.getDeclaredField("TAG"); fieldTag.setAccessible(true); String tag = (String) fieldTag.get(obj); // 获取私有方法 Method methodBook = classObj.getDeclaredMethod("declaredMethod",int.class); methodBook.setAccessible(true); Object objectBook = classObj.newInstance(); String string = (String) methodBook.invoke(objectBook,0); // 用私有的构造方法创建对象 Constructor<?> declaredConstructorObj = classObj.getDeclaredConstructor(String.class,String.class); declaredConstructorObj.setAccessible(true); Object object = declaredConstructorObj.newInstance("abc", "bcd"); } }
- 泛型
Java泛型就是把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型。
写法:
(1)泛型类:把泛型定义在类上,在用户使用该类时,显式地明确是什么类型。
public class Redis<T> { private T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } }
(2)泛型方法:
public <T> void method(T t) { System.out.println(t); }
怎么做?把类型当作是参数一样传递,<数据类型>
只能是引用类型。
public abstract class BaseDao<T> { public void add(T t){ } } public class StudentDao extends BaseDao<Student> { } public class TeacherDao extends BaseDao<Teacher> { }
为什么不用Object?获取的对象需强制转换,强制类型可错了,运行时才会报异常。
泛型不需要强制转换,运行时不会出现ClassCastException异常,我们在固定场景使用时就明确了具体类型。
- 代码更加简洁【不用强制转换】
- 程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常】
- 可读性和稳定性【在编写集合的时候,就限定了类型】
- 集合
(1)Java集合:List、Set、Map
https://www.cnblogs.com/scorpio-cat/p/12719137.html
(2)HashMap、ConcurrentHashMap数据结构、底层原理、源码分析
https://www.cnblogs.com/scorpio-cat/p/12680487.html
- MD5算法
MD5是不可逆的,不能解密,加密的结果是定长的32位。MD5既不能说是对称加密也不能说是非对称加密。MD5加密也不一定安全,我们可以通过加’盐‘来加强复杂度。加盐就是加一串比较复杂的字符串。
加密算法,可以分可逆加密,不可逆加密,可逆加密又分为对称加密与非对称加密。
(1)对称加密:只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。
加密解密过程:明文->密钥加密->密文,密文->密钥解密->明文。
(2)非对称加密:有两种密钥,公开密钥(publickey) 和私有密(privatekey) 。
如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密。
如果用私有密钥对数据进行加密,只有用对应的公开密钥才能解密。
以上是关于面试篇一:Java基础的主要内容,如果未能解决你的问题,请参考以下文章