Java面试题简答(整理)

1、String 和StringBuffer的区别?

- String和StringBuffer都是java平台提供的两个两个类。
- String是不可变字符序列,String前面是由final修饰的,故而String修饰的字符串是不能改变的。
- 当字符序列不需要改变的时候选择用String
- 所以String是不可变字符序列
- 而StringBuffer是可变字符序列
- 因此当字符数据数据需要改变的时候使用StringBuffer`

2、抽象类和接口的区别?

- 抽象类的成员变量具有访问级别,而接口的成员变量都是public访问级别
- 抽象类可以包含字段,而接口不可以
- 抽象类可以继承接口,而接口不能继承抽象类
- 抽象类的成员可以具体实现,而接口不行
- 抽象类的子类可以选择性的的实现父类的抽象方法,而接口的子类必须全部实现

3、 运行时异常和一般异常有何异同?

- 异常表示程序运行过程中可能出现的非正常状态
- 运行时异常表示虚拟机通常操作中可能遇到的异常,是一种常见的运行错误
- java编译器要求方法必须声明或抛出可能发生的非运行时异常
- 但是并不要求必须抛出声明未捕获的运行时异常

4、hashMap和hashTable的区别?

- hashMap允许空键值,而hashTable不允许空键值
- hashMap是非同步的,hashTable是同步的,hashMap的效率高与hashTable,但是hashTable线程更加安全
- hashMap去掉了hashTable中的contians方法,但是加上了contiansKey()和contiansValue()方法
- 但是如果不想存入相同的值,可以成重写hashcode方法和equals方法
- 

5、Connection和Connections的区别?

- connection是集合类的上级接口,继承于它的接口主要有Set和List
- Connections是针对集合类的一个帮助类,它提供了一系列的静态方法实现了对各种集合的排序 搜索 和线程安全等操作

6、什么是servlet的生命周期?

1、第一种解答方式
- 在浏览器上输入请求路径
- 然后web容器截取请求路径,去容器里面找一找看有没有容器所对应的Servlet对象
- 如果没有找到对应的Servlet对象
- 然后就通过这个路径,找到这个路径所对应的完整类名,然后通过反射机制创建对象
- 调用无参的构造方法去完成实例化操作
- 完成之后,由web容器负责去调用Servlet的init()方法完成初始化操作
- 然后发一次请求web容器调用service方法进行服务,service方法自动派遣运行与请求相对应的doxxxx方法
- 当服务器决定将实例销毁的时候,web容器会调用其destroy()方法进行最后的销毁操作
- 如果找到对应的Servlet对象
- 直接掉用其service方法进行提供服务	
2、第二种解答
- Servlet被服务器实例化之后(这里通过无参的构造器进行相应的实例化)
- web容器调用其init()方法进行相应的初始化操作
- 然后发一次请求web容器就会调用service方法进行服务
- service方法自动派遣运行与请求相对应的doxxxx方法(doGet或doPost)等
- 当服务器决定将实例销毁的时候web容器会调用其destroy()方法进行最后销毁操作

7、sleep和wait的区别?

- sleep是线程(Thread)的方法,导致此线程暂停执行指点的时间,给其他线程执行的机会,
- 但是监控状态依然保持,到时候会自动的恢复。也就是说调用sleep不会释放对象锁,也就是数睡着的时候也抱着这把锁没有放开
- wait是Object类的方法,调用wait方法导致本线程放弃对象锁,进入等待此对象等待锁定池,只有针对此对象发出notify方法(或notifyAll)后
- 本线程此案进入对象锁定池获得对象的锁进入运行状态,也就是谁调用wait方法的时候没有锁住对象,必须重新获得锁之后才会进入运行状态

8、重载和重写的区别?重载的方法是否可以改变返回值的类型?

- 方法的重写和方法的重载是java多态性的不同表现
- 重写是父类与子类之间多态性的一种表现
- 重载是一个类中多态性的一种表现
- 如果子类中定义某方法与其父类有相同的名称和参数,也就是方法名相同参数列表相同,子类抛出的异常要小于等于父类锁抛出的异常,
- 子类的访问权限要大于等于父类的访问权限,子类的返回值类型要小于等于父类的返回值类型,即为重写
- 子类调用该方法的时候,将调用子类重写的方法,父类的方法将被屏蔽了,所以方法的重写又叫方法的覆盖
- 如果方法名相同,但是参数列表不相同,这被称之为重载,方法的重载是可以改变返回值的类型的

9、 error和Exception有什么区别?

- error表示恢复不是不可能,但是很困难的情况下的一种严重的问题,比如内存溢出,不可能指望程序员能处理这样的情况,也就是说程序员无法处理的情况
- exception表示一种设计或实现问题,也就是说,它表示如果程序运行正常,从不会发生的情况

10、同步和异步有何异同,在什么情况下分别使用它们?举例说明?

- 同步交互:指发出一个请求,需要等待返回后,然后才能发出下一个请求,有等待过程
- 异步交互:指发出一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待
- 区别:一个需要等待,一个不需要等待,在部分情况下,我们项目开发中都会优先的选择不需要等待的异步交互方式
- 使用同步交互的有,银行的转账系统,对数据库的保存操作等等,都会使用同步交互操作,其余的情况优先的使用异步交互

11、heap和statck有什么区别?

- 栈是一种线性集合,其添加和删除元素的操作应在同一段完成。
- 栈按照先进后出方式进行处理
- 堆是栈的一个组成元素

12、转发和重定向的相同点和不同点?

- 相同点:都可以完成资源的跳转
- 不同点:
	* 转发是request对象触发的
	* 重定向是response对象触发的
	* 转发是一次请求,浏览器地址栏上的地址不会变化
	* 重定向是两次请求,浏览器地址栏上的地址发生变化
	* 重定向的路径要加webapp的根路径
	* 转发在本项目内完成资源的跳转
	* 重定向可以完成跨app跳转资源
	* 重定向可以解决页面刷新的问题
	* 需要把参数带给下一个地址的时候用转发,不希望把参数带给下一个地址用重定向。登录系统错误的页面跳转就用重定向
- 以上就是转发和重定向的区别

13 JSP有哪些内置对象和动作?他们的作用分别是什么?

- request对象:客户的请求信息被封装到request对象中,通过它才能了解到客户的需求,然后做出响应。
- response对象:response对象包含了响应客户请求的有关信息
- session对象:session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个webApplication开始,直到客户端与服务器断开连接为止
- out对象:是向客户端输出内容的常用对象
- page对象:page对象就是指向当前JSP页面本身,有点像类中的this指针
- application对象:application对象实现了用户间数据的共享,可以存放全局变量,它开始于服务器的启动阶段,直到服务器关闭为止,在此期间,此对象将一直存在"其后内容部分略"
- exception对象:exception对象是一个例外的对象,当一个页面在运行过程中发生了例外,就产生这个对象,如果一个jSP页面要应用此对象,就必须把isErrorPage设置为true,否则无法编译
- pageContext对象:pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的session,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,他的本类名也叫pageContext
- config对象:config对象是一个在Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)

14、静态内部类和一般内部类的区别?

- 静态内部类可以不依赖于外部类实例被实例化
- 一般内部类需要在外部类实例化后才能实例化

15、JSP中动态include和静态include的区别?

- 动态include用jsp:include动作实现,它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
- 静态include用include伪码实现,定不会检查所包含文件的变化,适合包含静态页面

16、GC是什么?为什么要有GC?

- GC是垃圾收集的意思(Gabage Collection)
- 内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃。
- java提供的GC功能可以自动检测对象是否超过作用域从而达到自动回收内存的目的
- java语言没有提供释放已分配内存的显示操作方法

17、short s1=1;s1=s1+1;有什么错?

	- short s1=1;s1=s1+1;s1+1运算结果是int类型,需要强制转换类型
	
short s1=1;s1+=1;有什么错?
	- short s1=1;s1+=1;可以正确的编译
以上是答案:

18、Math.round(11.5)等于多少?Math.round(-11.5)等于多少?

- Math.round(11.5)=12
- Math.round(-11.5)=-11
- round方法返回与参数接近的长整数,参数加1/2后求floor

19、String s = new String(“xyz”);创建了几个String Object?

- 两个对象
- 一个是"xyz"
- 一个是指向"xyz"的引用对象

20、Java中有没有goto?

- goto是Java中的保留字
- 现在没有在Java中使用

21、启动一个线程是用run()还是start()?

- 启动一个线程是调用start()方法
- 使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行
- 这并不意味着线程就会立即运行,run()方法可以产生必须退出的标志来停止一个线程。

22、接口是否可以继承接口?抽象类是否可以实现接口,抽象类是否可以继承实体类?

- 接口可以继承接口
- 抽象类可以实现接口
- 抽象类可以继承实体类,但前提是实体类必须有明确的构造方法

23、List、Set、Map是否继承自Collection接口?

- List、Set是继承于Collection接口
- Map不是

24、说出数据连接池的工作机制是什么?

- JAVAEE服务器启动时会建立一定数量的连接池,并一直维持不少于此数目的池连接
- 客户端程序需要连接的时候,池驱动程序会返回一个未使用的池连接并将其标记为忙
- 如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定
- 当使用池连接调用完成后,池驱动程序将此连接表记为空闲,其他的调用就可以使用这个连接

25、abstract的Method是否可以同时是static?是否可以同时是native?是否可以同时是synchronized?

- 都不可以
- static修饰的方法是类的,重写是没有意义的
- 但接口和抽象类的方法都是要被实现类或继承类去重写的,这样就产生了矛盾
- 而native方法是隐含了实现体的,但抽象方法和接口方法是明显表明该方法是没有实现体的,这样也产生了矛盾,所以不能
- 也不能是synchronized方法的

26、数组有没有length()方法?String有没有length()方法?

- 数组没有length()这个方法,有length属性。
- String有length()这个方法

27、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?使用==还是用equals()?

- Set里的元素是不能重复的,那么用iterator()方法方法来区分重复与否。
- equals方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等
- ==用于比较引用和比较基本数据类型时具有不同的功能
- 比较基本数据类型,如果两个值相等,则结果为true
- 而在比较引用时,如果引用指向内存中的同一对象,结果为true

28、常见的runtimeException有哪些?

- ArithmeticException
- ArrayStoreException
- NullPointerException
- IllegalArgumentException
- indexOutOfBoundsException
- ClassCastException

29、是否可以继承String类?

- String类是final的故不可以继承。

30、构造器是否可以被重写?

- 构造器不能被继承,因此不能被重写
- 但是可以被重载

31、Switch能否作用在byte上,是否能作用在long上,是否能作用在String上?

- switch(exprl)中exprl是一个整数表达试
- 因此传递给switch和case语句的参数应该是int、short、char、或者是byte
- long、String都不能作用于Switch

32、try{}里面有一个return语句,那么紧跟着这个try{}后的finally{}里的code会不会被执行?什么时候被执行,在return前还是后?

- 会执行,并且在return前执行
- 解释,无论是否抛出异常,finally语句块里面的内容都会执行
- 然而若果在return后,那么方法都结束了,就不会得到执行
- 因此定是在return前执行。

33、用最有效率的方法算出2乘以8等于几?

- 2<<3 这就是相当于2乘8

34、两个对象值相同(x.equals(y)==true),但却有不同的hash code,这句话对不对?

- 不对,有相同的hash code

35、当一个对象被当做参数传递到一个方法后,此方法可以改变这个对象的属性,并可返回变化后的结果

那么这里到底是值传递还是引用传递?

- 是值传递,java编程语言只有值传递参数
- 当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用
- 对象的内容可以在被调用的方法中改变,但是对象的引用时永远不会改变的

36、当一个线程进入一个对象的一个synchronized方法后,其他线程是否可以进入此对象的其他方法?

- 不能 一个对象的一个synchronized方法只能由一个线程访问。
- 但是可以访问其它非synchronized的方法

37、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

- 多线程有两种实现方法
	* 分别是从Thread类继承
	* 和实现Runnable接口(推荐使用后者,因为实现接口还可以继承,毕竟java不支持多继承)
- 同步实现方面有两种
	* 分别是synchronized和wait与notify或notifyAll
- 以上就是其异同

38、什么是Servlet?

- Servlet是由sun公司制定的一套规范
- Servlet是一种服务端的java应用程序

39、Java中的异常处理机制的简单原理和应用?

- 当java程序违反了java的语义规则时,java虚拟机就会将发生的错误表示为一个异常。
- 违反语义的规则包括两种情况,一种是java类库内置的语义检查
- 例如数组下标越界,会引发indexOutOfBoundsException
- 访问null对象时会引发NullPointerException
- 另一种情况就是Java允许程序员扩展这种语义检查
- 程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常
- 所有的异常都是java.lang.Thowable的子类

40、请说出你所知道的线程同步的方法?

- wait()使一个线程处于等待状态,并且释放所持有的对象的锁
- sleep()使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InerruptedException异常
- notify()唤醒一个处于等待状态的线程,注意在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程
- 而是由java虚拟机确定唤醒那个线程,而不是按优先级
- notifyAll()唤醒所有处于等待状态的线程,注意并不是给所有唤醒线程一个对象锁,而是让他们竞争。

41、你所知道的集合有哪些?主要方法?

- 最常用的集合类是LIst和Map
- List的具体实现包括ArrayList和vector,他们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表
- List适用于按数值索引访问元素的情形
- Map集合类用于存储元素对(称为键值对),其中每个键映射到一个值

42、char变量中能不能存储一个中文汉字?为什么?

- 能够定义成为一个中文的,因为java中以Unicode编码,一个char占16个字节,所以放一个中文是没问题的

43、Get请求和Post请求的区别?

- 什么情况下浏览器发送的请求是Get请求?什么情况下浏览器发送的请求是Post请求?
- 只有当使用表单form,并且将form标签的method属性设置为method="post"
- 才是Post请求,其余剩下的所有请求都是基于Get方式的
	* Get请求和Post请求的区别?
		- Get请求在请求行上提交数据,这种提交方式最终提交的数据会显示到浏览器的地址栏上
		- Post请求在请求体中提交数据,相对安全,这种提交方式最终不会再浏览器上显示
		- Post请求在请求体中提交数据,所以Post请求提交的数据没有长度的限制【Post可以提交大数据】
		- Get请求在请求行上提交数据,所以Get请求提交的数据长度有限
		- Get请求只能提交字符串数据,Post请求可以提交任何类型的数据,包括视频...,所以文件上传必须使用Post请求
		- Get请求最终的结果,会被浏览器缓存收纳,而Post请求最终结果不会被缓存
- 以上是Get和Post的总结

44、Get请求和Post请求应当如何选择使用?

- 有敏感数据,必须使用Post
- 传输数据非常多,使用Post
- 传输数据不是普通字符串,必须使用Post
- Get请求多数情况下是从服务器中读取资源,这个读取的资源在短时间之内不会发生变化,所以Get请求最终会被浏览器缓存起来
- Post请求是为了修改服务器端的资源,而每一次修改的结果是不同的,最终结果没必要被浏览器缓存
- 浏览器将资源缓存之后,缓存资源和某个特定的路径绑定在一起,只要浏览器在发送这个相同的请求路径
- 这个时候会去缓存中获取资源,不在访问服务器,以这种方式降低服务器的压力,提高用户体验,但是有时候我们不希望走缓存
- 希望每一次都访问服务器,可以在请求路径后添加时间戳。

45、cookie和session的区别?

第一种方式解答
- sessin是在服务器端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中
- Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现session的一种方式

第二种解答
- session在服务器端,cookie在客户端(浏览器)
- session被默认存在服务器的一个文件里(不是内存)
- session的运行依赖session id 而session id 是存在cookie中的,
- 也就是说如果浏览器禁用了cookie,同时session也会失效(但是可以同过其他方式是实现,比如在url中传递session_id)
- session 可以放在文件,数据库,或内存中都可以
- 用户验证这种场合一般会用session,因此维持一个会话的核心就是客户端的唯一标识,即session_id

46、为什么当前会话的每一次请求都可以湖区到属于自己的会话对象?即session的实现原理?

- 打开浏览器,在浏览器上发送首次的请求
- 服务器会创建一个HttpSession的对象,该对象代表一次会话
- 同时生成HttpSession对象对应的Cookie对象,并且cookie对象的name是JSessionid,cookie的value是32位长度的字符串。
- 服务器将cookie的value和HttpSession对象绑定到session列表中
- 服务器将Cookie完整的发送给浏览器客户端
- 浏览器客户端将cookie保存到缓存中
- 只要浏览器不关闭,cookie不会消失
- 当再次发送请求的时候,会自动的提交缓存中的cookie
- 服务器收到cookie,验证cookie的name确实是:Jsessionid 然后获取该cookie的value
- 通过cookie的value去session列表中检索对应的HttpSession对象

47、浏览器禁用cookie会出现什么问题?怎么解决?

- 浏览器禁用cookie,则浏览器缓存中不再保存cookie
- 导致同一个会话中,无法获取到对应的会话对象
- 禁用cookie之后,每一次获取的会话对象都是新的
- 浏览器禁用cookie之后,若还想拿到对应的session对象,就必须使用URL重写机制,怎么重写
- 就是在原网站后面添加jsessionid,也会是类似原来的cookie
- 重写URL会给编程带来难度和复杂度,所以一般的web站点不建议禁用cookie,建议浏览器开启cookie

48、浏览器关闭之后,服务器对应的session会被销毁吗?为什么?

- 浏览器关闭之后,服务器不会销毁session对象
- 因为B/S构架的系统是基于HTTP协议,而HTTP协议是一种无连接,无状态协议
- 什么是无连接/无状态?
- 请求的瞬间浏览器和服务器之间的通道是打开的,请求结束之后,通道关闭
- 这样做的目的是降低服务器的压力

49、session对象在什么时候被销毁?

- web系统引入了session超时的概念。
- 当很长一段时间(这个时间可以配置)没有用户访问session对象,此时session对象超时,web服务器自动回收session对象

50、如何实现Servlet的单线程模式

-<%@page isThreadSafe="false"%>

52、页面对象传递的方法?

- request
- session
- application
- cookie等

53、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

- 相同点
- JSP是Servlet技术的扩展,本质上是Servlet的简易方式,
- 更强调应用的外表表表达式,JSP编译后是“类Servlet”
- 不同点 
- Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在java文件中,并且完全从表示层中的HTML里分离开来
- 而JSP的情况是java和HEML可以组合成一个扩展名为.jsp的文件。
- jsp主要是用于页面展示
- Servlet主要是用于业务逻辑的处理

65、四种会话跟踪技术是?

- cookie
- url重写
- session
- 隐藏域

66、jsp的四种范围

- page是否代表与一个页面相关的对象和属性,一个页面由一个编译好的java Servlet类
- (可以带有任何的include指令),但是没有include动作表示。
- 这即包括Servlet又包括被编译成Servlet的JSp页面
- request是代表与web客户机发出的一个请求相关的对象和属性,一个请求可以跨越多个页面,设计多个web组件(由于forWord指令和include动作的关系)
- session是代表与用于某个web客户机的一个用户体验相关的对象和属性。一个web会话可以跨越多个客户机请求
- application是代表与整个web应用程序相关的对象和属性。这实质是跨越整个web应用程序,包括多个页面,请求和会话是一个全局作用域

67、J2EE是技术还是平台还是框架?

- J2EE本身是一个标准
- 一个为企业分布式应用的开发提供标准的平台
- J2EE也是一个框架,包括JDBC、JNDI、RMI、JTA等技术

68、TCP和和HTTP的区别?

- 在客户端和应用服务器之间建立TCP连接之后,就需要HTTP协议来传输数据了,HTTP协议简单来说还是 请求 确认 连接。
- 总体就是客户端发送一个http请求给服务器,服务器收到这个HTTP请求,然后返回给客户端http响应,然后浏览器把这些数据渲染成
- 成了网页,展现在用户面前。
- TCP是底层通讯协议,定义的是数据传输和连接方式的规范,
- HTTP是应用层协议,定义的是传输数据内容的规范
- HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP
- TCP/IP是网络中使用的使用的基本的通信协议
- TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如远程登录,文件传输
- TCP协议和IP协议是保证数据完整传输的两个基本的重要协议
- 通常说TCP/IP是interent协议族,而不是单单的TCP和IP

69. hashtable跟hashmap的区别

hashtable是线程安全的,即hashtable的方法都提供了同步机制;hashmap不是线程安全的,即不提供同步机制 ;hashtable不允许插入空值,hashmap允许!

70. 多线程并发修改一 个 集合 怎么办

用老的Vector/Hashtable类

71.线程安全类

在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许许多多非线程安全的类。 下面是这些线程安全的同步的类:
vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
statck:堆栈类,先进后出
hashtable:就比hashmap多了个线程安全
enumeration:枚举,相当于迭代器
除了这些之外,其他的都是非线程安全的类和接口。

72.IOC:控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制;第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系。他们的依赖关系只在使用的时候才建立。简单来说就是不需要NEW一个对象了。

AOP:面向切面,是一种编程思想,OOP的延续。将系统中非核心的业务提取出来,进行单独处理。比如事务、日志和安全等。这个简单来说就是可以在一段程序之前或者之后做一些事。
Spring 的AOP和IOC都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。
不过AOP和IOC并不是spring中特有的,只是spring把他们应用的更灵活方便

73.基本数据类型的默认值

基本类型 默认值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char ‘\u0000’
boolean false

74.java中基本数据类型和引用数据类型各有什么特点

一、从概念方面来说
基本数据类型:变量名指向具体的数值引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值
二、从内存构建方面来说
基本数据类型:变量在声明之后java就会立刻分配给他内存空间
引用数据类型:它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。
三、从使用方面来说
基本数据类型:使用时需要赋具体值,判断时使用“==”号
引用数据类型:使用时可以赋null,判断时使用equals方法

75.Collection 和 Collections的区别。

Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。
List, Set, Map是否继承自Collection接口? List,Set是 Map不是
ArrayList和Vector的区别。
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
HashMap和Hashtable的区别
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

发布了7 篇原创文章 · 获赞 0 · 访问量 607

猜你喜欢

转载自blog.csdn.net/jieruis/article/details/105068222