Java的面试题

yaochen22 2010-04-02
请答得出来的朋友加msn联系
1.请问Map与Collection的关系?
2.请问equals与==的区别是什么?
3.请说明http中的forward和redirect的区别
4.线程的基本概念、线程的基本状态以及状态之间的关系
5.几种常用的数据结构及内部实现原理
6.Socket通信(TCP、UDP区别及Java实现方式)
7.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

我是猎头:
MSN:yaochen21{at}msn.com
Email:yaochen{at}renhenet.com.cn
headhunter consultant:Kevin
lyqidao 2010-04-02
yaochen22 写道
请答得出来的朋友加msn联系
1.请问Map与Collection的关系?
2.请问equals与==的区别是什么?
3.请说明http中的forward和redirect的区别
4.线程的基本概念、线程的基本状态以及状态之间的关系
5.几种常用的数据结构及内部实现原理
6.Socket通信(TCP、UDP区别及Java实现方式)
7.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

我是猎头:
MSN:yaochen21{at}msn.com
Email:yaochen{at}renhenet.com.cn
headhunter consultant:Kevin


不能完全回答出:不过我想留下自己的答案,希望来者能多提意见,互相学习互相进步!

1.Collection接口我经常使用到的有List接口和Set接口,
List接口包含LinkedList 和 ArrayList等 这些集合是有序的,
我们可以使用索引访问元素。 而Set接口上不允许包含重复元素的,比如null值。
...Map我是按字面意思理解,就是地图的意思,我们根据一定的条件去查找自己想要的值,也就是我们所说的键值对,以键查值。 Map和Collection两者我们都常用来存储数据,我个人觉得Map性能比较好!

2.equars是比较两个引用类型,比较的是对象的引用或对象逻辑上是否一致(我认为比较的是否是引用的内存地址?呵呵,要学习一下内存了);
  == 比较的值类型

3.sendRedirect 是客户端浏览处理,能看到浏览器地址的变化;
  forward 是服务器完成的重定向,浏览器地址不会发生变化。

4.线程不太了解,很少用到,但任需学习。

5.6.7. 大家努力吧 分享一下自己的答案,我不太了解。不过我相信我也能学会。
yanlei3032 2010-07-27
1.请问Map与Collection的关系?
从继承方面考虑 :没有关系。。
从存放数据方面考虑 : 两者都相当于数据桶,Map的key是Collection的子接口set的实现,Map取值的原来就如楼上所说键值对。

2,请问equals与==的区别是什么?
equals 的意思是值相等,即两者引用的对象是否符合equals方法的实现前提。 equals相等的实现原理,首先要hashcode相等,然后是重写equals方法. == 的意思的指针的引用对象相等,即引用的对象是同一个。
yanlei3032 2010-07-27
3.请说明http中的forward和redirect的区别
  forward : 只是把执行权利交给其他的servlet。对于客户端来说,它并不知情。
  redirect :先servlet发送一个地址给客户端,告诉客户端去请求这个URL地址的数据,然后客户端去调用这个URL的数据。
  引申出来的东西 : forward只能访问同一项目的资源,redirect应该可以访问多个项目的资源。
4.线程的基本概念、线程的基本状态以及状态之间的关系 。
线程,可以说是不钻资源的进程,有自己独立的运行栈,初始化->进入等待池->运行->销毁。
5.几种常用的数据结构及内部实现原理
数据结构,线型结构,树形结构,还有啥啥。。不杂的懂,java中不杂的需要。
ArrayList 的话查询多,更改少的时候会用到。
LinkList 更改频繁,查询少的时候用到。

6Socket通信(TCP、UDP区别及Java实现方式)
TCP/IP 协议 :三次握手协议,先A发数据包给B,然后B对A进行确认,然后A应该还要发一次消息给B,不记得了。。。就像网上邮寄买书差不多。
UDP协议 : 只管发,不管别人有没有受到。象国民党时期,散发报纸一样,不管别人能不能接到,扔过去就是。
JAVA中 Socket实现了TCP/IP协议 DatagramSocket实现了UDP协议。
7 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
一种继承thread类,一种是实现runable接口,主要是synchronized 实现,jdk的话还提供了一些对synchronized的包装类,好像叫Lock,不过内部实现原来还是synchronized
mnieguomin 2010-08-12
数据结构应该是:数组,堆栈,队列,链表等。。
204_lwa 2012-07-04
引用
2,请问equals与==的区别是什么?
equals 的意思是值相等,即两者引用的对象是否符合equals方法的实现前提。 equals相等的实现原理,首先要hashcode相等,然后是重写equals方法. == 的意思的指针的引用对象相等,即引用的对象是同一个。
这个说法有点问题吧。
首先==是关系运算符,它的既定实现程序员不能更改。对于对象引用,是比较它们指向的是否同一实例,也能不十分正确的说成是地址相同(实际上也是符号引用罢了),数组也一样。
而对于原生类型数据,是比较它们的值是否相等,并非比较它们的符号引用相同。
如果我们的对象不是依靠比较引用来确定是否相同的呢,那equals方法就是为这个目的而生,提供程序员很大的自由度。所有类的默认父类java.lang.Object的equals方法默认实现就是简单的比较引用是否相同。你可以根据你的需求重写此方法。

