一个人做企业网站要多少天,上海网页制作费用,网页登录界面制作,徐州教育平台网站建设目录 面试题3.18 Java中有多少种数据结构#xff0c;分别是什么#xff1f; 面试题3.19 List、Set和Map的区别#xff1f; 面试题3.20 List遍历方式有多少种 面试题3.21 Arraylist#xff0c;Vector和Linkedlist 的区别 面试题3.22 Collection和Collections的区别 面试…目录 面试题3.18 Java中有多少种数据结构分别是什么 面试题3.19 List、Set和Map的区别 面试题3.20 List遍历方式有多少种 面试题3.21 ArraylistVector和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一个valuekey不可以重复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) { ListString names Arrays.asList(Alice, Bob, Charlie, David); // 使用forEach() Lambda表达式遍历List names.forEach(name - System.out.println(name)); }
}
面试题3.21 ArraylistVector和Linkedlist 的区别
【技术难度 2 出现频率2 】
它们都是List接口的实现类。
ArrayList
1.底层是数组查询快增删慢线程不安全效率高 2.数组初始长度10存满扩容扩到原数组1.5倍。
Vector
1.与ArrayList类似底层是数组查询快增删慢线程安全效率更低(synchronized)
2.数组初始长度10存满扩容扩到原数组2倍。
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 ComparablePerson { 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) { ListPerson 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 ComparatorPerson { Override public int compare(Person p1, Person p2) { return Integer.compare(p1.getAge(), p2.getAge()); // 按年龄排序 }
} public class Main { public static void main(String[] args) { ListPerson 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
MapStringInteger map new HashMap();
for(String key map.keySet()){System.out.println(key - map.get(key));
}
2.先调用map.entrySet()方法获取所有的entry键值对对象再从每个entry中取出key和value。
MapStringInteger map new HashMap();
for (Map.EntryStringInteger 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 】
0. 注意Hashtable的t是小写。
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若直到最后一个都是返回falsekey和value存入。 ------------------------END-------------------------
才疏学浅谬误难免欢迎各位批评指正。