1、set集合从原理上如何保证不重复
1)在往set中添加元素时,如果指定元素不存在,则添加成功。也就是说,如果set中不存在(e==null?e1==null:e.queals(e1))的元素e1,则e1能添加到set中。
2)具体来讲:当向HashSet中添加元素的时候,首先计算元素的hashcode值,然后用这个(元素的hashcode)%(HashMap集合的大小)+1计算出这个元素的存储位置,如果这个位置位空,就将元素添加进去;如果不为空,则用equals方法比较元素是否相等,相等就不添加,否则找一个空位添加。
2、HashMap和HashTable的主要区别是什么?,两者底层实现的数据结构是什么?
HashMap和HashTable的区别:
二者都实现了Map接口,是将惟一键映射到特定的值上;主要区别在于:
1)HashMap没有排序,允许一个null键和多个null值,而Hashtable不允许;
2)HashMap把Hashtable的contains方法去掉了,改成containsvalue和
containsKey,因为contains方法容易让人引起误解;
3)Hashtable继承自Dictionary类,HashMap是Java1.2引进的Map接口的实现;
4)Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。Hashtable和HashMap采用的hash/rehash算法大致一样,所以性能不会有很大的差异。
HashMap和HashTable的底层实现数据结构:
HashMap和Hashtable的底层实现都是数组+链表结构实现的
3、HashMap何时扩容,扩容的算法是什么?
HashMap何时扩容:
当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值---即当前数组的长度乘以加载因子的值的时候,就要自动扩容
扩容的算法是什么:
扩容(resize)就是重新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组的长度,以便能装入更多的元素。当然Java里的数组是无法自动扩容的,方法是使用一个新的数组代替已有的容量小的数组
4、Java的虚拟机JVM的两个内存:栈内存和堆内存的区别是什么?
Java把内存划分成两种:一种是栈内存,一种是堆内存。两者的区别是:
1)栈内存:在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
2)堆内存:堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
5、Java中对异常是如何进行分类的?
异常整体分类:
1)Java异常结构中定义有Throwable类。Exception和Error为其子类。
2)其中Exception表示由于网络故障、文件损坏、设备错误、用户输入非法情况导致的异常;
3)而Error标识Java运行时环境出现的错误,例如:JVM内存耗尽。
6、数据库设计中常讲的三范式是指什么?
1)第一范式1NF(域的原子性)
如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式
2)第二范式2NF(表中除主键外的字段都完全依赖主键)
第二范式是在第一范式基础上建立的。第二范式有两个重点:(1)表中必须有主键;(2)其他非主属性必须完全依赖主键,不能只依赖主键的一部分(主要针对联合主键而言)。
3)第三范式3NF(表中除主键外的字段都完全直接依赖,不能是传递依赖)
不能是传递依赖,即不能存在:非主键列A依赖于非主键列B,非主键列B依赖于主键的情况。第二范式和第三范式区分的关键点:2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。
7、Java中的线程池共有几种?
Java四种线程池
第一种:newCachedThreadPool
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。
第二种:newFixedThreadPool
创建一个指定工作线程数量的线程池
第三种:newScheduledThreadPool
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
第四种:newSingleThreadExecutor
创建一个使用单个worker线程的Executor,以无界队列方式来运行该线程。
8、volatile和synchronized区别
volatile和synchronized简介:
在Java中,为了保证多线程读写数据时保证数据的一致性,可以采用两种方式:
1)使用synchronized关键字
2)使用volatile关键字:用一句话概括volatile,它能够使变量在值发生改变时能尽快地让其他线程知道。
两者的区别:
1)volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.
2)volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.
3)volatile仅能实现变量的修改可见性,而synchronized则可以保证变量的修改可见性和原子性.
4)volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.
以上就是动力节点Java培训机构小编介绍的“精选联通java笔试题库”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习