1、sql语句查询慢一般有哪些原因?
查询速度慢会有各种原因造成,主要有以下几点:
1、没有索引或者没有用到索引。
2、I O吞吐量小,形成了瓶颈效应。
3、没有创建计算列导致查询不优化。
4、内存不足。
5、网络速度慢。
6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)。
7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)。
8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。
9、返回了不必要的行和列。
10、查询语句不好,没有优化。
2、TreeMap和HashMap的区别?
HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
1.HashMap 非线程安全 TreeMap 非线程安全。
2.两种常规Map实现
HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。
(1)HashMap(): 构建一个空的哈希映像
(2)HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射
(3)HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像
(4)HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像
TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
(1)TreeMap():构建一个空的映像树
(2)TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素
(3)TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序
(4)TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序
3.两种常规Map性能
HashMap:适用于在Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
4.总结
HashMap通常比TreeMap快(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。
3、Spring一般是单例还是多例的?
在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例)
默认情况下scope="singleton",那么该Bean是单例,任何人获取该Bean实例的都为同一个实例;
scope="prototype",任何一个实例都是新的实例;
scope="request",在WEB应用程序中,每一个实例的作用域都为request范围;
scope="session",在WEB应用程序中,每一个实例的作用域都为session范围;
注意:在默认情况下,Bean实例在被Spring容器初始化的时候,就会被实例化,默认调用无参数的构造方法。在其它情况下,Bean将会在获取实例的时候才会被实例化。
singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。
单例模式分为饿汉模式和懒汉模式:
饿汉模式 spring singleton的缺省是饿汉模式:启动容器时(即实例化容器时),为所有spring配置文件中定义的bean都生成一个实例
懒汉模式 在第一个请求时才生成一个实例,以后的请求都调用这个实例
spring singleton设置为懒汉模式:<beans default-lazy-init="true">
prototype(多例):对这个bean的每次请求都会创建一个新的bean实例,类似于new。
Spring中说的单例是相对于容器的,既在ApplicationContext中是单例的。而平常说的单例是相对于JVM的。另一个JVM可以有多个Spring容器,而且Spring中的单例也只是按bean的id来区分的。
4、HashMap和HashTable的区别?
1、线程安全性
首先,HashMap是非synchronized的,而Hashtable是synchronized的。这说明Hashtable是线程安全的,而且多个线程可以共享一个Hashtable;
而HashMap如果没有正确的同步的话,是不能被多个线程所共享的。但是,Java 5中为我们提供了ConcurrentHashMap,它是Hashtable的替代,而且比Hashtable的扩展性更好。
其次,HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的迭代器(enumerator)却不是fail-fast的。因此,当有其它线程改变了
HashMap的结构(删除或插入新的元素一个),将会抛出ConcurrentModificationException异常,但是迭代器本身的remove()方法移除元素或者其
它线程通过set()方法更改集合对象是允许的(但是,如果已经从结构上进行了修改,在调用set()方法,将会抛出IllegalArgumentException异常),
因为这并没有更改集合的“结构”。然而,这并不是一个一定会发生的行为,要看JVM。当然这个行为也是Enumeration和Iterator的区别。
2、同步和速度
由于Hashtable是线程安全的,也是synchronized的,所以在单线程环境下比HashMap要慢。如果你不需要同步且只需要单一线程的话,那么使用
HashMap性能要比Hashtable好一些。此时,HashMap是个不错的选择。
3、容纳数据
HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null值(HashMap可以存在null的键值(key)和值(value),但是Hashtable是不可以的)。
4、次序
HashMap不能保证随着时间的推移Map中的元素次序是不变的。要保持元素顺序不变,除非是LinkedHashMap。
注:如何实现HashMap的同步呢?
1 HashMap hashMap = new HashMap();
2 Map map = Collections.synchronizeMap(hashMap);
总结:
1、HashMap和Hashtable的主要区别在于:线程安全和速度。
2、尽量只在你需要完全的线程安全的时候选择使用Hashtable。
3、如果你使用的是Java 5+的话,尽量使用ConcurrentHashMap。
5、什么是多态,多态的好处。
什么是多态:
概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。
多态有两个好处:
1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,
提高了代码的维护性(继承保证);提高了代码的扩展性。