最后equals()跟hashCode()没有直接关系,之所以流传着equals()和hashCode()必须一起重写,是因为hashMap,hashTable这些集合框架类的实现所需。

重写方法要遵循如下规则:
如果a.equals(b)为true就必定有a.hashCode()==b.hashCode()为true,但反过来c.hashCode()==d.hashCode()为true时,c.equals(d)不一定为true;

如果达不到以上效果,使用hashMap这些类存储自己的实例时,会发生数据不正确问题。
这里不对实现代码分析。自己查阅相关源代码。
仗剑执法1 2013-03-06
1、map 存放的是键值关系对,成对出现,Collection 存放的是一组对象。
2、equals 比较的是object,== 比较的是值。
3、forward 是服务器自动转向新地址,并将新请求的结果返回给浏览器,redirect告诉客户浏览器重新指向这一个新的地址。
jsjzhou 2013-03-10
1.请问Map与Collection的关系?
Map是根据key映射查询value对象.通常是利用Hash的思想来达到快速查找的目标. 时间负责度通常是o(1)
Collection是一组对象的集合. 常见的Collection有List, Set, Queue.


2.请问equals与==的区别是什么?
(1)equals是Object定义的一个方法(任何子类都可以重写来实现自定义的逻辑, 按约定: 也需要重写hashCode方法).
equals方法通常用来比较对象的内容是否相等, equals方法要求满足自反, 对称和传递三个要求.
(2)==是java提供的一个操作符. 用在基本类型用于比较值是否相等, 用在引用类型用于比较对象的地址是否相等.
3.请说明http中的forward和redirect的区别
题目不是合理. http并没有forward的概念. 而是由web服务器端实现的请求转发.
(1)forward用于请求在服务器端的转发. 实现原理(以Java servlet为例)就是在Servlet A的service调用Servlet B的service方案.
在浏览器看来是一个请求.
(2)redirect是利用服务端技术和http协议Response header实现的一种请求转发. 当请求A到达服务端时, 服务器会写回重定向响应. 其中包括
一个header: Location http://xxx.yyy.com/xx.htm, 此时code为302. 在浏览器接受到该请求后, 会重新向http://xxx.yyy.com/xx.htm发
起第二次请求.

优缺点: 很简单, 可以从刷新, 请求次数上, 是否在同一个Web应用中等方面作答.


4.线程的基本概念、线程的基本状态以及状态之间的关系
线程是在现代多核处理时代充分利用处理器提高性能的技术. 线程是进程调度的基本单位, 在一个进程中, 可以有多个线程同时运行.在linux利用轻量级进程实现
线程.
线程大致分为New, Runable, Run, Blocking, Exit.
转换关系, 很简单...

5.几种常用的数据结构及内部实现原理
数组, 链表, 队列, Stack, Hash表
数组: 多数情况是由语言自身提供. 数组是一遍连续由OS分配的一片连续的区域, 它最主要的特性是可以随机访问.
链表: 链表是由N(N>=0)节点通过指针链接的一种数据结构, 在实现上又可以细分为单链表, 双链表和循环链表. 链表非常适合添加和删除频繁的场景.
队列: 一种FIFO的数据结构, 可以通过数组或链表实现.
Stack: 一种FILO的数据结构, 可以通过数组或链表实现.
Hash表: 利用hash算法来实现快速查找的数据结构. 可以利用数组或者邻接表来实现. 在Java中, 是通过邻接表来实现的.


6.Socket通信(TCP、UDP区别及Java实现方式)
Tcp: 面向链接的通信方式. 在实际通信之前, 双方通过"三步握手"建立链接.在通信完毕后, 由其中的一个或两方发起关闭链接的请求. TCP通过超时重试等技术来达到可靠性
的保证. 
UDP: 无连接的通信方式. 在传输数居前, 不需要建立链接.

UDP在可靠性上不如TCP. 但是其传输效率比较高. 

Java在TCP, UDP都是通过JNI调用本地操作系统的TCP/IP方法来实现的.



7.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
大前提: 在Java语言中.

多线程可以借助Thread类来实现.
(1)可以继承Thread类重写run方法.
(2)实现Runnable接口. 然后将Runnable接口子类的对象作为参数传递给Thread对象. 
(3)至于Callable, 据有Runnable类似的功能. 但是在线程池(ExecutorService的实现类)内部被适配成实现Runnable接口. 所以不能算作实现多线程的手段.
(4)线程池不能算作多线程的实现方式, 仅仅是利用池化的技术到达Thread重新.

同步用来保证操作的原子性和可见性. 大致分为分为一下几种实现方式:
(1) 利用Java语言提供的监视器技术. 也就是通过同步方法或同步块来实现.
(2) 利用Java提供的CAS技术(本身依赖硬件的CAS指令)来实现的同步.  Lock的子类, CountDownLatch等JDK5引入的并发类库, 都是依赖CAS来实现.

二者的区别: 在竞争比较小时, CAS在性能上比较占优势, 因为它在大部分情况下不会阻塞线程.
在竞争激烈的情况下, 监视器在性能上比较有优势. 因为避免了频繁的CAS操作.
在JDK中, 会根据实际运行情况做优化.
Global site tag (gtag.js) - Google Analytics