集合面试
集合又称为对象的容器
常见的数据结构
- 数组:查询快,增删慢
- 链表:增删快,查询慢
- 双向链表:
- 哈希表:哈希值除以16取余,得到的结果作为索引放在对应的数组中。
- 两个数据除以16余数相同,比较哈希值是否相同。
- 哈希值不同,第二个数据放在第一个数据下方,构成链表数据结构
- 哈希值相同,比较内容是否相同,内容不同,构成链表结构。内容相同,不予存储。
- 两个数据除以16余数相同,比较哈希值是否相同。
Java的容器有哪些
-
Collection(单列集合): List、Set
-
Map(双列集合):HashMap
-
List:ArrayList、LinkedList、Vector
-
Set:HashSet、TreeSet
数组和集合的区别:
- 数组:数组一经创建,长度无法改变。数组能存储基础类型数据和引用类型数据
- 集合:集合长度可变。集合只能存储引用数据类型(集合存储基本数据类型存在一个自动装箱过程)
List和Set、Map的区别:
-
List:有序(存入数据和取出数据顺序相同),有索引,元素可以重复
-
Set:无序(存入数据和取出数据顺序不同),无索引,元素不能重复
-
Map:键值对形式存放数据,每一个键值对称为一个entry
- 键:无序,无下标,不允许重复
- 值:无序,无下标,可以重复
迭代器Iterator和增强for循环
-
迭代器的使用:集合对象调用iterator()方法获取一个迭代器
Collection<String > list =new ArrayList<>(); list.add("spring"); list.add("summer"); list.add("fall"); //获取集合的迭代器 Iterator<String> it=list.iterator(); //遍历集合数据 while(it.hasNext()){ System.out.println(it.next()); } -
增强for循环:是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的,它的内部原理其实是个Iterator迭代器,所以在遍历过程中,不能对集合中的元素进行增删操作。
ArrayList<String> list=new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); for(String s:list){ System.out.println(s); } -
通过迭代器或者增强for循环(for-each)遍历集合时,集合内的元素不能发生改变,否则会报并发修改异常,使用普通for循环即可解决该问题。
Iterator 和 ListIterator 有什么区别
- Iterator :可以遍历list和set集合,从前往后进行遍历。遍历期间不能对集合中的元素进行操作。
- ListIterator :只能遍历list集合,既可以向前遍历也可以向后遍历。遍历期间可以对元素进行操作。
ArrayList 和 LinkedList 的区别是什么
- ArrayList :底层数据结构是数组,有索引,查询快,增删慢。
- LinkedList :底层数据结构是双向循环链表(每个节点包含上一个元素和下一个元素的地址),查询慢,增删快。有对头节点和尾节点操作的一些方法。
HashMap的原理
HashMap使用的是hash表数据结构。(数组+链表)
- JDK1.8之后(包括1.8),当数组长度大于64,且链表长度大于8时,链表结构转换为红黑树结构。提高查询效率。
put方法
- 当向hashMap中放入元素时,会对该元素进行哈希计算。根据结果放在相应的数组位置。
- 如果第2个元素和第1个元素的哈希计算结果相同,JDK1.8之后采用尾插法,该元素放在第一个元素后面形成链表结构。如果链表长度大于8且数组长度大于64,该链表自动转换为红黑树结构。
get方法
- 当从hashMap中取数据时,会根据该数据的哈希计算结果确定所在数组位置,然后从链表头部开始向下查询,找到内容和所查找内容相同的数据。
HashSet的原理
- HashSet底层就是创建一个HashMap
- HashSet的数据存放在HashMap的key中,Value的值都为PRESENT
如何实现数组和集合之间的转换
- 数组转集合:Arrays.asList()
- 集合转数组:ArrayList中的toArray()方法。
如何遍历HashMap中的数据
- keySet():获取所有的key值,然后通过get(key)获取值
- entrySet():获取所有的entry,然后通过getKey(),getValue()获取键和值。
如何确保集合内容不能被修改。
- 通过Collections.unmodifiableCollection(list)方法。
- 使用Arrays.asList(array)把数组转换为集合。
写一个冒泡排序
public int[] sort(int[] args){
for(int i=0;i<args.length-1;i++){
for(int j=0;j<args.length-1-i;j++){
//创建一个临时变量,如果左边大于右边,互换位置
if(args[j]>args[j+1]){
int temp = args[j];
args[j]=args[j+1];
args[j+1]=temp;
}
}
}
return int[];
}
用JAVA代码实现如下要求:给定一个整数数组,要求返回其中两个整数,使得这两个整数相加能得到一个特定的结果,示例如下:
给定整数数组: nums = [2, 7, 11, 15] ,
给定特定结果: target = 9,
因为2 + 7 = 9, 因此程序返回[2, 7]
public int[] test(int[] nums, int target)
{
int a, b;
for (int i = 0; i < nums.length; i++)
{
a = nums[i];
b = target - a;
for (int j = 0; j < nums.length; j++)
{
if (i != j)
{
if (b == nums[j])
{
int[] ints = new int[2];
ints[0]=a;
ints[1]=b;
return ints;
}
}
}
}
return null;
}
创建数组的几种方式
//创建一个长度为2的空数组
int[] arr=new int[2];
arr[0]=1;
arr[1]=2;
//创建数组的时候就为其赋值
int[] arr2={1,2};
int[] arr3=new int[]{1,2};

浙公网安备 33010602011771号