150个选择题,我终于及格啦!,对了94了呢
大题
1、简述String对象、StringBuffer、StringBuilder 区分
string是final的,内部用一个final类型的char数组存储数据,它的拼接效率比较低,实际上是通过建立一个StringBuffer,让后台调用append(),最后再将StringBuffer toSting(),每次操作Sting 都会重新建立新的对象来保存新的值.这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的。
StringBuffer也是final,线程安全的,中采用一个char数组来保存需要append的字符串,char数组有一个初始大小,当append的字符串长度超过当前char数组容量时,则对char数组进行动态扩展,也即重新申请一段更大的内存空间,然后将当前char数组拷贝到新的位置,因为重新分配内存并拷贝的开销比较大,所以每次重新申请内存空间都是采用申请大于当前需要的内存空间的方式,这里是2倍。
StringBuilder,线程不安全。
2、多态的原理
多态就是:允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。
原理是java的后期绑定。
3、简要描述面向对象编程的思想
抽象:通过特定的实例抽取出共同的特征以后形成的概念的过程,它强调主要特征和忽略次要特征。
封装:把对象的属性和方法结合成一个独立的整体,隐藏实现细节,并提供对外访问的接口。
继承:从已知的一个类中派生出新的一个类,叫子类。子类实现了父类所有非私有化属性和方法,
并能根据自己的实际需求扩展出新的行为。
多态:多个不同的对象对同一消息作出响应,同一消息根据不同的对象而采用各种不同的行为方法。
4、反射的原理
java虚拟机运行时内存有个叫方法区,主要作用是存储被装载的类的类型信息。每装载一个类的时候,java就会创建一个该类的Class对象实例。我们就可以通过这个实例,来访问这个类的信息。
5、代理的作用和实现
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
6、hashcode和equals的用法
Java对于eqauls方法和hashCode方法是这样规定的:
如果两个对象相同,那么它们的hashCode值一定要相同;
如果两个对象的hashCode相同,它们并不一定相同(上面说的对象相同指的是用eqauls方法比较。)
一般在覆盖equals()方法的同时也要覆盖hashCode()方法,否则,就会违反Object.hashCode的通用约定,从而导致该类无法与所有基于散列值(hash)集合类(HashMap、HashSet和Hashtable)结合在一起正常运行。
7、set、map、list 的区别(尽量详细)
map:
hashmap:链地址法,大概思路:通过取key的hashCode值、高位运算、取模运算计算位置,插入位置是通过hascode和eques方法判断key是否一致
①.判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容;
②.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③;
③.判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向④,这里的相同指的是hashCode以及equals;
④.判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对,否则转向⑤;
⑤.遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历过程中若发现key已经存在直接覆盖value即可;
⑥.插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容。
treemap:TreeMap实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。如果使用排序的映射,建议使用TreeMap。在使用TreeMap时,key必须实现Comparable接口或者在构造TreeMap传入自定义的Comparator,否则会在运行时抛出java.lang.ClassCastException类型的异常。
linkedHashMap:保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。
HashTable:因为内部是采用synchronized来保证线程安全的
CocurrentHashMap:利用锁分段技术增加了锁的数目,从而使争夺同一把锁的线程的数目得到控制。
set:
HashSet:内部new了一个hashMap,添加时key放数据,value放一个内部定义的final的Object对象
LinkedHashSet:内部new了一个linkHashMap,添加时key放数据,value放一个内部定义的final的Object对象,遍历时有序
TreeSet:内部new了一个TreeMap,添加时key放数据,value放一个内部定义的final的Object对象.
list:
arraylist和linkedList(略)
copywriteList:CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里
8、实现多线程的方式
继承Thread类,重写run方法
实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
通过Callable和FutureTask创建线程
通过线程池创建线程
9、synchronized原理 .lock原理
synchronized原理
synchronized 依赖于软件层面jvm
每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:
1、如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者。
2、如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.
3.如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权。
Java SE1.6为了减少获得锁和释放锁所带来的性能消耗,引入了“偏向锁”和“轻量级锁”。
lock原理
lock无关JVM实现的,依赖于硬件层面,
使用CLH对列(什么前驱,尾部自旋,没记住)实现。原生的CLH队列是用于自旋锁,但Doug Lea把其改造为阻塞锁。
10、synchronized和lock区别
使用上:
synchronized 在成功完成功能或者抛出异常时,虚拟机会自动释放线程占有的锁;而Lock对象在发生异常时,如果没有主动调用unLock()方法去释放锁,则锁对象会一直持有,因此使用Lock时需要在finally块中释放锁;
lock接口锁可以通过多种方法来尝试获取锁包括立即返回是否成功的tryLock(),以及一直尝试获取的lock()方法和尝试等待指定时间长度获取的方法,相对灵活了许多比synchronized;
写锁来提高系统的性能,因为读锁是共享锁,即可以同时有多个线程读取共享资源,而写锁则保证了对共享资源的修改只能是单线程的。
lock可以实现公平锁
原理上:见上题
选择题
1、
深度为 h 的满二叉树是:第1层1个结点第2层2个结点第3层4个结点第4层8个结点…第h层2^(h-1)个结点,最后一层都是树叶,所以 m = 2(h-1)( 是次方的意思)结点数目 n = 1 + 2 + 4 + 8 + … + 2^(h-1) = 2^h - 1
2、
什么是跨域
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域
当前页面url | 被请求页面url | 是否跨域 | 原因 |
---|---|---|---|
http://www.test.com/ | http://www.test.com/index.html | 否 | 同源(协议、域名、端口号相同) |
http://www.test.com/ | https://www.test.com/index.html | 跨 域 | 协议不同(http/https) |
http://www.test.com/ | http://www.baidu.com/ | 跨域 | 主域名不同(test/baidu) |
http://www.test.com/ | http://blog.test.com/ | 跨域 | 子域名不同(www/blog) |
http://www.test.com:8080/ | http://www.test.com:7001/ | 跨域 | 端口号不同(8080/7001) |
为什么出现跨域
出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。
非同源限制
【1】无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB
【2】无法接触非同源网页的 DOM
【3】无法向非同源地址发送 AJAX 请求
解决方案
- https://www.cnblogs.com/smiler/p/5829621.html
- https://www.jianshu.com/p/4990f78a6fb7
- https://segmentfault.com/a/1190000017312269