Java基础巩固

107 阅读5分钟

「本文已参与「新人创作礼」活动,一起开启掘金创作之路。」

值传递和引用传递的区别:

基本类型 变量存的是值 引用类型 变量存的是实际对象的地址 实际对象存的是内容 值传递是指在调用函数时将实际参数复制一份到函数中,这样的话如果函数对其传递过来的形参进行修改, 将不会影响到实参 引用传递是指在调用函数时将对象的地址直接传递到函数中, 如果在对形参进行修改,将影响到实参的值。

== 和 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:线程中断抛出的异常