JAVA面试一(基础和WEB部分)

1. 基本数据类型和包装类型
  • 基本数据类型是java提供的8种基本的数据类型,包含boolean(1),char(2),int(4),short(2),long(8),float(4),double(8),byte(1);
  • 包装类型:每一个基本的数据类型都会一一对应一个包装类型,如boolean–>Boolean;
  • Java是一个面向对象的语言,而基本的数据类型,不具备面向对象的特性,而包装类型有,封装了多个方法。
2. 装箱和拆箱
  • 装箱:把基本的数据类型转换成对应的包装类型;
Integer i = 1;//自动装箱,实际上编译时会调用Integer.valueOf(1)方法
  • 拆箱:把包装类型转换为基本的数据类型
Integer i = 1;
int j = i;//自动拆箱,实际编译会调用int j = i.intValue()方法
3. “==”和equals方法
  • "=="用来判断两个变量之间的值是否相等,而变量可以分为基本数据类型变量和引用类型变量。如果是基本数据类型的变量就直接比较数值,如果是引用类型变量则比较对应的引用内存的首地址。
  • equals只能用于对象之间的比较,判断两个对象是否属于同一个引用,除此之外还可以重写equals方法,制定符合我们标准的equals方法,如在Student类,我们可以重写equals方法让两个Student类id相等时判定相等,也可以id和name同时相等时才判定相等。
4. String、StringBuilder和StringBuffer的区别
  • String是内容不可变的字符串,String底层使用了一个不可变的字符数组(final char[]);

  • StringBuilder和StringBuffer是内容可以改变的字符串,底层使用的是可变的字符数组(没用final修饰);

  • 案例:拼接字符串

    1. String进行拼接,String = “a”+“b”;
    2. StringBuilder或StringBuffer进行拼接,StringBuilder sb = new StringBuilder(); sb.apend(“a”).apend(:b);
    3. 所以拼接字符串不能使用String进行拼接,要使用StringBuilder或者StringBuffer
  • StringBuilder和StringBuffer的区别:

    StringBuilder是线程不安全的,但效率高;

    StringBuffer是线程安全的,但效率低(方法加了synchronized关键字加锁);

5. java的集合
  • java的集合分为值value和键值对key-value两种;
  • 存储值的有List和Set,他们的区别是,List是有序的,可以重复的,而Set是无序的,不可以重复的;
  • List和Set可以根据equals和hasCode判断,也就是如果一个对象存储在Set种,必须重写equals和hasCode方法;
  • 存储键值对的为map;
6. ArrayList和LinkList的区别
  • List常用ArrayList和LinkList,结构区别是ArrayList底层使用的是数组,而LinkList使用的是链表;

  • 由于数组具有索引所以查询特定元素比较快,而插入和删除比较慢(数组是连续内存块,插入需移动内存);而链表不要求内存连续,是在当前元素存放上一个或下一个元素的地址,查询时需要从头开始一个一个找,所以查询效率低,但插入删除不需要移动内存,只需改变引用指向即可,所以插入删除效率高;

  • 适用场景:

    ArrayList:适用在查询比较多,但插入和删除比较少的情况;

    LinkList:适用在查询比较少,但插入和删除比较多的情况;

7.HashMap和HashTable的区别
  • 相同点:HashMap和HashTable都可以用来存储key-value的数据;

  • 区别:

    1. HashMap可以把null作为key或者value的,而HashTable是不可以的;

    2. HashMap是线程不安全的,效率较高,而HashTable是线程安全的,效率较低;

  • ConcurrentHashMap是中和两者的实现,jdk1.5后出的,线程安全,效率较高的一种实现方式,通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认16倍。

8. 实现一个拷贝文件的工具类使用字节流还是字符流
  • 字节流是传递的是二进制的01,而字符流传递的是字符,后面也得转换为二进制位;
  • 我们拷贝的文件不确定是只包含字符流,有可能有字节流(图片、声音、图像等),为了考虑通用性,要使用采用字节流;
9. 设计模式
  • 设计模式就是经过前人无数次的实践总结出的,设计过程中可以反复使用的可以解决特定问题的设计方法。
  • 单例模式(饱汉模式、饥汉模式)
    1. 构造方法私有化,让除了自己类中能创建外其他地方都不能创建;
    2. 在自己的类中创建一个单实例(饱汉模式是一出来就创建单实例,而饥汉模式需要的时候才创建);
    3. 提供一个方法获取该实例对象;
package test;

public class PersonFactory {
    //1.构造方法私有化
    private PersonFactory(){

    }
    //2.在类中创建单实例--饱汉模式
    private static PersonFactory instance = new PersonFactory();
    //饥汉模式,还得在方法加上synchronized同步锁放止线程不安全
//    private static PersonFactory instance = null;
    //3.提供一个方法获取该实例对象
    public static PersonFactory getInstance(){
//        if (instance==null){
//            instance = new PersonFactory();
//        }
        return instance;
    }
}
class test{
    public static void main(String[] args) {
        //只能通过类方法获取实例
        PersonFactory.getInstance().toString();
    }
}
  • 工厂模式:对象的创建交给一个工厂去创建,SpringIOC就是使用工厂模式;
  • 代理模式:SpringAOP就是使用的动态代理;
