目录
ArrayList和LinkedList的底层数据结构是什么?
ArrayList和LinkedList的区别?分别用在什么场景?
List是有序的吗?如何解释?
这里的有序和无序不是指集合中的排序,而是是否按照元素添加的顺序来存储对象。list是按照元素的添加顺序来存储对象的,因此是有序的。
List和Vector有什么区别?
vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随即访问,而不在乎插入和删除的效率,使用vector。
list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用list。
ArrayList和LinkedList的底层数据结构是什么?
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构
ArrayList默认大小是多少,是如何扩容的?
ArrayList初始是final修饰空数组长度0,当添加第一个元素时默认创建长度10的数组,之后扩容就是1.5倍进行扩容。
ArrayList和LinkedList的区别?分别用在什么场景?
LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。
使用场景:
(1)如果应用程序对数据有较多的随机访问,ArrayList对象要优于LinkedList对象;
( 2 ) 如果应用程序有更多的插入或者删除操作,较少的随机访问,LinkedList对象要优于ArrayList对象;
(3)不过ArrayList的插入,删除操作也不一定比LinkedList慢,如果在List靠近末尾的地方插入,那么ArrayList只需要移动较少的数据,而LinkedList则需要一直查找到列表尾部,反而耗费较多时间,这时ArrayList就比LinkedList要快。
Collection与其底下的子接口
如图:
List底下各个实现类的特点
ArrayList:大小可变的数组实现(默认容量10,扩容行1.5)
底层数据结构是数组,查询快增删慢
线程角度(执行效率):线程是不安全的,不同步的-->单线程中执行效率高
LinkedList:类似于栈结构的特点(先进后出)
存在一些特有功能:给连接列表开头添加元素addFirst()
获取链接列表的开头的元素:getFirst()
底层数据结构是连接表实现的,查询慢,增删快
线程角度(执行效率):线程不安全,不同步--->执行效率高
Vector:底层数据结构是一种对象数组,查询快,增删慢
线程角度(执行效率):线程安全-->同步-->执行效率低
List与Set的区别
list可以允许重复对象和插入多个null值,而set不允许;list容器是有序的,而set容器是无序的
如何去除ArrayList中的重复值?
第一种是不需要借助临时list,用equals方法比较ArrayList中数据,两次遍历原来list; 第二种是借助一个临时ArrayList,向临时List添加数据,调用arrayList.contains (obj)判断是否存在.
HashSet与TreeSet的区别?
HashSet 比 TreeSet 为 add , remove , contains , size 等操作提供更好的性能(更快)。 HashSet 提供恒定的时间成本,而对于这样的操作 TreeSet 提供 log (n) 时间成本。 2) HashSet 不维护任何元素顺序,而 TreeSet 元素默认按升序排序。
Map的特点?
map集合特点就是采用了 Key-value键值对映射的方式进行存储
key在Map里面是唯一的但是value可以重复,一个key对应一个value。
key是无序、唯一的
value是无序不唯一的
Map接口有两个集合HashMap和TreeMap及LinkedHashMap
HashMap采用哈希表的存储结构所以里面的数据是无序但是唯一的。(实现唯一的方式就是重写 Hashcode和equals方法)
TreeMap采用的是二叉树的存储方式里面的数据是唯一而且有序的而且一般是按升序的方式排列 (要实现comparable接口并且重写compareTo的方法用来实现它的排序)
在hashMap中放入元素的时候,它是怎么判断键重复的?
put方法
当put一对<key,value>时,先用hashCode() && equals() 判断key是否重复
如果重复则不插入
如果hashCode()为true,则会用hashCode判断在相应的位置插入key,如果这个判断的位置已经有了值了,则会调用equals()去判断是否重复,equals()为true则视为key重复不插入,若equals()为false则认为不重复,以链的形式插入
get方法
首先得到key的hashCode()去得到值存的位置,然后用equals()去一个一个比较,为true则就是相应的value,否则不是
遍历hashMap的方式?
通过ForEach循环进行遍历
mport java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) throws IOException {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, 10);
map.put(2, 20);
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
}
}
ForEach迭代键值对方式
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) throws IOException {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, 10);
map.put(2, 20);
// 迭代键
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}
// 迭代值
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
}
}
使用带泛型的迭代器进行遍历
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Test {
public static void main(String[] args) throws IOException {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, 10);
map.put(2, 20);
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
}
使用不带泛型的迭代器进行遍历
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Test {
public static void main(String[] args) throws IOException {
Map map = new HashMap();
map.put(1, 10);
map.put(2, 20);
Iterator<Map.Entry> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer) entry.getKey();
Integer value = (Integer) entry.getValue();
System.out.println("Key = " + key + ", Value = " + value);
}
}
}
通过Java8 Lambda表达式遍历
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) throws IOException {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, 10);
map.put(2, 20);
map.forEach((k, v) -> System.out.println("key: " + k + " value:" + v));
}
}