这次的文章是针对于‘一’的补充,如果需要了解java面试题全集(一)的小伙伴,关注楼主,然后去播客主页即可查看,,,
首先我们先来谈谈数据结构,因为这是一个亘古不变的问题。。。
1、什么是数据结构?
答、简单的来说,数据结构就是以某种特定的布局方式存储数据的容器。而这种布局方式,决定了其数据结构对于某些操作是高效的,对于某些操作是低效的。所以我们需要了解各种数据结构,才能在处理实际问题中选区最适合的数据结构。
2、常见的数据结构有哪些?
答:1、数组 2、栈 3、队列 4、链表 5、树 6、图 7、字典值(这是一种 高效的树形结构,但值得单独说明) 8、散列表(哈希表)
下面我们说说各个数据结构的类型以及经常用到的一些操作以及面试中常问的一些问题:
数组:
类型:一维数组 二维数组
常用的基本操作:Insert----在指定索引位置插入一个元素
Get-----------返回指定索引位置的元素
Delete----------删除指定索引位置的元素
Size----------得到数组元素的数量
常见的问题: 寻找数组中的第二小的元素
找到数组中第一个不重复出现的整数
合并两个有序的数组
重新排列数组中的正负值
栈:
基本操作:Push---------在顶部插入一个元素
Pop---------返回并移除栈顶元素
isEmpty----如果栈为空,返回True
Top-------返回顶部元素,但并不移除
常见问题:使用栈计算后缀表达式
对栈的元素惊醒排序
判断表达式是否括号平衡
队列:
与栈相似,队列是另一种顺序存储元素的线性数据结构。栈与队列的最大差别在于栈是LIFO(后进先出),而队列是FIFO,即先进先出。
常见的基本操作:
-
Enqueue() —— 在队列尾部插入元素
-
Dequeue() ——移除队列头部的元素
-
isEmpty()——如果队列为空,则返回true
-
Top() ——返回队列的第一个元素
常见的问题:
-
使用队列表示栈
-
对队列的前k个元素倒序
-
使用队列生成从1到n的二进制数
链表:
类型:单链表(单向) 双向链表(双向)
基本操作:
-
InsertAtEnd - 在链表的末尾插入指定元素
-
InsertAtHead - 在链接列表的开头/头部插入指定元素
-
Delete - 从链接列表中删除指定元素
-
DeleteAtHead - 删除链接列表的第一个元素
-
Search - 从链表中返回指定元素
-
isEmpty - 如果链表为空,则返回true
常见问题
-
反转链表
-
检测链表中的循环
-
返回链表倒数第N个节点
-
删除链表中的重复项
图:
类型 无向图 有向图
在程序语言中,图可以用两种形式表示:
-
邻接矩阵
-
邻接表
常见图遍历算法
-
广度优先搜索
-
深度优先搜索
面试中关于图的常见问题
-
实现广度和深度优先搜索
-
检查图是否为树
-
计算图的边数
-
找到两个顶点之间的最短路径
散列表:
散列数据结构的性能取决于以下三个因素:
-
哈希函数
-
哈希表的大小
-
碰撞处理方法
关于哈希结构的常见问题:
-
在数组中查找对称键值对
-
追踪遍历的完整路径
-
查找数组是否是另一个数组的子集
-
检查给定的数组是否不相交
3、请简述一下数据库的优化?
答:数据库的优化可以从四个方面来优化:
1.从结构层: web服务器采用负载均衡服务器,mysql服务器采用主从复制,读写分离
2.从储存层: 采用合适的存储引擎,采用三范式
3.从设计层: 采用分区分表,索引,表的字段采用合适的字段属性,适当的采用逆范式,开启mysql缓存
4.sql语句层:结果一样的情况下,采用效率高,速度快节省资源的sql语句执行
4、什么是负载均衡?
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
5、谈谈你对HashMap简单的认识?
答:HashMap最早出现在JDK1.2中,底层基于散列算法实现。HashMap 允许 null 键和 null 值,是非线程安全类,在多线程环境下可能会存在问题。
6、 hashmap中hash碰撞是什么?为什么会发生hash碰撞?jdk怎么解决hash碰撞?
答:有可能两个不同的原始值在经过哈希运算后得到同样的结果,这就是hash碰撞。之所以会产生碰撞,是因为hashmap自身本来就是线程不安全的,所以在多线程中,一般不建议使用hashmap。 通常有两类方法处理碰撞:开放寻址(Open Addressing)法和链接(Chaining)法。前者是将所有结点均存放在散列表T[0..m-1]
中;后者通常是把散列到同一槽中的所有元素放在一个链表中,而将此链表的头指针放在散列表T[0..m-1]中。
7、SpringBoot中的yml和properties有什么区别?
答:Spring boot中支持两种后缀的配置文件:yml和properties。
application.properties中内容如下:
server.port=8080
server.servlet.context-path=elk
application.yml中内容如下:
server:
port: 8080
servlet:
context-path: /elk
.yml格式的配置文件需要注意几点:
1)冒号后面要加空格; 2)缩进不能使用TAB
8、什么是“3次握手,4次挥手” ?
答:TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如ip地址、端口号等。
TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。
TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用4次挥手来关闭一个连接。
9、面向对象和面向过程的区别?
面向过程
优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点: 没有面向对象易维护、易复用、易扩展
面向对象
优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点: 性能比面向过程低
10、Java和C++的区别
我知道很多人没学过 C++,但是面试官就是没事喜欢拿咱们 Java 和 C++ 比呀!没办法!!!就算没学过C++,也要记下来!
- 都是面向对象的语言,都支持封装、继承和多态
- Java 不提供指针来直接访问内存,程序内存更加安全
- Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
- Java 有自动内存管理机制,不需要程序员手动释放无用内存
11、 构造器 Constructor 是否可被 override?
答:父类的私有属性和构造方法并不能被继承,所以 Constructor 也就不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况。