10. http get和post请求的区别
  • get和post请求都是http请求方式,用户通过不同的http请求方式完成对资源(url)的操作;

  • get,post,put和delete对应着对这个资源的查,改,增,删四个操作,具体点来讲,get一般用于获取/查询资源信息,而post一般用于更新资源信息;

  • 主要区别:

    1. get请求提交的数据会在地址栏中显示出来,而post请求不会:①get提交请求的数据是附在URL后,以?分割URL和传输数据,多个参数用&连接;②post提交的数据是放置在http包的包体中;
    2. 传输数据的大小:get请求由于浏览器对地址长度的限制而导致传输的数据有限制,而post请求不会因为地址长度限制而导致传输数据限制;
    3. 安全性,post的安全性比get的安全性高:由于get请求的数据是会在地址中呈现,所以可以通过历史记录找到密码等关键信息,这样不安全;
11. servlet的定义
  • servlet(server applet),全程java servlet,是用java编写的服务端程序,需要实现servlet接口,其主要功能在于交互式地浏览和修改数据,生成动态web内容;
  • httpServlet 重写doGet和doPost方法或者重写service方法完成对get和post请求地相应;
12. servlet的生命周期
  • servlet生命周期包括加载、实例化、初始化、处理请求以及服务结束五个阶段,这个生命周期由javax.servlet.Servlet接口的init、service和destory方法表达;
  • 具体如下:
    1. 加载Servlet的class;
    2. 实例化Servlet;
    3. 调用Servlet的init完成初始化;
    4. 响应请求(Servlet的service方法);
    5. Servlet容器关闭(Servlet的destory方法)
  • Servlet启动时,开始加载servlet生命周期,Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求相对应的doXXX方法(doGet、doPost)等,当服务器决定将实例销毁的时候调用其destory方法;
13. Servlet API中forward()与redirect()的区别
  • forward是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
  • forward还是原来的请求,而redirect是重新发起请求;
  1. forward是服务器端的转向而redirect是客户端的跳转;
  2. 使用forward浏览器的地址不会发生改变,而redirect会发生改变;
  3. forward是一次请求中完成,而redirect是重新发起请求;
  4. forward是在服务器端完成,不用客户端重新发起请求,效率较高;
14. JSP和Servlet的相同点和不同点,以及它们的联系
  • JSP是Servlet技术的扩展,所有的jsp继承HttpJspBase这个类,而HttpJspBase又继承HttpSession,也就是说JSP最终也是一个Servlet,这个Servlet对外提供服务;
  • Servlet和JSP最主要的不同点在于:Servlet如果要实现html的功能,必须使用writer输出对应的html,比较麻烦,而JSP的情况是Java和html组合成一个扩展名为.jsp的文件,坐界面展示比较方便但嵌入逻辑比较复杂;
  • JSP侧重于视图,Servlet主要用于控制逻辑;
15. JSP的内置对象及其作用方法
  • 九个内置对象:
    1. request,用户端请求,此请求会包含来自GET/POST请求的参数;
    2. response,网页传回用户端的回应;
    3. pageContext,网页的属性是在这里管理;
    4. session,与请求有关的会话期;
    5. application,servlet正在执行的内容;
    6. out,用来传送回应的输出;
    7. config,servlet的架构部件;
    8. pageJSP,网页本身
    9. exception,针对错误网页,为捕捉的例外
  • 四大作用域:
    1. pageContext:页面的作用域仅限于当前页面对象,可以近似地理解为this对象,离开当前Jsp页面,则pageContext中的所有属性就会丢失;
    2. request:请求作用域是同一个请求之内,在页面跳转时,如果通过foword方式跳转,则forword目标页面仍然可以拿到request中的属性值。如果通过redirect方式进行页面跳转,由于redurect相当于重新发出请求,此种情境下request中的属性值会丢失;
    3. session:会话作用域是在会话的生命周期内,会话失效,则session中的数据也随之丢失;
    4. application:应用作用域最大,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享;
    5. 可以通过jstl从四大作用域取值;
  • JSP传递值有request、session、application、cookie等;
16. session和cookie的区别
  • session和cookie都是会话(Session)跟踪技术,cookie通过在客户端记录信息确定用户身份,session通过在服务器端记录信息确定用户身份;但是session的实现依赖于cookie,因为session的唯一标识需要存放在客户端;
  • 区别:
    1. cookie数据存放在客户的浏览器上,session数据放在服务器上;
    2. cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗;
    3. session会在一定时间内保存在服务器上,当访问增多,会比较占用服务器的性能;
    4. 单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie;
  • 建议:
    1. 将登录信息等重要信息存放在session;
    2. 其他信息如果需要保留,存放在cookie中(如购物车);
  • 购物车最好使用cookie,但是cookie是可以在客户端禁用的,这时候我们要使用cookie+数据库的方式实现,当从cookie中不能取出数据时,就从数据库中获取;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值