失效链接处理 |
Java初级开发技术面试题 PDF 下载
本站整理下载:
相关截图:
主要内容:
1.请说一下String和StringBuffer、StringBuilder的区别是什么?
线程安全性:
String中的对象是不可变,线程安全
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的
性能:
String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。
StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。
StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
对于三者使用的总结:
如果要操作少量的数据用 = String
单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
2.Java的堆、栈、方法区(也叫常量池)理解?
堆: 1.存放new出来的东西(对象、数组等) 2.可以被所有的线程共享,不会存放别的对象的引用.
栈: 1.存放基本变量(会包含这个基本类型的具体数值) 2.引用对象的变量(会存放这个引用在堆里面的具体地址)
方法区: 1.可以被所有的线程共享 2.包含了所有的class和static变量.
3.Java中的==和toString方法和equals方法的区别?
== : 用来判断两个变量是否相等,1.如果是基本类型,则只要值相等,判断的结果就是true. 2.如果是比较的引用类型,那么只有在两个变量指向的是同一对象时才是true
equals: 默认情况下内部就是==比较,所以如果不重写的话,比较结果和==比较一样,在String中已经重写了equals方法.
toString : 该方法属于Object,Object是所有类的顶级父类,都继承了toString方法,在实际使用的时候需要重写toString方法然后实现内容的直接输出.
4.ArrayList和LinkedList的区别?
List是一个接口,他继承Collection接口,代表有序的队列。
ArrayList、LinkedList是是List的实现类.
ArrayList是实现了基于动态数组的数据结构,线程是不安全的,而LinkedList是基于链表的数据结构
对于随机访问的get和set,ArrayList要优于LinkedList,因为LinkedList基于指针的移动
对于添加和删除操作add和remove,一般LinkedList要比ArrayList快,因为ArrayList要移动数据。(而数组是通过下角标)
当添加数据量很小时,两者区别不太大,当添加的数据量大时,大约在容量的1/10之前,LinkedList会优于ArrayList,在其后就劣与ArrayList,且越靠近后面越差。所以个人觉得,一般首选用ArrayList,由于LinkedList可以实现栈、队列以及双端队列等数据结构,所以当特定需要时候,使用LinkedList,当然咯,数据量小的时候,两者差不多,视具体情况去选择使用;当数据量大的时候,如果只需要在靠前的部分插入或删除数据,那也可以选用LinkedList,反之选择ArrayList反而效率更高。
5. 简单介绍下你对Http协议与TCP协议简单理解?
Tcp协议对应着传输层,而HTTP协议对应着应用层;
从本质上而言,他们之间是没有区别的,因为http协议是建立在TCP协议之上的,比如,当我们发送一个http的请求,那么http就会通过tcp来建立一个连接到服务的一个通道,Http会立即将TCP断开,因此我们也说http是一种短连接或者无状态连接。
所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持这个连接并且在内存中记住一些信息状态,而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住状态,成为了无状态连接。
随着前端html页面功能的增强,如果我们每次访问一个页面都要建立一个TCP的连接,那效率就慢了,从HTTP/1.1开始,默认都开启了Keep-Alive,保持连接性,也就是说当一个网页打开完成后,http数据的tcp连接不会再关闭了,会有一个保持的时间,但是这个时间一到也会自动关闭。
之所以http是短连接,tcp是长连接。因为,http每次请求完后就会关闭,而通过socket编程使用TCP协议的时候,控制开关闭的代码在我们手上,我们只要不关闭就会让连接状态一直保持着。
6 . java中为啥内部类可以访问外部类的成员?
编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象的引用;
编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值;
在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用.
7. 请简单描述你对Ioc(控制反转)的理解?
一个类需要用到某个接口的方法,需要将类A和接口B的实现关联起来,最简单的方法是在类A中创建一个对于接口B的实现类C的实例,但是用这种方法显然两者的依赖太大.稍微好一点的方式是使用工程模式,实例类通过工厂类创建,减少了类A与接口B的实现类C的依赖,但是创建工厂类也不是很方便.而IOC相当于一个大的bean工厂,使用IOC后,只在类A中定义好用于关联接口B的实现方法,将类A,接口B和接口B的实现放在IOC容器中,通过一定的配置由容器来实现类A与接口B的实现C的关联.
|