46. 集合和数组有什么区别?
集合:
长度可以发生改变
只能存储对象类型,引用类型
可以存储任意类型的对象
数组:
长度固定
可以存储基本类型,也可以存储引用数据类型
只能存储同一种类型的元素
47. 集合有多少种? 各自的特点是什么?
Collection
|--List 有序(存入和取出的顺序一致),元素可重复
|--ArrayList
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢
线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
|--Set 无序的 元素唯一
|--HashSet
|--TreeSet
48. 泛型是什么?有什么用?在哪里用?泛型有什么好处和弊端?
泛型是一种把明确数据类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的数据类型
好处:
优化了程序的设计,解决了黄色警告线的问题
把运行时期的问题提前到了编译时期间解决了
避免了强制类型转换
弊端:
让类型统一了,不能存储不同的数据类型了
49. 用迭代器遍历集合的时候,用集合修改集合有没有问题?如果有,怎么解决?
有问题,因为会出现并发修改异常
解决方法有多种,比如:
1、不通过集合修改集合,通过迭代器来修改集合 [使用ListIterator中的添加方法]
2、使用普通for循环中的size() 和 get() 方法来遍历
50. HashSet如何保证元素唯一性的呢?
底层数据结构是哈希表(散列表)。具体的是由一个元素是单向链表的数组组成
它依赖于两个方法:hashCode()和equals()方法
执行顺序:
先判断hashCode()是否相同,
如果相同
继承执行equals()方法,看其返回值
true : 元素重复,不存储
false : 元素不重复,存储
如果不同
存储
记住:
看到HashXxx结构的集合,就要知道,被该集合存储的元素要重写hashCode()和equals()方法
而且,是自动生成的
51. TreeSet底层数据结构是什么?如何保证元素的唯一性的呢?
底层数据结构是二叉树
根据比较的返回值是否是0来决定
如何保证元素的排序的呢?
A : 自然排序 元素具备比较性
让集合中被存储的元素所属的类实现Comparable接口
B : 比较器排序 集合具备比较性
在创建集合对象的时候,让构造方法接收一个Comparator接口的子类对象
自然排序和比较器排序的区别:
TreeSet构造函数什么都不传, 默认按照Comparable(接口,compareTo(T))的顺序(没有实现Comparable就报错ClassCastException)
TreeSet如果传入Comparator(接口compare(T1,T2)), 就优先按照Comparator
52. LinkedHashSet底层数据结构是什么?如何保证元素的唯一性的呢?
底层由链表和哈希表组成
链表保证有序,哈希表保证唯一
53. 什么是可变参数?
针对在写一个方法的时候,不知道具体要有多少个形式参数的时候
java提供了可变参数的用法
注意:
A : 变量其实是该数据类型的一个数组
B : 形式参数如果有多个的话,可变参数只能是最后一个
C : 数据类型要一致
54. Map和Collection集合的区别?
Map集合存储的是键值对形式的元素
Collection集合存储的是单个的元素
Map集合的键是唯一的
Collection的子接口Set集合元素是唯一的
Map集合的值是可以重复的
Collection的子接口List集合的元素是可以重复的
Map集合的数据结构仅对键有效,对值无效
Collection的数据结构针对元素有效
55. Hashtable和HashMap的区别?
HashMap 线程不安全,效率高。允许null键和null值
Hashtable 线程安全,效率低。不允许null键和null值
56. Collection和Collections有什么区别?
Collection : 是集合的顶层接口,定义了集合的通用方法
Collections : 是一个工具类,里面定义了对集合进行操作的一些常见方法
57. 什么是异常?异常有哪几种?各有什么特点?
程序出现了不正常的情况,就是异常
异常的继承体系结构:
Throwable
|--Error 严重的问题,一般我们解决不了
|--Exception
|--RuntimeException 运行时期异常,这种问题一般要修正代码
|--非RuntimeException 编译时期异常,必须进行处理,否则代码不能通过
58. throws和throw的区别?
throws
位置:
在方法()后面,跟的是类名,后面可以跟多个异常类名,并且用逗号隔开
表示抛出异常,交给调用者去处理
如果后面根据的是RuntimeException及其子类,那么,该方法可以不用处理
如果后面根据的是Exception及其子类,那么,必须要编写代码进行处理,或者调用的时候抛出
throw
位置:
在方法中,跟的对象名称。后面只能跟一个异常对象
表示抛出异常,由方法体内语句处理
如果方法中,有throw抛出RuntimeException及其子类,那么,声明上可以没有throws
如果方法中,有throw抛出Exception及其子类,那么,声明上必须有throws
59. final、finally、finalize的区别?
final:
是最终的意思,用于修饰类、变量、和方法。修饰类的时候,类是最终类,不可以被继承
修饰变量的时候,变量为常量,不可以被改变。修饰方法的时候,方法不能被重写
finally:
是异常处理的一部分,它里面的代码永远会执行(前提:jvm没退出),一般用于释放资源
finalize:
是object类的一个方法,用于垃圾处理
60. 什么是递归?使用递归需要注意哪些?
递归就是方法定义中调用方法本身的现象
递归需要注意的有:
1、递归一定要有出口,否则就是死递归
2、递归的次数不能太多,否则内存溢出
3、构造方法不能递归使用
|
|