1. String类为什么是final的。
主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率,可能会降低程序的性能,所以String
被定义成final。String被当做是一种基本数据类型,基础类型作为程序的基石。必须是不可继承的,这是为了安全性而考虑的
,很多java里面的类都是基于String的不可变性而设计的,例如HashSet,HashMap的key值不能重复,如果String能改变
,那么HashSet,HashMap就会出现重复的key。总结一句就是无规矩不成方圆,基础数据类型不可变是一种设计,保证了一种程序
语言的安全性和效率。
2. Spring之BeanFactory与ApplicationConText区别
联系:
1. BeanFactory和ApplicationConText都是Bean的工厂,都可以加载Bean
2. ApplicationConText继承自BeanFactory
区别:
1. BeanFactory是延迟加载,当调用getBean时才会实例化Bean,ApplicationContext
初始化的时候就创建了所有的Bean。
2. BeanFactory不支持Spring的很多插件,如:aop功能、web功能
3. ApplicationConText除了有BeanFactory的所有功能外,还支持国际化、资源访问、事件传播。
3. Class.forName和classloader的区别
1.class.forName()前者除了将类的.class文件加载到jvm中之外,
还会对类进行解释,执行类中的static块
2.而classLoader只干一件事情,就是将.class文件加载到jvm中
,不会执行static中的内容,只有在newInstance才会去执行static块。
4.为什么sql数据库 用B树索引,而不是用其他树型数据结构?
1. 从算法角度讲,平衡的二叉查找树比较次数和查找效率是高于B-Tree的。
2. 数据库索引是存储在磁盘的,当数据量很大的时候,索引也会达到几个G,而磁盘的I/O速度是远
远比不上内存的读写的,这时候磁盘的I/O的效率就非常重要了,一方面B-Tree相比于RB-Tree,
AVL-Tree更加低胖,高度低来降低磁盘的I/O效率,另外一方面利用计算机局部性原理(加载某个
内存数据时候会加载附近的数据)和预读机制(鉴于程序运行时候需要的数据比较集中)通过将每
个节点的大小设置为为页(主存和磁盘的数据交换单位,通常为4k)的大小。每个节点恰好只需要
一次磁盘的I/O,数据利用率很高。
3.B+Tree相比于B-Tree 去掉了节点的数据域,使节点有了更多的出度,非常适合外载存储。
4. B-Tree被翻译成B-树和B树2种,但都叫B树,千万不能叫B减树
5.java反射的性能优化
1.如果调用构造方法实例化对象,可以把反射获取的构造缓存起来,性能提高10倍
也可以直接用class的newInstance方式性能非常高,但是局限于newInstance只能调
用无参构造方法,因为newInstance调用的是其内部的cacheConstructor。
网友评论