面试基础问题整理(一)

面试基础问题整理(一)

1. String, StringBuffer与StringBuilder之间的区别?

  1. String, StringBuffer, StringBuiler是字符串变量还是常量?
    String --> 字符串常量
    StringBuffer --> 字符串变量(线程安全的)
    StringBuilder --> 字符串变量(非线程安全的)
    String是字符串常量, 对于这个叫法大家都可能有一个疑问, String字符串不是变量吗? 怎么叫常量?
    我们首先看一下官方的解释:
    String are constant; their values cannot be changed after they are created . String buffers support mutable strings. because String objects are immutable they can be shared
    官方监视说 : String是一个常量, 他的值在创建之后不能改变, 字符串缓冲区支持修改, 因为字符串对象是不可变的, 所以支持共享

    举个例子:
    String s = “abc”;
    s = s + 1;
    System.out.println(s);

代码解析:首先我们顶过了一个变量s, 给他复制"abc", 然后在创建一个新的对象s用来执行s=s+1; 也就是说我们之前的s并有发生变化, 这也说明了string类型是一个不可改变的对象, 每次操作String字符串, 实际上是不断的创建新的对象, 而原来的对象变成了垃圾被GC回收, 从来stringf字符串的效率也是最低的

2. String, StringBuffer, StringBuilder效率如何呢?
  从高到低 的顺序依次是 : StringBuilder > StringBuffer > String
  由上知道了String是字符串常量, 所以她的效率自然而然是最低的, 对于StringBuffer和StringBuilder它们属于变量, 是可以改变的对象, 每次对字符串的操作, 实际上是在一个对象上操作, 所以效率更高一点, StringBuilder是线程安全的, 考虑到安全问题, 相对他的性能会更低一点. 由此可见从效率角度看, StringBuilder最高, 其次是StringBuffer, 最后是String字符串常量

总结 : 当多个线程使用字符串缓冲区时, 使用StringBuffert保证正确的操作, 如果是单线程, 建议使用StringBuilder效果更高一点
  简要的说, String类型和StringBuffer类型的主要性能区别其实是在于String是不可变的对象, 因此每次对String类型进行改变的时候都等同于生成了一个新的String对象, 然后将指针指向新的String对象, 所以经常改变内容的字符串最好不要用String, 因为每次生成对象都会对系统性能产生影响, 特别当内容中无引用对象多了以后, jvm的GC就会开始工作, 那速度是一定会相当慢的, 如果使用StringBuffer类则结果就不一样了, 每次结果都是对StringBuffer对象本身操作, 而不是生成新的对象, 不在改变对象的引用, 所以在一般情况下我们推荐使用StringBuffer, 特别是字符串对象经常改变的情况下, 而某些特别情况下, String对象的字符串其实被jvm解释成了StringBuffer对象的拼接, 所以这些时候sString对象速度并不会比StringBuffer对象慢

2. 说一下什么叫生命周期并举例
 生命周期是指在一个对象的生老病死, 基本含义 : 从摇篮到坟墓的整个过程

3. servlet的生命周期是什么?
  所谓生命周期, 指的是servlet容器如何创建爱你servlet实例, 分配其资源, 调用其方法, 并销毁其实例的整个过程
  1. 阶段一 : 实例化 (就是创建servlet对象, 调用构造方法)
  2. 阶段二 : 初始化
  3. 阶段三 : 就绪/调用
  4. 阶段四 : 销毁

4. jsp的生命周期 ?
  1. 阶段一 : 编译阶段
  2. 阶段二 : 初始化阶段
  3. 阶段三 : 执行阶段
  4. 阶段四 : 销毁阶段

5. ==与equals的区别?
  ==比较Stack的值(引用数据类型stack中存放的是对象的堆内存地址)
  equals( ) 通常被复写为比较对象的值 . 比较内容

6. cookie和session的区别?
 1. cookie数据存放在客户的浏览器上, session数据放在服务器上
 2. cookie不是很安全, 别人可以分析存放本地的cookie并进行cookie欺骗, 考虑安全应该使用session
 3. session会在一定时间内保存在服务器上, 当访问增多, 会比较占用你服务器的性能, 考虑到减轻服务器的性能方面 , 应当使用cookie
 4. 单个cookie保存的数据不能超过4K, 很多浏览器都限制一个站点最多保存20个cookie
 5. 所以个人建议:
  1.将登陆信息等中啊哟信息存放为session
  2.将其他信息如果需要熬保留, 可以放在cookie中
  
