Java基础面试题

1.java面向对象的特征?
1. 封装,隐藏内部实现,只暴露公共行为(隐藏一切可以隐藏的,只向外界提供最简单的编程接口)
2. 继承,提高代码的重用性
3. 多态,体现现实生活中相似对象的差异性(1.方法重写 接口里面的方法/重载方法名相同,参数列表不同,与返回值无关.)
4. 抽象,抽取现实世界中相似对象的共同点(只关注对象有哪些属性和行为,不关注细节)

2.”==” 和 equals 的区别?
他们的区别主要存在在引用数据类型上
==为比较两侧的对象是否同一对象,是用内存地址来比较的

equals是方法,默认是用内存地址比较,重写后,主要是用来比较两侧的对象的值是否相同,和equals方法中的实现有关
==可以两侧都为null,但equals左侧的引用指向的对象不能空,不然有NullPointerException

除非需要比较两个引用指向的对象是同一对象,一般都使用equals方法进行比较。尤其是String之类的值对象,另外,常量尽量放在比较的左侧

3.Arraylist和LinkedList的区别?
ArrayList 和 Vector 使用了数组的实现,可以认为 ArrayList 或者 Vector 封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向

LinkedList 使用了循环双向链表数据结构。与基于数组的 ArrayList 相比,这是两种截然不同的实现技术,这也决定了它们将适用于完全不同的工作场景。

(1) 因为 Array 是基于索引 (index) 的数据结构,它使用索引在数组中搜索和读取数据是很快的。 Array 获取数据的时间复杂度是 O(1), 但是要删除数据却是开销很大的,因为这需要重排数组中的所有数。

(2) 相对于 ArrayList , LinkedList 插入是更快的。因为 LinkedList 不像 ArrayList 一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是 ArrayList 最坏的一种情况,时间复杂度是 O(n) ,而 LinkedList 中插入或删除的时间复杂度仅为 O(1) 。 ArrayList 在插入数据时还需要更新索引(除了插入数组的尾部)。

(3) 类似于插入数据,删除数据时, LinkedList 也优于 ArrayList 。

(4) LinkedList 需要更多的内存,因为 ArrayList 的每个索引的位置是实际的数据,而 LinkedList 中的每个节点中存储的是实际的数据和前后节点的位置 ( 一个 LinkedList 实例存储了两个值: Node<E> first 和 Node<E> last 分别表示链表的其实节点和尾节点,每个 Node 实例存储了三个值: E item,Node next,Node pre) 。

4.HashMap和HashTable的区别?

(1)线程同步,Hashtable线程安全,HashMap线程不安全
(2)效率问题,Hashtable效率低,HashMap效率高
(3) HashMap可以使用null作为key,Hashtable不可以使用null为key得可深内瑞
(4)HashMap使用的是新实现,继承AbstractMap,而Hashtable是继承Dictionary类,实现比较老                          啊不死拽科特(抽象类)    
(5) Hash算不同,HashMap的hash算法比Hashtable的hash算法效率高
(6)HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。因为contains方法容易让人引起误解。艾克特瑞                        in new 美身
(7)取值不同,HashMap用的是Iterator接口,而Hashtable中还有使用Enumeration接口

5.HashMap的底层结构?(数组+链表)
HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,
也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。

6.如何实现多线程
Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。
四ruai的 ran那波
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有五种,分别是synchronized、wait与notify、sleep、suspend、join
synchronized: 一直持有锁,直至执行结束
wait():使一个线程处于等待状态,并且释放所持有的对象的lock,需捕获异常。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,需捕获异常,不释放锁。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

7.java的基本数据类型其封装类
boolean(布尔型) byte(字节型) char(字节型) short(短整型) int(整型) long(长整型) float(浮点型) double(双精度浮点型)

对应的封装类分别是:

Boolean Byte Character Short Integer Long Float Double
8.接口和抽象类的区别
1. 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,

  1. 另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

  2. 还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.

9.重写和重载的区别
方法的重写Overriding和重载Overloading是Java多态性的不同表现。
重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了,而且如果子类的方法名和参数类型和个数都和父类相同,那么子类的返回值类型必须和父类的相同;如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载。Overloaded的方法

是可以改变返回值的类型。也就是说,重载的返回值类型可以相同也可以不同。

  1. Overload是重载的意思,Override是覆盖的意思,也就是重写。
  2. Overload和Override有共同之处,两个方法的方法名都必须相同,如果不同,既不构成Overload,也不构成Override。
  3. Override必须发生在父子类之间,Overload可以不在父子类之间
  4. Override的特点:
    a) 参数列表完全相同:个数相同、类型相同、顺序相同
    b) 子类的返回值不能比父类的返回值范围大
    c) 子类方法抛出的异常不能比父类方法抛出的异常范围大
    d) 修饰符只能为public、protected、friendly,不能为private
    e) 父子类方法不能使用static修饰
  5. 重载发生在同一个类或父子类之间,重载中参数列表至少满足个数不同、类型不同、顺序不同中的一个条件,不包含父子类之间的static方法

10.String /String Buffer/StringBuilder的区别
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
1. 在执行速度方面的比较:StringBuilder > StringBuffer
2. StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度就快了。
3. StringBuilder:线程非安全的
  StringBuffer:线程安全的

对于三者使用的总结:
1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区下操作大量数据 = StringBuffer

11.单例模式(手写单例 懒汉/饿汉 )

12.jvm是如何加载一个类的
1、通过一个类的全限定名获取描述此类的二进制字节流;
2、将这个字节流所代表的静态存储结构保存为方法区的运行时数据结构;
3、在java堆中生成一个代表这个类的java.lang.Class对象,作为访问方法区的入口;

13.JSP的内置对象
JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception

14.Ajax怎么用的
$.ajax({
url:””,
type:””,
data:{},
success:function(){},
datatype:””
});
url:请求地址
type:请求方式
data:传过去的数据
success:成功只后的回调函数
datatype:请求的数据类型

15.Get和Post的区别
1、get是从服务器上获取数据,post是向服务器传送数据,
2.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
3.get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
4.在进行文件上传时只能使用post而不能是get。
16.servlet的生命周期
1.加载和实例化
创建Servlet对象,通过服务器反射机制创建Servlet对象,第一次请求时才会创建。(默认)
2.初始化
调用Servlet对象的init()方法,初始化Servlet的信息,init()方法只会在创建后被调用一次;
3.服务
响应请求,调用service()或者是doGet(),doPost()方法来处理请求,这些方法是运行的在多线程状态下的。
4.销毁
在长时间没有被调用或者是服务器关闭时,会调用destroy()方法来销毁Servlet对象。

17.session和cookie的区别
cookie是存储在客户端的,session是存储在服务器端,但会在客户端保存一个sessionid来和服务端管理;session相对比较安全,一般默认有效期是30分钟,每次访问都会重新刷新有效期,可以在web.xml中配置他的有效期。
Cookie默认是随着浏览器关闭而关闭的,也可以给他设置有效时间。可以通过java的request和response来操作cookie。

18.
19.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值