JAVA常见面试题(参考答案比较浅显,还请各位补充)

一、基础类:

1、常用的java api包?

    lang,util,io,sql,net

2、string类常用的方法?

    equal,split,getBytes,length,replaceAll,toUpperCase,trim,indexOf等

3、API接口开发注意事项?

    使用https协议(数据传输安全),授权(安全性),返回数据类型(json,大多数语言支持)

4、&和&&的区别?

前者是位运算符,后者是逻辑运算符

都作为逻辑运算符时,&是不管前面的条件是否正确,后面的都会执行,&&是如果前面的不正确,后面的就不会执行(效率高点)

5、jdk1.7和1.8的区别?

    相对1.7的增强:

    1)支持整数类型(int、short、long、byte)用二进制表示(以ob开头);

    2)switch语句支持string类型;

    3)try-with-resource语句(保证声明的资源在语句结束后都会被关闭);

    4)Catch多个异常;

    5)数字类型的下划线表示(如1_0_3_0063);

    6)泛型实例的创建可以通过类型推断来简化(new后面的内容<>里面可以省略);

    7)并发工具增强(fork-join框架最大的增强)

    1.8的新特性:

    1)接口的默认和静态方法(Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法);

    2)Lambda表达式;

    3)方法与构造函数引用
    4)函数式接口:
    5)Annotation 注解:支持多重注解:
    6)新的日期时间 API(提供了新的java.time包,可以用来替代java.util.Date和java.util.Calendar)
    7)Base64编码(在Java 8中,Base64编码成为了Java类库的标准)
    8)JavaScript引擎Nashorn(Nashorn允许在JVM上开发运行JavaScript应用,允许Java与JavaScript相互调用)
    9)Stream的使用(Stream API是把真正的函数式编程风格引入到Java中。其实简单来说可以把Stream理解为MapReduce)
    10)Optional(Java 8引入Optional类来防止空指针异常,Optional类实际上是个容器:它可以保存类型T的值,或者保存null。使用Optional类我们就不用显式进行空指针检查了。)
    11)扩展注解的支持(Java 8扩展了注解的上下文,几乎可以为任何东西添加注解,包括局部变量、泛型类、父类与接口的实现,连方法的异常也能添加注解。)
    12)并行(parallel)数组(支持对数组进行并行处理,主要是parallelSort()方法,它可以在多核机器上极大提高数组排序的速度)
    13)编译器优化(Java 8将方法的参数名加入了字节码中,这样在运行时通过反射就能获取到参数名,只需要在编译时使用-parameters参数)

6、java代码块执行顺序?

    (优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。

二、集合类:

1、ArrayList和LinkedList区别?

    前者是基于动态数组的数据结构,对于随机访问get和set要优于后者,因为后者要移动指针;后者是基于链表的数据结构,对于新增和删除操作后者比较占优势,移动指针即可,但前者要移动数据

2、ArrayList和Vector区别?

    都实现了list接口,都是有序的;但前者是非线程安全的(不同步),后者是线程安全的(同步);如果只有一个线程访问集合那用前者效率比较高,如果有多个线程访问最好用后者,省去自己再去编写线程安全代码;当超过容量时前者增长0.5倍,后者增长1倍

3、HashMap和HashTable的区别?

    前者非线程安全,后者线程安全;前者键和值都允许有null存在(只能有一对),后者键和值都不许有null

4、HashMap和TreeMap的区别?

    后者基于红黑二叉树实现,集合中所有的元素都保持着某种固定的顺序,也是线程非安全,通常前者比后者快一点(哈西表和树的数据结构使然),如果是需要排序的map可以使用后者;如果需要输出的顺序和输入的顺序相同可以使用LinkedHashMap;CurrentHashMap将数据分为多个segment(默认16个),每次操作对一个segment加锁,避免多线程锁的几率,提高并发效率

5、for循环和迭代哪个效率高?

    从描述中,可以看出实现RandomAccess接口的集合类,使用for循环的效率会比Iterator高。

    RandomAccess接口为ArrayList带来的好处:

    1)、可以快速随机访问集合。2)、使用快速随机访问(for循环)效率可以高于Iterator。

三、线程相关问题:

1、创建线程的几种方式?

    继承Thread类,实现Runable接口,使用匿名累

2、实现线程同步的方法?

    同步方法,同步代码块,使用volatile实现线程同步,使用重入锁实现同步,使用局部变量

3、wait和sleep的区别?

    前者释放锁,不会自动唤醒(用notify唤醒);后者不释放锁,会自动唤醒

4、Runable和Callable接口的区别?

    前者方法是run,后者方法是call,前者任务执行后不能返回值,不可以抛出异常,而后者都可以

