本文记录一些我面试中遇到的问题。
一、什么是集合
假如某个类具有很多相同类型的属性,比如学生类,学生要选课,学生就具有很多类型的课程属性,但每个学生选择的课程类型和数量是不一样的。因此用一种容器,把所有类型的课程都放到这个容器中,将这个容器整体作为学生类的一个属性,这个容器就是Java中的一些集合。
Java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象。
二、集合的作用
(1)在类的内部,对数据进行组织;
(2)简单而快速的搜索大数量的条目;
(3)有的集合接口,提供了一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关元素;
(4)有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型。
三、集合与数组的对比:为何选择集合而不是数组
(1)数组长度固定,集合长度可变;
(2)数组只能通过下标访问元素,类型固定,而有的集合可以通过任意类型查找所映射的具体对象。
四、Java集合框架体系结构
两大家族
(1)Collection接口(增删改查):有三个子接口,存储的是一个一个独立的对象。
(a)List:排列有序的,可以重复的。实现类:ArrayList,LinkedList。ArrayList底层是由数组实现的。
(b)Queue:排列有序的,可以重复的。实现类:LinkedList。
(c)Set:无序,不可以重复。实现类:HashSet.(散列存放)。
(2)Map接口:实现类:HashMap。Map类的内部以一个<Key,Value>两个对象为一个映射去存储数据,这样一个映射就是Entry类的实例(Map中的键值对以Entry类型的对象实例形式存在)。Entry类是Map类的一个内部类,称作键值对。Key和Value可以是任意类型的对象。 HashMap基于哈希表实现,HashMap中的Entry对象是无序排列的。Key和Value值都可以为null。
五、什么是元祖
列表(用方括号表示列表)是可以修改的,而不可变的列表被称作元祖。元祖看起来像列表,但使用圆括号而不是方括号来标识。定义元祖后,就可以使用索引来访问其元素,就像访问列表元素一样。试图修改元祖的操作是被禁止的。 但可以给存储元祖的变量赋值。
六、字典
在python中,字典用放在花括号{ }中的一系列键—值对表示。与键相关联的值可以是数字、字符串、列表乃至字典。可将任何python对象用作字典中的值。键和值之间用冒号分隔。注意:键值对的排列顺序与添加顺序不同。
七、Java中的所有类都是继承自Object类
(1)在Object类中定义了equals()方法,equals(Object obj) ,判断两个对象是否相等。
当调用List的contains(obj)方法时,相当于遍历List中的每一个元素,然后再调用每一个元素的equals方法,去和contains方法里的参数进行比较,如果有一个元素的equals方法返回true值,那么这个contains方法也就返回true值。
(2)在Object中还定义了hashcode()方法,返回对象hash码的值。
当调用hashSet的contains(obj)方法时,其实是先调用每个元素的的hashcode方法来返回哈希码,如果哈希码相等的情况下,再调用equals方法,判断是否相等。只有在这两个方法都返回的值是相等的情况下,才认定这个hashSet包含某个元素。
八、多态
可以将一个子类的对象赋值给超类变量。
Employee e;
e=new Employee(...);
e=new Manager();
在JAVA语言中,对象变量是多态的,一个Employee变量既可以引用一个Employee类对象,也可以引用Employee类的任何一个子类的对象,如Manager。
这样多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。
九、成员变量和局部变量的区别
(1)在内存中的存储方式看:成员变量如果被static修饰,是属于类的,如果没有被static修饰 ,成员变量是属于实例对象的。对象存在在堆内存中,而局部变量存在于栈内存。
(2)语法形式上看:成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。
十、HashMap工作原理,hascode()讲解,扩容机制
(1) HashMap工作原理: HashMap内部实现是一个桶数组,每个桶中存放着一个单链表的头结点。其中每个结点存储的是一个键值对整体(Entry),HashMap采用拉链法解决哈希冲突。由于哈希是一种压缩映射,换句话说就是每一个Entry
节点无法对应到一个只属于自己的桶,那么必然会存在多个Entry
共用一个桶,拉成一条链表的情况,这种情况叫做哈希冲突。
(2)什么是哈希冲突,如何解决哈希冲突: 频繁产生哈希冲突最重要的原因就像是要存储的Entry太多,而桶不够。因此,当HashMap
中的存储的Entry
较多的时候,我们就要考虑增加桶的数量,这样就会大大缓解哈希冲突。
(3)什么时候扩容:当HashMap中包含的Entry
的数量大于等于threshold = loadFactor(装载因子) * capacity(容量)
的时候,且新建的Entry
刚好落在一个非空的桶上,此刻触发扩容机制,将其容量扩大为2倍。
(4)如何扩容:扩容的时候,数组长度增加一倍,那么原来根据key值计算出的对应的数组下标会改变,那么扩容的时候该如何考虑key值对应的新的数组下标?计算rehash,判断扩容的时候是否需要重新计算hash值,将此值作为参数传入到transfer方法中。通过transfer方法将旧数组中的元素复制到新数组,该过程中如果需要重新计算hash值就重新计算,然后根据indexfor()方法计算索引值。
十一、Comparable接口和Comparator接口
(1)comparable接口是出自java.lang包,它有一个 compareTo(Object obj)
方法用来排序。
(2)comparator接口是出自 java.util 包,它有一个compare(Object obj1, Object obj2)
方法用来排序。
另外,java.lang提供了Java编程的基础类,例如 Object、Math、String、StringBuffer、System、Thread等,不使用该包就很难编写Java代码了。java.util 提供了包含集合框架、遗留的集合类、事件模型、日期和时间实施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。
十二、海量数据处理:
海量数据处理求前N大,用最小堆;求前N小,用最大堆。
原因:我们考虑从10000万个数里选出前100个最大的数据。若选用最大堆的话,堆顶是堆的最大值,假若真不巧,我开始的前100个数据中已经有这10000个数据中的最大值了,那对于我后面剩余的10000-100的元素再想入堆是不是入不进去了!所以,选用最大堆从10000万个数里选出前100个最大的数据只能找出一个,而不是100个。那如果选用最小堆的数据结构来解决,最顶端是最小值,再次遇到比它大的值,就可以入堆,入堆后重新调整堆,将小的值去掉。这样我们就可以选出最大的前K个数据了。
十三、python中单引号,双引号,三引号的区别
https://blog.youkuaiyun.com/woainishifu/article/details/76105667
十四、python中创建字典都有哪些方式
https://blog.youkuaiyun.com/u011089523/article/details/60144772
十五、数据库三大范式
第一范式 :强调的是列的原子性,即列不能够再分成其他几列。
第二范式;在第一范式的基础上,另外包含两部分内容:一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
第三范式:基于第二范式,非主键列必须直接依赖于主键,不能存在传递依赖。
十六、C++语言的三大特性,其中多态中的动态绑定底层是怎么实现的
https://blog.youkuaiyun.com/Hackbuteer1/article/details/7475622
https://blog.youkuaiyun.com/qq_39412582/article/details/81628254
十七、所了解的排序算法,桶排序的应用
十八、最小二乘法
十九、python中的垃圾回收机制
https://zhuanlan.zhihu.com/p/62282961
Java中的垃圾回收机制:
https://blog.youkuaiyun.com/justloveyou_/article/details/71216049
Java内存模型:
https://blog.youkuaiyun.com/justloveyou_/article/details/71189093
二十、给定一个有序的int数组 letters 和一个int target,要求找出 letters 中大于 target 的最小数字,如果找不到就返回数组中第 1 个数字。
二十一、翻转子串
假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。
给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。
测试样例:
"Hello world","worldhello "
返回:false
"waterbottle","erbottlewat"
返回:true
二十二、Java中创建线程的方法
https://blog.youkuaiyun.com/longshengguoji/article/details/41126119
二十三、Java中如何将数组转化为List
https://blog.youkuaiyun.com/kingzone_2008/article/details/8444678
二十四、线程都有哪些状态
https://www.jianshu.com/p/30f21c578381
https://blog.youkuaiyun.com/pange1991/article/details/53860651
二十五、Java中的泛型
https://www.runoob.com/java/java-generics.html
二十六、线程安全
https://blog.youkuaiyun.com/ghevinn/article/details/37764791
如何保证线程安全性:
https://blog.youkuaiyun.com/weixin_40459875/article/details/80290875
二十七、Python中字典都有哪些方法
https://www.runoob.com/python3/python3-dictionary.html
二十八、Python中生成器
https://www.runoob.com/python3/python3-iterator-generator.html
二十九、Java中synchronized关键字
https://blog.youkuaiyun.com/javazejian/article/details/72828483
三十、HashMap在扩容过程中,如果新来一个要插入的对象,那么插在哪里
三十一、对一个类中的方法进行重载,如果只是返回值类型不同,那么会报错吗
三十二、红黑树的性质
三十三、ArrayList和LinkedList的区别,ArrayList的初始大小
三十四、线程间的通信方式
https://www.cnblogs.com/hapjin/p/5492619.html
进程间的通信方式
http://www.xitongzhijia.net/xtjc/20171024/109869.html
三十五、利用tensorflow输出1+1=2
三十六、利用Java写一个不同类型变量之间求和的函数
三十七、Python中程序总是在if __name__=="__main__":这句中开始执行的吗
http://blog.konghy.cn/2017/04/24/python-entry-program/
三十八、Q Learning算法假如有N个状态,那么该算法的时间复杂度是多少。Q learning 训练到什么时候终止。
http://papers.nips.cc/paper/7735-is-q-learning-provably-efficient
三十九、若干二元组,比如(1,3),(2,5),(7,8)....,进行合并输出。如果有重叠,则进行合并。比如上面的例子输出为(1,5)(7,8)。请写一段程序实现以上功能。
四十、Python中的浅复制和深复制
四十一、动态规划和贪心算法的区别
四十二、static关键字的用法
四十三、栈和队列的区别
https://blog.youkuaiyun.com/bbc955625132551/article/details/72773285
四十四、Java中访问修饰符的用法
https://www.runoob.com/java/java-modifier-types.html
四十五、写一个单例模式
四十六、软件的生命周期
https://baike.baidu.com/item/%E8%BD%AF%E4%BB%B6%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F
四十七、int和Integer的区别,比如:
Integer a=1;
Integer b=1;
int a=1;
判断:
a==b;
a==c;
c==a;
https://blog.youkuaiyun.com/Kinger0/article/details/47948025
https://blog.youkuaiyun.com/sunhuaqiang1/article/details/51958618
https://blog.youkuaiyun.com/sunhuaqiang1/article/details/51958714
四十八、Java中collection和collections的区别
https://blog.youkuaiyun.com/snipergzf/article/details/53368685
四十九、线程池的理解
https://blog.youkuaiyun.com/weixin_40271838/article/details/79998327