面试题总结1

1.面向对象和面向过程的区别?用面向过程可以实现面向过程吗?

面向对象和面向过程的区别:
- 面向过程就像是一个细心的管家,所有细节都要考虑;面向对象就像是家用电器,你只需要知道它的功能,不需要知道它的工作原理。
- 面向过程是一种以事件为中心的编程思想,即分析出解决问题的步骤,然后用函数把这些步骤实现,并按照顺序调用;面向对象是以“对象”为中心的编程思想。
- 举个例子:汽车发动,汽车到站
- 对于“面向过程”来说,是两个事件,汽车启动是一个事件,汽车到站是一个事件,面向过程关心的是事件,而不是汽车本身。针对这两个事件,形成两个函数,之后依次调用。
- 对于“面向对象”来说,我们关心的是汽车这类对象,汽车启动和汽车到站这两个事件只是这类对象所具有的行为,而且对于这两个行为的顺序没有强制要求。

2.重载和重写,如何确定调用哪个函数?
  • 重载:重载发生在同一个类中,同名方法如果有不同的参数列表(参数类型不同,参数个数不同或者两者都不同)则为重载
  • 重写:重写发生在子类与父类之间,重写要求子类重写的方法和父类被重写的方法具有相同的返回类型,比父类被重写的方法更好的访问,不能比父类被重写的方法声明更多的异常(里氏代换原则),根据不同子类对象确定调用哪个方法。
3.面向对象开发的六个基本原则:
  • 单一职责:一个类只做它该做的事情(高内聚)。在面向对象中,如果让一个类完成它该做的事情,而不参与它无关的事就是践行了高内聚原则,这个类就只有单一职责。
  • 开放封闭:软件实体应当对扩展开放,对修改关闭。要做到开闭有两个要点:(1)抽象是关键,一个系统中如果没有抽象类或者接口则系统就没有扩展点;(2)封装可变性,将系统中各种可变因素封装到一个继承结构中,如果多个可变因素混杂在一起,系统将变得复杂而换乱。
  • 里氏替换:任何时候都可以用子类替换掉父类型。子类一定是增加了父类的功能而不是减少了父类的功能,因此子类的能力比父类能力更多,把能力多的对象当成能力少的对象当然没有问题。
  • 依赖倒置:面向接口编程。(即声明方法的参数类型,方法的返回类型,变量的引用类型时,尽可能的使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代)
  • 合成聚和复用:优先使用聚合或合成关系复用代码。
  • 接口隔离:接口要小而专,而不能大而全。臃肿的接口是对接口的污染,既然接口表示能力,那么一个接口只应该描述一种能力,接口应该是高度内聚的。
4.static和finally的区别和用途?
  • static
    修饰变量:静态变量随着类加载时被完成初始化,内存中只有一个,且JVM也只会为它分配一次内存,所有类共享静态变量
    修饰方法:在类加载的时候就存在,不依赖任何实例;static方法必须实现,不能用abstract修饰
    修饰代码块:在类加载完成后会执行代码块中的内容
    父类静态代码块->子类静态代码块->父类非静态代码块->父类构造方法->子类非静态代码块->子类构造方法

  • finally
    修饰变量:
    (1)编译时常量:类加载的过程完成初始化,编译后代入任何计算式中,只能是基本类型。
    (2)运行时常量:基本数据类型或引用数据类型。引用不可变,但引用的对象内容可变。
    修饰方法:不能被继承,不能被子类修改
    修饰类:不能被继承
    修饰形参:final形参不可变

5.HashMap和HashTable的区别?
  • HashTable的方法是同步的,HashMap未经同步,所以多线程安全场合要手动同步HashMap;
  • HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以);
  • 两者的遍历方式大同小异;
  • HashTable使用Enumeration,HashMap使用terator;
  • 哈希值的使用不同,HashTable直接使用对象的HashTable,而HashMap重新计算hash值,用于代替求模;
  • HashTable中Hash数组的默认大小是11,增加的方法是 old*2+1 HashMap中hash数组的默认大小是16,而且一定是2的指数;
  • HashTable基于Dictionary类,而HashMap基于AbstractMap类;
  • HashTable是线程安全的,其实现是在对应的方法上添加synchronized关键字进行修饰,由于在执行此方法的时候需要获得对象锁,则执行起来比较慢,所以为了保证线程安全的话,使用CurrentHashMap
6.String StringBuffer StringBuilder的区别?
  • 都是final ,不能被继承
  • String长度是不可变的,StringBuffer和StringBuilder是可变的
  • StringBuffer是线程安全的,StringBuilder不是线程安全的,但他们所有的方法都是相同的,StringBuffer在StringBuilder的方法之上添加了synchr onized修饰,保证线性安全
  • StringBuilder比StringBuffer有更好的性能
  • 如果一个String类型的字符串,在编译时就可以确定是一个字符串常量,则编译完成之后,字符串会自动拼接成一个常量,此时String的性能最好。
7.Java序列化和反序列化,常见的序列化协议有哪些?
  • java序列化的定义:将哪些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象,序列化可以弥补不同操作系统之间的差异
  • java序列化的作用:java远程方法调用(RMI) 对JavaBean进行序列化
  • 如何实现序列化
    • 实现Serializable接口:
      • 该接口只是一个序列化的标志,并没有包含实际的属性和方法
      • 如果不在修改方法中添加readObject()和writeObject()方法,则采取默认的序列化机制,如果添加了这两个方法后还想利用java的默认序列化机制,则在这两个方法中分别调用defaultReadObject()和defaultWriteObject()两个方法
      • 为了保证安全性,可以使用transient关键字进行修饰不必序列化的属性
    • 实现ExternalSerializable接口
      • 自己对要序列化的内容进行控制,控制哪些属性能被序列化,哪些不能被序列化
8.Java实现多线程的三种方法及区别
  • 实现多线程的方式:
    • 继承Thread类,重写run方法
    • 实现Runable接口
    • 实现Callable接口
  • 三种方式的区别:
    • 实现Runable接口可以避免Java单继承带来的局限,增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的,适合多个相同程序的代码处理同一资源。
    • 继承Thread类和实现Runable方法启动线程都是start()方法,然后JVM虚拟机将线程放到就绪队列中去,如果有处理机可用,则执行run()方法。
    • 实现Callable接口要实现call方法,并且线程执行完毕后会有返回值,其他两种都是重写run()方法,没有返回值。
9.线程安全:
  • 定义
    • 某个类的行为与规范一致;
    • 不管多线程是怎样的执行顺序或者是wait/sleep/join等控制方式,如果一个类在多线程访问下运转一切正常,并且访问该类不需要进行额外的同步和协调,则这个类就是线程安全的。
  • 如何保证线程安全
    -对变量使用volitate
    -对程序进行加锁(synchronized ,lock)
  • 注意
    • 非线程安全的集合在多线程的环境下可以使用,但并不能作为多个线程共享的属性,可作为某个线程独享的属性
10.多线程如何进行信息交互?
  • Object中的方法 wait() notify() notifyAll()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值