5、如何实现线程安全?

    不变的对象一定是线程安全的(对象没有变量只有方法,对象创建后状态不能修改,对象的所有变量都是final),实例封闭(将数据封装对象内部,可以将数据的访问限制在对象的方法上),使用同步保证原子性

四、JSP/JavaScript/Servlet

1、ajax发送异步请求的四个步骤?

    1)得到xmlHttpRequest对象;

    2)打开与服务器的连接(需要三个参数:请求方式,url,是否异步);

    3)发送请求;

    4)在对象的一个事件上注册监听器

2、servlet生命周期?

    1)加载(servlet类);

    2)实例化(初始化参数);

    3)服务(处理请求);

    4)销毁

3、JSP内置对象及作用?

    1)request 封装客户端请求

    2)response 服务端响应信息

    3)session 一次会话

    4)page 指当前jsp页面本身

    5)application 实现了用户之间数据共享,开始于服务器启动直到服务器关闭

    6)out 向客户端输出内容

    7)config 包含servlet初始化时所要用到的参数

    8)pagecontext 提供了对本页所有对象的访问

    9)exception 例外对象

五、框架相关知识:

1、为什么要用spring?

    轻量级的IOC和AOP框架,主要针对javaBean的生命周期进行管理的轻量级容器;使用IOC更加容易组合对象之间的直接关系,面向接口编程,降低耦合;使用AOP更加容易进行程序扩展;创建对象默认是单例的,不需要在使用单例模式进行处理

2、springboot是干什么的?

    微框架,用来实现微服务,采用https启动使编码变简单,使配置变简单,使部署变简单,使监控变简单

4、Spring装配Bean的过程(生命周期)?

    1). 实例化;

    2). 设置属性值;

    3). 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name;

    4). 如果实现BeanFactoryAware接口,调用setBeanFactory 设置BeanFactory;

    5). 如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext

    6). 调用BeanPostProcessor的预先初始化方法;

    7). 调用InitializingBean的afterPropertiesSet()方法;

    8). 调用定制init-method方法;

    9). 调用BeanPostProcessor的后初始化方法;

5、Spring容器关闭过程

    1). 调用DisposableBean的destroy();

    2). 调用定制的destroy-method方法;

6、@Order注解作用?

    设置bean加载的顺序(值越小越先执行)

7、@Bean注解的作用?

    方法级别的注解,放在方法上产生一个bean,id就是方法名

六、数据库:

1、数据库优化?
    1)选取最适用的字段属性、应该尽量把字段设置为NOT NULL
    2)使用索引(一般说来,索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上)
    3)使用外键
    4)优化的查询语句(绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。)
    首先,最好是在相同类型的字段间进行比较的操作。
    其次,在建有索引的字段上尽量不要使用函数进行操作。
    第三,在搜索字符型字段时,我们有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。
    最后,应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用。
    5)使用连接(JOIN)来代替子查询(Sub-Queries)
    6)使用联合(UNION)来代替手动创建的临时表
    7)事务,它的作用是:要么语句块中每条语句都操作成功,要么都失败。换句话说,就是可以保持数据库中数据的一致性和完整性。

    8)锁定表

2、wm_concat(列值)函数:该函数把列值用逗号分割,并显示成一行

七、通讯协议

1、http协议?

    (应用层的协议)支持客户/服务器模式,简单快速(发送请求时只需传送请求方法和路径),灵活(允许任意类型的数据对象),无连接性(每次连接只处理一个请求,处理完即断开,节省传输时间),无状态性(对事物处理没有记忆能力,后续处理需要重传)

2、http1.0和http1.1和http2.0区别?

    1)1.0需要keep-live参数来建立一个长连接

    2)1.1默认支持长连接,可以用一个长连接来发多个请求;1.1支持只发送header信息,服务端响应100后客户端再把body信息发送服务器,如果返回401客户端可以不用再发送body了,节约宽带;

    3)2.0使用了多路复用的技术,使得同一个连接并发处理多个请求,处理的请求数量非常可观;1.1不支持header数据的压缩,2.0支持;2.0还支持数据推送,客户端请求的时候服务端可以顺便把客户端需要的比如静态资源一起推送到客户端,方便客户端使用

3、TCP/IP协议?

    (4层:网络接口层,互联网层,传输层,应用层),针对因特网的通讯协议

4、URL和URI的区别?

    前者是统一资源定位符(是个地址,可以访问到,也是一种URI),后者是统一资源标识符(只是一个名称)


猜你喜欢

转载自blog.csdn.net/m0_37524661/article/details/80784311