JAVA初级工程师面试36问(一)

      前几天,一个老家的小伙子正在找java初级开发工程师的岗位,问我一般会问什么问题? 第一时间听到这个,我在想:what? 除了刚开始找工作的第一年面试几家公司问了一些基础项东西,后面两家公司基本都是内推进去的,问的问题也是偏项目,偏实际,理论大概也没有问什么,当然,作为一个爱回答问题的我,是肯定要给他指明方向的,于是 ,我便综合各方面给他说了一些东西,同时记录下来,万变不离其宗.基础知识是学习一个新东西和升华一个东西必不可少的条件.

     第一问:    请说一下String和StringBuffer、StringBuilder的区别是什么?

     线程安全性: 

             String中的对象是不可变,线程安全 

             StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。

             StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

     性能: 

        String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。

        StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。

        StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

对于三者使用的总结:

  • 如果要操作少量的数据用 = String
  • 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
  • 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

第二问:Java的堆、栈、方法区(也叫常量池)理解?

         堆: 1.存放new出来的东西(对象、数组等) 2.可以被所有的线程共享,不会存放别的对象的引用.

         栈: 1.存放基本变量(会包含这个基本类型的具体数值) 2.引用对象的变量(会存放这个引用在堆里面的具体地址)

  方法区: 1.可以被所有的线程共享 2.包含了所有的class和static变量.

第三问:Java中的==和toString方法和equals方法的区别?

   == :  用来判断两个变量是否相等,1.如果是基本类型,则只要值相等,判断的结果就是true. 2.如果是比较的引用类型,那么只有在两个变量指向的是同一对象时才是true

 equals: 默认情况下内部就是==比较,所以如果不重写的话,比较结果和==比较一样,在String中已经重写了equals方法.

toString : 该方法属于Object,Object是所有类的顶级父类,都继承了toString方法,在实际使用的时候需要重写toString方法然后实现内容的直接输出.

第四问: ArrayList和LinkedList的区别?

  1. List是一个接口,他继承Collection接口,代表有序的队列。
  2. ArrayList、LinkedList是是List的实现类.
  3. ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构
  4. 对于随机访问的get和set,ArrayList要优于LinkedList,因为LinkedList基于指针的移动
  5. 对于添加和删除操作add和remove,一般LinkedList要比ArrayList快,因为ArrayList要移动数据。(其实真正大数据量化还是不太对的)
  6. 当添加数据量很小时,两者区别不太大,当添加的数据量大时,大约在容量的1/10之前,LinkedList会优于ArrayList,在其后就劣与ArrayList,且越靠近后面越差。所以个人觉得,一般首选用ArrayList,由于LinkedList可以实现栈、队列以及双端队列等数据结构,所以当特定需要时候,使用LinkedList,当然咯,数据量小的时候,两者差不多,视具体情况去选择使用;当数据量大的时候,如果只需要在靠前的部分插入或删除数据,那也可以选用LinkedList,反之选择ArrayList反而效率更高。

第五问: 简单介绍下你对Http协议与TCP协议简单理解?

       1.Tcp协议对应着传输层,而HTTP协议对应着应用层;

       2.从本质上而言,他们之间是没有区别的,因为http协议是建立在TCP协议之上的,比如,当我们发送一个http的请求,那么http就会通过tcp来建立一个连接到服务的一个通道,Http会立即将TCP断开,因此我们也说http是一种短连接或者无状态连接。

       3.所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持这个连接并且在内存中记住一些信息状态,而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住状态,成为了无状态连接。

      4.随着前端html页面功能的增强,如果我们每次访问一个页面都要建立一个TCP的连接,那效率就慢了,从HTTP/1.1开始,默认都开启了Keep-Alive,保持连接性,也就是说当一个网页打开完成后,http数据的tcp连接不会再关闭了,会有一个保持的时间,但是这个时间一到也会自动关闭。

      5.之所以http是短连接,tcp是长连接。因为,http每次请求完后就会关闭,而通过socket编程使用TCP协议的时候,控制开关闭的代码在我们手上,我们只要不关闭就会让连接状态一直保持着。

第六问: java中为啥内部类可以访问外部类的成员?

1 编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象的引用;

2 编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值;

3 在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用.

 未完待续....

    

猜你喜欢

转载自blog.csdn.net/FindHuni/article/details/106563756