暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java面试:2021.07.23

Java面试百分百 2021-08-16
205

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. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,

提高了代码的维护性(继承保证);提高了代码的扩展性

文章转载自Java面试百分百,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论