7. jsp中的四个作用域, 九个内置对象分别是什么?
  1. 四个作用域:
   -page 当前页面有效时间最短(页面执行期间)
   - request HTTP请求开始到结束这段时间
   - session HTTP会话开始到结束这段时间
   - application 服务器启动到停止这段时间
  2. 九个内置对象
   -request, response, out, session, application, pageContext, page, config, exception
   -内置对象(又叫隐含对象), 就是在jsp中, 不需要创建(由服务器<容器>来创建), 可以直接使用的对象
  
8. ArrayList和LinkedList的区别?
   1. ArrayList查询快, LinkedList增删快
   2. ArrayList和LinkedLisrt可从名字分析, 他们是Array(动态数组)的数据结构, 一个Link(链表)的数据结构, 此外, 他们两个都是对List接口的实现
   3. 当对数据进行增删操作时(add和remove操作), LinkedList比ArraylList效率更高, 因为ArrayList是数据, 所以在其中进行增删操作时, 会对操作点之后所有数据的下标索引造成影响, 需要进行数据的移动
   4. 当随机访问List时(get和remove操作), ArrayList比LinkedListr的效率更高, 因为LinkedList是线性的数据储存方式, 所以需要移动指针从前往后一次查找
   5. 从利用效率来说, ArrayList自由性较低, 因为它需要手动的设置固定大小的容量, 但是他的使用比较方便, 只需要创建, 然后添加数据, 通过调用下标(索引)使用, 而LinkedList自由性比较高, 能够动态的岁数据量变化而变化, 但是他不便于使用
   6. ArrayList主要空间开销在于需要List列表预留一定的空间,而LinkList主要主要空间开销在需要储存节点信息以及节点指针信息

9. java常用的设计模式有哪些?
  * Java中有23中设计模式 :
   Factory : 工厂模式
   Builder : 建造模式
   Factory Method : (工厂方法模式)
   Prototype : 原始模型模式
   Singleton : 单例模式
   Facad : 门面模式
   Adapter : 适配器模式
   Bridge:桥梁模式
   Composite:合成模式
   Decorator: 装饰模式
   Flyweight:享元模式
   Proxy:代理模式
   Command:命令模式
   Iterator: 迭代字模式
   Mediator: 调停者模式
   Memento: 备忘录模式
   Observer: 观察者模式
   State:状态模式
   Strategy: 策略模式
   TemPlate Method: 模板方法模式
   Chain of Responsibleity : 责任链模式
10. 线程的生命周期是什么?
  新建状态(new) : 当线程对象创建后,即进入了新建状态, 如 : Thread t = new MyThread();
  就绪状态(Runnable) :当调用线程对象的start()方法(t.start()?, 线程即进入就绪状态, 处于就绪状态的线程, 只是说明此线程已做好了准备, 随时等待cpu的调度执行, 并不是说执行t.start() 此线程立即就会执行
  运行状态(Running):当cpu开始调度处于就绪状态的线程时, 此时线程才得以真正的执行, 即进入到运行状态. 注 : 就绪状态是进入到运行状态的唯一入口, 也就说, 线程要想进入运行状态执行, 首先必须处于就绪状态中
  阻塞状态(Blocked) : 处于运行状态中的线程友谊某种原因, 暂时放弃对cpu的使用权, 停止执行, 此时进入阻塞状态, 直到其进入到就绪状态, 才有机会再次被cpu再次被cpu调用以进入运行状态, 根据阻塞产生的原因不同, 阻塞状态又可以分为三种:
  1. 等待阻塞 : 运行状态中的线程执行wait()方法, 使本线程进入到等待阻塞状态
  2. 同步阻塞 : 线程在获取synchronized同步锁失败(因为所悲其他线程所占用), 它就会进入同步阻塞状态
  3. 其他阻塞 : 通过调用线程的sellep(), 或join()或发出来I/O请求时, 线程会进入到阻塞状态, 当sleep()状态超时, join(), 等待线终止或超时, 或者I/O处理完毕时, 线程重新转入就绪状态
  死亡状态(Dead) : 线程执行完了或者因一场退出了run()方法, 改线程结束生命周期

纵然天地不公, 我依然如故.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值