网站建设 物流杭州seo整站优化
目录
面试题3.18 Java中有多少种数据结构,分别是什么?
面试题3.19 List、Set和Map的区别?
面试题3.20 List遍历方式有多少种
面试题3.21 Arraylist,Vector和Linkedlist 的区别
面试题3.22 Collection和Collections的区别
面试题3.23 Comparable接口用法 或者 comparable和comparator接口的用途? 列出他们的区别? 另一种问法,想实现些比较或排序,或统计元素的个数,要用到比较器。
面试题3.24 Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
面试题3.25 Map怎么遍历? 怎么遍历一个map?写一下
面试题3.26 怎么获取Map所有的key,所有的value
面试题3.27 HashMap与Hashtable的区别
面试题3.28 HashMap HashSet的底层实现
面试题3.18 Java中有多少种数据结构,分别是什么?
【技术难度: 3 出现频率:3 】
栈:元素是先进后出,后进先出。
队列:元素存储是排列有序的,一定保证先进的先出,后进的后出。
数组:静态数组,指定类型,固定长度,元素存储地址是连续的。
向量:动态数组,可以存储任何类型元素,动态长度,元素存储地址是连续的。
树:元素以树形结构存储,只有一个根节点。
List:是列表,有下标值,存储元素可以重复,遍历元素是有序的。
Set:是散列集(或称哈希集),无下标值,存储元素不可重复,遍历元素是无序的。
Map:是以键值对存储,一个key一个value,key不可以重复,value可以重复。
面试题3.19 List、Set和Map的区别?
【技术难度: 2 出现频率:2 】
1.List和Set是Collection的子接口,map不是;
2.List的底层是数组或链表实现,Set的底层是map,而map的底层是哈希表或红黑树。
3.List和Set以单个元素的方式存储数据,但map是键值对的方式;
4.List是有序可重复的,Set是无序不可重复的;map中hashMap无序,LinkedHashMap有序,TreeMap排序,而且key不重复,value可重复;
5.List和Set可直接使用itertator来进行遍历,map需要先获取keySet或entrySet,通过它们来遍历。
面试题3.20 List遍历方式有多少种
【技术难度: 2 出现频率:2 】
1.下标遍历;
2.Iterator遍历;
通过hasNext()方法检查序列中是否还有更多元素,以及通过next()方法获取序列中的下一个元素。
// 使用while循环遍历List集合 while (iterator.hasNext()) { // 获取下一个元素 String element = iterator.next(); // 打印元素 System.out.println(element); }
3.foreach遍历(最快)。List类的forEach() + Lambda表达式。
public class Main { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David"); // 使用forEach() + Lambda表达式遍历List names.forEach(name -> System.out.println(name)); }
}
面试题3.21 Arraylist,Vector和Linkedlist 的区别
【技术难度: 2 出现频率:2 】
它们都是List接口的实现类。
ArrayList:
1.底层是数组,查询快增删慢,线程不安全,效率高;
2.数组初始长度10,存满扩容,扩到原数组1.5倍。
Vector:
1.与ArrayList类似,底层是数组,查询快增删慢,线程安全,效率更低(synchronized);
LinkedList:
1.底层是链表,查询慢增删快,线程不安全,效率高;
2.链表无扩容机制,理论上可以无限扩容,就是直接修改节点之间关联。
面试题3.22 Collection和Collections的区别
【技术难度: 2 出现频率:2 】
1.Collection是集合类的上级接口,继承于他的接口主要有Set和List;
2.Collections是针对集合的一个工具类,提供一系列静态方法实现对各种集合的搜索(二分查找)、排序、线程安全化等操作。
面试题3.23 Comparable接口用法 或者 comparable和comparator接口的用途? 列出他们的区别? 另一种问法,想实现些比较或排序,或统计元素的个数,要用到比较器。
【技术难度: 2 出现频率: 1 】
第一层:
这两个接口一般用来实现集合内排序,Comparator相对于Comparable更加灵活,耦合度更低,Comparable不但用于排序还可用与比较本类两个对象的大小。
第二层:
Comparable接口和他的compareTo()方法
Comparator接口和它的compare()方法
Comparable接口里面有个compareTo()接口方法,当一个类的对象需要比较的时候,该类需要实现Comparable接口和他的compareTo()方法,当调用集合排序方法时,就会调用该类对象的compareTo()方法来实现对象的比较。
Comparator接口是一个比较器接口,一般定义一个匿名类实现该接口和它的compare()方法,并创建对象,传入集合排序方法中。
第三层:
Comparable接口:
public class Person implements Comparable<Person> { private String name; private int age; // 构造函数、getter和setter方法省略 @Override public int compareTo(Person other) { return Integer.compare(this.age, other.age); // 按年龄排序 } public static void main(String[] args) { List<Person> people = new ArrayList<>(); // 添加Person对象到列表中 people.add(new Person("Alice", 30)); people.add(new Person("Bob", 25)); people.add(new Person("Charlie", 35)); Collections.sort(people); // 按年龄排序 // 输出排序后的列表 for (Person person : people) { System.out.println(person.getName() + " " + person.getAge()); } }
}
Comparator接口:
public class Person { private String name; private int age; // 构造函数、getter和setter方法省略
} class AgeComparator implements Comparator<Person> { @Override public int compare(Person p1, Person p2) { return Integer.compare(p1.getAge(), p2.getAge()); // 按年龄排序 }
} public class Main { public static void main(String[] args) { List<Person> people = new ArrayList<>(); // 添加Person对象到列表中 people.add(new Person("Alice", 30)); people.add(new Person("Bob", 25)); people.add(new Person("Charlie", 35)); Collections.sort(people, new AgeComparator()); // 按年龄排序,使用Comparator // 输出排序后的列表 for (Person person : people) { System.out.println(person.getName() + " " + person.getAge()); } }
}
面试题3.24 Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
【技术难度: 2 出现频率: 2 】
1.Set里的元素是不能重复的;因为无论是HashSet还是TreeSet,其底层数据结构都不允许元素重复。
2.元素重复与否是使用equals()方法进行判断的;
3.==比较两个对象是比较对象的内存地址,equals()默认是使用==判断2个对象的内存地址是否相等,重写以后按照自定义规则比较2个对象。
面试题3.25 Map怎么遍历? 怎么遍历一个map?写一下
【技术难度: 2 出现频率:2 】
1.先调用map.keySet()方法获取所有的key,再通过这些key获取对应的value;
Map<String,Integer> map = new HashMap<>();
for(String key :map.keySet()){System.out.println(key + " - " + map.get(key));
}
2.先调用map.entrySet()方法获取所有的entry键值对对象,再从每个entry中取出key和value。
Map<String,Integer> map = new HashMap<>();
for (Map.Entry<String,Integer> entry :map.entrySet()) {System.out.println(entry.getKey() + " - " + entry.getValue());
}
面试题3.26 怎么获取Map所有的key,所有的value
【技术难度: 2 出现频率:2 】
1.Map调用keySet()方法获取所有的key值,是一个Set集合。
2.Map调用values()方法获取所有的value值,是一个Collection集合。
3.调用map.entrySet()方法获取所有的entry键值对对象,getKey() 和 getValue()。
面试题3.27 HashMap与Hashtable的区别
【技术难度:2 出现频率:2 】
1. 继承的父类不同。HashMap:继承自AbstractMap类,实现了Map接口。Hashtable:继承自Dictionary类,同样实现了Map接口。
2. HashMap不是线程安全的,Hashtable是安全的 (通过synchronized同步方法来实现,低效);
3. HashMap的key和value都允许null值,Hashtable的key和value都不允许null值(如果存入null会抛出nullpointerException);
4. HashMap数组初始长度16,扩容原数组的2倍,Hashtable数组初始长度11,扩容原数组的2倍 + 1。
5.计算hash值的方法
- HashMap:为了提高计算效率,HashMap将哈希表的大小固定为2的幂,并对key的hashCode()返回值进行二次hash(对哈希表的大小进行取模运算),以获得更好的散列效果。
- Hashtable:直接使用key的hashCode()返回值对哈希表的大小进行取模运算来计算hash值。
面试题3.28 HashMap HashSet的底层实现
【技术难度: 2 出现频率:3 】
底层数据结构:
HashSet底层就是HashMap。HashMap底层是哈希表数据结构,jdk1.8开始,哈希表等于数组加链表加红黑树(二叉树的一种),数组的初始长度16,加载因子0.75,扩容到原数组的2倍。当单向链表的节点个数大于8并且数组长度大于64时,链表转红黑树,当节点的个数小于6,红黑树转回链表。
插入函数:
调用map.put()方法时,会调用key的hashCode()方法计算哈希值,这个哈希值会经过再次计算得出最终哈希值,然后根据这个哈希值计算数组的存储下标,此时会有两种情况:
1.如果数组存储下标对应的空间没有值,key和value直接存入;Jdk1.8后在链表末尾插入。
2.如果数组存储下标对应的空间有值(单向链表或红黑树),就继续调用key的equals()方法和其中每个节点的key比较,若返回true,后面的value覆盖前面的value,若直到最后一个都是返回false,key和value存入。
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。