Java复习面试知识点
前言:
简要的记录一下学习到的东西,仅供自己查阅和复习方便。希望该文章能对你有帮助,文章学习自博客和b站UP主的教程
集合:
集合简介:
Java标准库自带的java.util
包含了集合类:Collection
,它是除Map外所有其他集合类的根接口。Java的java.util
包主要提供了以下三种类型的集合:
List
:一种有序列表的集合,例如,按索引排列的Student的List;Set
:一种保证没有重复元素的集合,例如,所有无重复名称的Student的Set;Map
:一种通过键值(key-value)查找的映射表集合,例如,根据Student的name查找对应Student的Map。
Java集合的设计有几个特点:一是实现了接口和实现类相分离,例如,有序表的接口是List,具体的实现类有ArrayList
,LinkedList
等,二是支持泛型,我们可以限制在一个集合中只能放入同一种数据类型的元素,例如:
List<String> list = new ArrayList<>(); // 只能放入String类型
最后,Java访问集合总是通过统一的方式——迭代器(Iterator)
来实现,它最明显的好处在于无需知道集合内部元素是按什么方式存储的。
List
我们考察List<E>
接口,可以看到几个主要的接口方法:
- 在末尾添加一个元素:
boolean add(E e)
- 在指定索引添加一个元素:
boolean add(int index, E e)
- 删除指定索引的元素:
E remove(int index)
- 删除某个元素:
boolean remove(Object e)
- 获取指定索引的元素:
E get(int index)
- 获取链表大小(包含元素的个数):
int size()
- 判断List是否包含某个指定元素。
boolean contains(Object o)
。 - 返回某个元素的索引,如果元素不存在,就返回-1。
int indexOf(Object o)
通常情况下,我们总是优先使用ArrayList
。
除了使用ArrayList
和LinkedList
,我们还可以通过List
接口提供的of()
方法,根据给定元素快速创建List:
List<Integer> list = List.of(1, 2, 5);
但是List.of()
方法不接受null值
,如果传入null
,会抛出NullPointerException
异常
遍历List
List<String> list = List.of("a","b","c","d");
有三种方式遍历List
,第一种就是简单的使用for
循环和get
:
for(int i = 0; i < list.size(); i++){
System.out.println(list.get(i));
}
这种方法并不推荐。
我们应该坚持使用迭代器Iterator
来访问List。Iterator
本身也是一个对象,但它是由List的实例调用iterator()
方法的时候创建的。Iterator对象知道如何遍历一个List,并且不同的List类型,返回的Iterator对象实现也是不同的,但总是具有最高的访问效率。
Iterator对象有两个方法:boolean hasNext()
判断是否有下一个元素,E next()
返回下一个元素。因此,使用Iterator遍历List代码如下:
for(Iterator<String> it = list.iterator();it.hasNext();){
String s = it.next();
System.out.println(s);
}
由于Iterator
遍历是如此常用,所以,Java的for each
循环本身就可以帮我们使用Iterator
遍历:
for (String s:list){
System.out.println(s);
}
实际上,只要实现了Iterable接口的集合类都可以直接用for each
循环来遍历,Java编译器本身并不知道如何遍历集合对象,但它会自动把for each
循环变成Iterator
的调用,原因就在于Iterable
接口定义了一个Iterator<E> iterator()
方法,强迫集合类必须返回一个Iterator实例。
Array和ArrayList的区别
两者之间的区别:
一:空间大小
1、Array
的空间大小是固定的,空间不够时也不能再次申请,所以需要事前确定合适的空间大小。
2、ArrayList
的空间是动态增长的,如果空间不够,它会创建一个空间比原空间大0.5倍的新数组,然后将所有元素复制到新数组中,接着抛弃旧数组。而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。
二:存储内容
1、Array
数组可以包含基本类型
和对象类型
。
2、ArrayList
却只能包含对象类型
。
需要注意的是:Array
数组在存放的时候一定是同种类型
的元素。ArrayList
就不一定了,因为ArrayList
可以存储Object
。
三:方法
ArrayList
作为Array
的增强版,当然是在方法上比Array
多样化。比如添加全部addAll()
、删除全部removeAll()
、返回迭代器iterator()
等。
List和Array的转换
将List
转换成Array
有三种方法:
Object[] array1 = list.toArray();
System.out.println(Arrays.toString(array1));
System.out.println("----------------------------");
//第二种方式是给toArray(T[])传入一个类型相同的Array,List内部自动把元素复制到传入的Array中
//如果传入的数组不够大,那么List内部会创建一个新的刚好够大的数组,填充后返回;如果传入的数组比 List元素还要多,那么填充完元素后,剩下的数组元素一律填充null。
//实际上,最常用的是传入一个“恰好”大小的数组:
String[] array2 = list.toArray(new String[list.size()]);
System.out.println(Arrays.toString(array2));
System.out.println(