`

记录一下面试题,自己多学习这方面知识

阅读更多

前几天参加了阿里巴巴的电话面试,把他们问的问题都记录了下来,希望对那些正准备面试的人有用。
一、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?

参考答案:String,StringBuffer, StringBuilder 的区别
二、VECTOR,ARRAYLIST, LINKEDLIST的区别是什么?

参考答案:ArrayList,LinkedList,Vestor区别
三、HASHTABLE, HASHMAP,TreeMap区别

参考答案:HASHTABLE, HASHMAP,TreeMap区别
四、ConcurrentMap和HashMap的区别
五、Tomcat,apache,jboss的区别
六、GET POST区别
七、SESSION, COOKIE区别
八、Servlet的生命周期

参考答案:Servlet的生命周期
九、HTTP 报文包含内容
十、Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入
十一、redirect, foward区别
十二、关于JAVA内存模型,一个对象(两个属性,四个方法)实例化100次,现在内存中的存储状态,
几个对象,几个属性,几个方法。

参考答案:JAVA内存模型
十三、谈谈Hibernate的理解,一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的

参考答案:Hibernate缓存机制以及一级缓存和二级缓存的作用
十四、反射讲一讲,主要是概念,都在哪需要反射机制,反射的性能,如何优化
十五、谈谈Hibernate与Ibatis的区别,哪个性能会更高一些

参考答案:Hibernate与Ibatis的区别
十六、对Spring的理解,项目中都用什么?怎么用的?对IOC、和AOP的理解及实现原理

参考答案:spring原理
十七、线程同步,并发操作怎么控制
十八、描述struts的工作流程。

参考答案:描述struts的工作流程
十九、Tomcat的session处理,如果让你实现一个tomcatserver,如何实现session机制
二十、关于Cache(Ehcache,Memcached)
二一、sql的优化相关问题

参考答案:SQL SERVER性能优化综述
二二、oracle中 rownum与rowid的理解,一千条记录我查200到300的记录怎么查?
二三、如何分析ORACLE的执行计划?
二四、 DB中索引原理,种类,使用索引的好处和问题是什么?
二五、JVM垃圾回收实现原理。垃圾回收的线程优先级。

参考答案:JVM的垃圾回收机制详解和性能调优
二六、jvm 最大内存设置。设置的原理。结合垃圾回收讲讲。

分享到:
评论
5 楼 zhulin902 2011-03-01  
Servlet的生命周期,Servlet和CGI的区别 http://www.zlmind.com/?p=663
4 楼 zhulin902 2011-03-01  
类 HASHSET<E>

所有已实现的接口:Serializable, Cloneable, Iterable<E>, Collection<E>, Set<E>


此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

此类为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此 set 进行迭代所需的时间与 HashSet 实例的大小(元素的数量)和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。

注意,此实现不是同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:

   Set s = Collections.synchronizedSet(new HashSet(...));


类 HASHMAP<K,V>

所有已实现的接口:Serializable, Cloneable, Map<K,V>

基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。




类 CONCURRENTHASHMAP<K,V>

所有已实现的接口:

Serializable, ConcurrentMap<K,V>, Map<K,V>



支持获取的完全并发和更新的所期望可调整并发的哈希表。此类遵守与 Hashtable 相同的功能规范,并且包括对应于 Hashtable 的每个方法的方法版本。不过,尽管所有操作都是线程安全的,但获取操作不 必锁定,并且不 支持以某种防止所有访问的方式锁定整个表。此类可以通过程序完全与 Hashtable 进行互操作,这取决于其线程安全,而与其同步细节无关。



此类与 Hashtable 相似,但与 HashMap 不同,它不 允许将 null 用作键或值。
3 楼 zhulin902 2011-03-01  
刚开始看到HashTable,HashMap和TreeMap的时候比较晕,觉得作用差不多,但是到实际运用的时候又发现有许多差别的。于是自己搜索了一些相关资料来学习,以下就是我的学习沉淀。

         java为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类。Map是将键映射到值的对象,一个映射不能包含重复的键;每个键最多只能映射一个一个值。

          Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力.

          Hashtable 与 HashMap类似,但是主要有6点不同。

         1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。  

        2.HashTable不允许null值,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许 key值只能由一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。  

        3.HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。  

        4.HashTable使用Enumeration,HashMap使用Iterator。  

        5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。  

        6.哈希值的使用不同,HashTable直接使用对象的hashCode。

        TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

        下面是HashTable,HashMap和TreeMap总结的一个经典例子。

package com.taobao.luxiaoting;

import java.util.Map;  

import java.util.HashMap;  

import java.util.Set;  

import java.util.HashSet;  

import java.util.Iterator;  

import java.util.Hashtable;  

import java.util.TreeMap;  

class  HashMaps  

{  

       public static void main(String[] args)   

      {  

            Map map=new HashMap();              

            map.put(“a”, “aaa”);  

            map.put(“b”, “bbb”);  

            map.put(“c”, “ccc”);  

            map.put(“d”, “ddd”);  

             

            Iterator iterator = map.keySet().iterator();              

            while (iterator.hasNext()) {  

             Object key = iterator.next();  

             System.out.println(“map.get(key) is :”+map.get(key));  

            }        

                              

            Hashtable tab=new Hashtable();              

            tab.put(“a”, “aaa”);  

            tab.put(“b”, “bbb”);  

            tab.put(“c”, “ccc”);  

            tab.put(“d”, “ddd”);  

            Iterator iterator_1 = tab.keySet().iterator();  

            while (iterator_1.hasNext()) {  

             Object key = iterator_1.next();  

             System.out.println(“tab.get(key) is :”+tab.get(key));  

            }           

              

            TreeMap tmp=new TreeMap();              

            tmp.put(“a”, “aaa”);  

            tmp.put(“b”, “bbb”);  

            tmp.put(“c”, “ccc”);  

            tmp.put(“d”, “ddd”);  

            Iterator iterator_2 = tmp.keySet().iterator();  

            while (iterator_2.hasNext()) {  

             Object key = iterator_2.next();  

             System.out.println(“tmp.get(key) is :”+tmp.get(key));  

            }           

        }  

    }  
2 楼 zhulin902 2011-03-01  
ArrayList,LinkedList,Vestor这三个类都实现了java.util.List接口,但它们有各自不同的特性,主要如下:

一、同步性

ArrayList,LinkedList是不同步的,而Vestor是的。所以如果要求线程安全的话,可以使用ArrayList或 LinkedList,可以节省为同步而耗费开销。但在多线程的情况下,有时候就不得不使用Vector了。当然,也可以通过一些办法包装 ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低。

二、数据增长
从内部实现机制来讲ArrayList和Vector都是使用Objec的数组形式来存储的。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。

三、检索、插入、删除对象的效率
ArrayList和Vector中,从指定的位置(用index)检索一个对象,或在集合的末尾插入、删除一个对象的时间是一样的,可表示为O(1)。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行(n-i)个对象的位移操作。

LinkedList中,在插入、删除集合中任何位置的元素所花费的时间都是一样的—O(1),但它在索引一个元素的时候比较慢,为O(i),其中i是索引的位置。

所以,如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是对其它指定位置的插入、删除操作,最好选择LinkedList
1 楼 zhulin902 2011-03-01  
String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结。



在java中有3个类来负责字符的操作。

1.Character 是进行单个字符操作的,

2.String 对一串字符进行操作。不可变类。

3.StringBuffer 也是对一串字符进行操作,但是可变类。

String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");

字符串连接操作中StringBuffer的效率要比String高:

String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.

看看以下代码:
将26个英文字母重复加了5000次,

   1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
   2.         int times = 5000;
   3.         long lstart1 = System.currentTimeMillis();
   4.         String str = "";
   5.         for (int i = 0; i < times; i++) {
   6.             str += tempstr;
   7.         }
   8.         long lend1 = System.currentTimeMillis();
   9.         long time = (lend1 - lstart1);
  10.         System.out.println(time);

可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。
也就是46秒。
我们再看看以下代码

   1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
   2.         int times = 5000;
   3.         long lstart2 = System.currentTimeMillis();
   4.         StringBuffer sb = new StringBuffer();
   5.         for (int i = 0; i < times; i++) {
   6.             sb.append(tempstr);
   7.         }
   8.         long lend2 = System.currentTimeMillis();
   9.         long time2 = (lend2 - lstart2);
  10.         System.out.println(time2);

得到的结果为 16 有时还是 0
所以结论很明显,StringBuffer 的速度几乎是String 上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。不信你试试。



根据上面所说:

str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();

所以str += "here";可以等同于

StringBuffer sb = new StringBuffer(str);

sb.append("here");

str = sb.toString();

所以上面直接利用"+"来连接String的代码可以基本等同于以下代码

   1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
   2.         int times = 5000;
   3.         long lstart2 = System.currentTimeMillis();
   4.         String str = "";
   5.         for (int i = 0; i < times; i++) {
   6.             StringBuffer sb = new StringBuffer(str);
   7.             sb.append(tempstr);
   8.             str = sb.toString();
   9.         }
  10.         long lend2 = System.currentTimeMillis();
  11.         long time2 = (lend2 - lstart2);
  12.         System.out.println(time2);

平均执行时间为46922左右,也就是46秒。



总结: 如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高

相关推荐

    常见的网络技术知识面试题

    通过以上知识点的总结,我们可以看出网络技术面试题涵盖了从基础概念到高级应用的多个方面,对于准备这类面试的人来说,不仅需要对基础知识有深入理解,还需要具备一定的实践经验才能更好地应对各种实际问题。

    文思创新C++面试题

    从给定的文思创新C++面试题的内容中,我们可以提炼出多个IT领域的知识点,包括操作系统、数据库查询、Linux命令、C语言编程、时间计算、职业规划、TCP/IP协议、网络标准、Oracle数据库过程、Java与C++的对比、垃圾...

    SQL SERVER面试题

    以上是对SQL Server面试题的详细解答,涵盖了磁盘配置、集群管理、复制策略、索引优化、备份策略、数据库管理和DBA素质等多个方面,旨在全面展示SQL Server的相关知识和实际操作经验。这些问题的答案有助于面试者...

    软件架构师面试题,要求比较全面,大家可以按面试题学习准备

    在回答面试题“请描述您对软件架构的理解”时,软件架构师需要从以下几个方面来阐述自己的理解: * 软件架构的定义和特点 * 软件架构的分类和类型 * 软件架构的设计原则和方法 * 软件架构的优缺点和挑战 二、识别...

    经典SQL面试题

    经典SQL面试题 本资源摘要信息涵盖了经典SQL面试题,涉及到Student...这个经典SQL面试题涵盖了SQL基础知识、数据模型设计、数据查询和数据操作等多方面的知识点,对于候选人的SQL基础知识和实践能力提出了很高的要求。

    MFC程序员面试题

    MFC,全称为Microsoft Foundation Classes,是微软提供的...通过阅读和理解提供的MFC面试题文档,如"MFC.doc"、"MFC面试题.doc"、"MFC考试.pdf"和"mfc面试题2.doc",可以深入学习和准备这些面试问题,提高面试成功率。

    一份超级详细的Java面试题【大厂面试真题+Java学习指南+工作总结】.zip

    持续更新:由于Java技术和面试要求都在不断更新,建议学习者保持关注,随时更新自己的知识和技能。 交流与讨论:与同学或同行进行交流和讨论,分享学习心得和经验,共同进步。Java面试资源概览 一、内容概览 本次...

    大数据面试题

    综上所述,大数据面试题覆盖了Hadoop框架的多个方面,包括其核心组件HDFS和MapReduce的运作机制,配置文件的管理,集群的部署和监控,以及实际工作中MapReduce算法的应用。对于准备参加大数据相关职位面试的求职者来...

    2023最新Java面试题面试经验笔记项目

    2022java面试题、JVM面试题、多线程面试题、并发编程、Redis面试题、MySQL面试题、Java2022面试题、Netty面试题 一、内容概览 本次分享的资源涵盖了Java面试的各个方面,从基础知识到高级技术,从数据库到框架应用...

    数据分析师面试题

    数据分析师面试题通常涵盖数据库基础知识、数据分析方法及应用等多个方面,这些都是评估候选人是否具备有效处理和解析数据能力的重要标准。以下是对这些面试题的详细解释: ### 第一部分:数据库基础知识 1. **...

    Spring+Mybatis+Springboot面试试题及答案.zip

    这个压缩包中的面试试题及答案将涵盖以上各个领域的核心知识点,包括但不限于这些技术的基本原理、应用场景、优缺点以及如何在实际项目中使用。通过深入学习和理解这些内容,可以提升面试者的专业技能,增加求职成功...

    软件测试技术类面试题集

    这份面试题集不仅涵盖了理论知识,也强调了实践经验,对于准备进入或已在软件测试行业的专业人士来说,是一份宝贵的参考资料。通过深入学习和实践这些题目,可以提高自身的专业素养,提升面试成功的几率。

    数据挖掘分析面试题.docx

    数据挖掘分析面试题涉及到多个关键知识点,以下是详细解释: 1. 异常值检测:异常值(Outlier)是统计分析中的重要概念,指的是与其他观测值显著不同的数据点。识别连续型变量异常值的一种方法是Grubbs' test,这是...

    2024最新-NLP 算法工程师面试题宝典

    1. 编程语言基础 该文件夹下主要记录 python 和 c++ 的一些语言细节, 毕竟这两大语言是主流,基本是都要会的,目前还在查缺补漏中。 C++面试题 Python 面试题 2. 数学基础 ...这部分主要讲述深度学习方面的

    【BAT必备】tomcat面试题

    ### Tomcat面试题详解 #### 一、Tomcat基础知识 **1. 什么是Tomcat?** Tomcat是一款开源的Servlet容器,它实现了Servlet规范,并且提供了HTTP服务器功能。Tomcat可以作为独立的应用服务器运行,也可以与Apache等...

    php面试题及答案大全

    这份"php面试题及答案大全"提供了丰富的资源,帮助准备PHP面试的候选人强化自己的知识体系。本文将深入探讨这些面试题和答案所涵盖的重要PHP知识点。 首先,PHP是一种广泛用于Web开发的服务器端脚本语言,它的全称...

    软件测试面试题帮你度过面试

    根据给定的文件标题“软件测试面试题帮你度过面试”及描述“软件测试人员面试的重要试题,对于想从事软件的同学有极大的帮助”,本篇文章将详细解析文件中的几个关键知识点,并结合实际应用场景进行深入探讨。...

    文思面试题 软件测试

    同时,"面试题.rar"可能是更多练习题目,可以帮助你进一步巩固和提高。 总的来说,对操作系统命令的熟悉和软件测试流程的掌握是文思面试成功的关键。通过深入学习和实践,你将能够有效地展示你的专业能力,顺利通过...

    Java基础知识方面的面试题pdfJava实用源码整理learns

    这份"Java基础知识方面的面试题pdfJava实用源码整理learns"资源显然旨在帮助开发者和求职者强化Java基础知识,提高面试技能,并通过实用源码的学习进一步提升实战能力。 首先,"Java基础知识面试题"部分通常涵盖...

Global site tag (gtag.js) - Google Analytics