「本文已参与「新人创作礼」活动,一起开启掘金创作之路。」
值传递和引用传递的区别:
基本类型 变量存的是值 引用类型 变量存的是实际对象的地址 实际对象存的是内容 值传递是指在调用函数时将实际参数复制一份到函数中,这样的话如果函数对其传递过来的形参进行修改, 将不会影响到实参 引用传递是指在调用函数时将对象的地址直接传递到函数中, 如果在对形参进行修改,将影响到实参的值。
== 和 equals 区别是什么
前者对于基本类型来说 是 值是否相等 对于引用类型说是判断两边的引用是否相等 是否指向同一个地址 x.equals(null) 必须返回 false 写成 null.equals(x) 不会报错
equals比较顺序:
先比较引用 之后比较是否是String的实例 在比较长度,最后挨个字符比较
不可变对象
1.内部属性都是final
2.内部属性都是private
3.不提供修改内部状态的方法,setter方法当然也不行
4.不能被继承和扩展 (可以通过反射来对其内部的属性和值进行修改,不过一般我们不这样做)
static 关键字是干什么用的?
1.修饰变量:直接通过 “类.变量名”去使用,不需要通过实例话对象之后在去调用
2.修饰方法:直接通过 “类.方法名”去使用,在静态方法内不能使用非静态属性和方法
3.可以和单例模式一起使用,通过双重检查锁来实现线程安全的单例模式
final 关键字是干什么用的?
1.修饰类:表示这个类不能被继承,也就是不能被extends
2.修饰变量:修饰的变量不能被改写,可以用来保护只读数据,尤其是在并发编程中, 因为明确的不能再为 final 变量进行赋值,有利于减少额外的同步开销
3.修饰方法:final 修饰的方法不能被重写 (和 Java 程序性能优化没有必然联系)
抽象类和接口的区别是什么?
相同点: 都允许方法的定义,而不是需要具体方法的编写,都允许被继承
不同点: 在接口中,只允许进行方法的定义,不允许有方法的实现, 抽象类是可以进行方法的定义和实现, 类中只允许进行方法的实现 接口中定义的变量只能是公共的静态常量,抽象类中的变量是普通变量
重写和重载的区别?
子类重写父类的方法一般使用 @override 来表示 重写后的方法其方法的声明和参数类型、顺序必须要与父类完全一致; 重载是针对同一类中概念,它要求重载的方法必须满足下面任何一个要求: 方法参数的顺序,参数的个数,参数的类型任意一个保持不同即可。
HashMap 和 HashTable 的区别
相同点: 都是基于哈希表实现,都是key-value键值对 都实现了 Map、Cloneable、Serializable 接口
不同点: HashMap 继承了 AbstractMap 类,而 HashTable 继承了 Dictionary 类 HashMap 允许空的 key 和 value 值,HashTable 不允许空的 key 和 value 值 HashMap 不是线程安全的 HashTable 本身就是线程安全的容器
HashMap 和 HashSet 的区别
HashSet 继承于 AbstractSet 接口,HashSet 不允许集合中出现重复的值。底层其实就是 HashMap 所以 HashSet 也不保证集合的顺序,也不是线程安全的容器。
Arrays.asList 获得的 List 应该注意什么
转换完成后的 List 不能再进行结构化的修改,也就是不能再进行任何 List 元素的增加或者减少的操作
Collection 和 Collections 的区别
Collection 是集合类的父类,只定义一节标准方法比如说 add、remove、set、equals 等,
具体的方法由抽象类或者实现类去实现 Collections 是集合类的工具类,sort 方法,reverse 反转, fill,使用指定元素替换指定列表中的所有元素。
int 和 Integer 的区别
int 是 Java 中的基本数据类型,一个 int 占 4 字节,也就是 32 位,
int 的初始值是默认值是 0 ,int 在 Java 内存模型中被分配在栈中,
int 没有方法 Integer 是 Java 中的基本数据类型的包装类,
Integer 是一个对象, Integer 可以进行方法调用,Integer 的默认值是 null,
Integer 在 Java 内存模型中被分配在堆中。
int 和 Integer 在计算时可以进行相互转换, int -> Integer 的过程称为 装箱,Integer -> int 的过程称为 拆箱, Integer 还有 IntegerCache ,会自动缓存 -128 - 127 中的值
如何决定使用 HashMap 还是 TreeMap?
需要得到一个有序的结果时就应该使用TreeMap 因为HashMap中元素的排列顺序是不固定的 除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。
几种常用的异常
NullPointerException: 空指针异常
NoSuchMethodException:找不到方法
IllegalArgumentException:不合法的参数异常
IndexOutOfBoundException: 数组下标越界异常
IOException:由于文件未找到、未打开或者I/O操作不能进行而引起异常
ClassNotFoundException :找不到文件所抛出的异常
NumberFormatException:字符的UTF代码数据格式有错引起异常;
InterruptedException:线程中断抛出的异常