经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 职业生涯 » 查看文章
搜狗面经汇总
来源:cnblogs  作者:武培轩  时间:2018/10/19 9:02:55  对本文有异议

目录

一、Java

说明类中public和private的基本区别

访问权限 类内 包内 子类 不同包
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N

多线程用过吗

hashmap:先介绍基本操作概念源码,问为什么多线程环境下使用hashmap,entry链表会造成死循环。

volatile底层原理

volatile是变量修饰符,其修饰的变量具有可见性,Java的做法是将该变量的操作放在寄存器或者CPU缓存上进行,之后才会同步到主存,使用volatile修饰符的变量是直接读写主存,volatile不保证原子性,同时volatile禁止指令重排。

sychronzied和lock区别

cas

jsp/servlet联系

集合都有哪些

arraylist和linkedlist区别

如何防止超卖

二、JVM

GC了解吗

JVM内存分布

JVM内存模型

程序计数器:记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空)。

Java虚拟机栈:每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。

本地方法栈:与 Java 虚拟机栈类似,它们之间的区别只不过是本地方法栈为本地方法服务。

Java堆:几乎所有对象实例都在这里分配内存。是垃圾收集的主要区域("GC 堆"),虚拟机把 Java 堆分成以下三块:

  • 新生代
  • 老年代
  • 永久代

新生代又可细分为Eden空间、From Survivor空间、To Survivor空间,默认比例为8:1:1。

方法区:方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。Object Class Data(类定义数据)是存储在方法区的,此外,常量、静态变量、JIT编译后的代码也存储在方法区。

运行时常量池:运行时常量池是方法区的一部分。Class 文件中的常量池(编译器生成的各种字面量和符号引用)会在类加载后被放入这个区域。除了在编译期生成的常量,还允许动态生成,例如 String 类的 intern()。这部分常量也会被放入运行时常量池。

直接内存:直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError 异常出现。避免在Java堆和Native堆中来回复制数据。

jvm垃圾回收器

三、数据结构与算法

手写算法:排序。给个文档查找输出想要的average

两个栈实现一个队列

  1. import java.util.Stack;
  2. /**
  3. * 用两个栈实现队列
  4. * 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
  5. * 思路:
  6. * 栈A用来作入队列,栈B用来出队列
  7. * 当栈B为空时,栈A全部出栈到栈B,栈B再出栈(即出队列)
  8. */
  9. public class Solution18 {
  10. public static void main(String[] args) {
  11. Solution18 solution18 = new Solution18();
  12. solution18.push(1);
  13. solution18.push(2);
  14. System.out.println(solution18.pop());
  15. solution18.pop();
  16. }
  17. Stack<Integer> stack1 = new Stack<Integer>();
  18. Stack<Integer> stack2 = new Stack<Integer>();
  19. public void push(int node) {
  20. stack1.push(node);//stack1负责入队
  21. }
  22. public int pop() {
  23. if (stack1.empty() && stack2.empty()) {
  24. throw new RuntimeException("队列为空");
  25. }
  26. if (stack2.empty()) {
  27. while (!stack1.empty()) {
  28. stack2.push(stack1.pop());
  29. }
  30. }
  31. return stack2.pop();//stcak2负责出队
  32. }
  33. }

堆排序

  1. public class HeapSort {
  2. /**
  3. * 构建大顶堆
  4. */
  5. public static void adjustHeap(int[] a, int i, int len) {
  6. int temp, j;
  7. temp = a[i];
  8. for (j = 2 * i; j < len; j *= 2) {// 沿关键字较大的孩子结点向下筛选
  9. if (j < len && a[j] < a[j + 1])
  10. ++j; // j为关键字中较大记录的下标
  11. if (temp >= a[j])
  12. break;
  13. a[i] = a[j];
  14. i = j;
  15. }
  16. a[i] = temp;
  17. }
  18. public static void heapSort(int[] a) {
  19. int i;
  20. for (i = a.length / 2 - 1; i >= 0; i--) {// 构建一个大顶堆
  21. adjustHeap(a, i, a.length - 1);
  22. }
  23. for (i = a.length - 1; i >= 0; i--) {// 将堆顶记录和当前未经排序子序列的最后一个记录交换
  24. int temp = a[0];
  25. a[0] = a[i];
  26. a[i] = temp;
  27. adjustHeap(a, 0, i - 1);// 将a中前i-1个记录重新调整为大顶堆
  28. }
  29. }
  30. public static void main(String[] args) {
  31. int a[] = { 51, 46, 20, 18, 65, 97, 82, 30, 77, 50 };
  32. heapSort(a);
  33. System.out.println(Arrays.toString(a));
  34. }
  35. }

写一个 “123” 转为123

  1. public class Solution {
  2. public static void main(String[] args) {
  3. Solution solution = new Solution();
  4. String s1 = "+2147483647";
  5. String s2 = "1a33";
  6. System.out.println(solution.StrToInt(s2));
  7. }
  8. /**
  9. * 判断字符串为空,长度为0,判断字符串转换后上下界是否溢出
  10. *
  11. * @param str
  12. * @return
  13. */
  14. public int StrToInt(String str) {
  15. //判断字符串是否为空,长度是否为0
  16. if (str == null || str.length() == 0) {
  17. return 0;
  18. }
  19. int start;
  20. int tag;//1表示+ 0表示-
  21. if (str.charAt(0) == '+') {
  22. start = 1;
  23. tag = 1;
  24. } else if (str.charAt(0) == '-') {
  25. start = 1;
  26. tag = 0;
  27. } else {
  28. start = 0;
  29. tag = 1;
  30. }
  31. long result = 0;
  32. for (int i = start; i < str.length(); i++) {
  33. char temp = str.charAt(i);
  34. if (temp >= '0' && temp <= '9') {
  35. result = result * 10 + (temp - '0');
  36. if (tag == 1 && result > Integer.MAX_VALUE) throw new RuntimeException("上溢出");
  37. if (tag == 0 && result < Integer.MIN_VALUE) throw new RuntimeException("下溢出");
  38. } else {
  39. return 0;
  40. }
  41. }
  42. if (tag == 0) {
  43. return (int) (-1 * result);
  44. } else {
  45. return (int) result;
  46. }
  47. }
  48. }

水仙花数

  1. public class Solution {
  2. public static void main(String[] args) {
  3. for (int i = 100; i <1000 ; i++) {
  4. int firstNum = i/100;
  5. int secondNum = i/10%10;
  6. int thirdNum = i%10;
  7. if(firstNum*firstNum*firstNum + secondNum*secondNum*secondNum+thirdNum*thirdNum*thirdNum == i){
  8. System.out.println("水仙花数为:" + i);
  9. }
  10. }
  11. }
  12. }

前序aebdc,后序bcdea,画二叉树

冒泡排序时间空间复杂度,复杂度什么意思

统计三种颜色的球各自的个数(hashmap)

找出str中str1和str2之间的字符串

两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数

二叉树前序遍历,中序遍历,后序遍历

约瑟夫环

构建有序二叉树

四、网络

http了解吗 什么长连接?怎么设置,keep-Alive有哪些值,缓存了解吗,有哪些消息头域可以设置(cacheContral的值有哪些?)

http的长连接是怎么实现的?

TCP四次挥手

所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。整个流程如下图所示:

TCP四次挥手

  1. 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  2. 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
  3. 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  4. 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

C/S中使用TCP,C和S连不上的原因

如何防止post欺诈

https

GET和POST的区别

GET 请求:

  • GET 请求可被缓存
  • GET 请求保留在浏览器历史记录中
  • GET 请求可被收藏为书签
  • GET 请求不应在处理敏感数据时使用
  • GET 请求有长度限制
  • GET 请求只应当用于取回数据

POST 请求 :

  • POST 请求不会被缓存
  • POST 请求不会保留在浏览器历史记录中
  • POST 不能被收藏为书签
  • POST 请求对数据长度没有要求

写出几个IP保留地址

0.0.0.0 不清楚主机和目的网络集合

255.255.255.255 限制广播地址

127.0.0.1 本机地址,用于测试

224.0.0.0到239.255.255.255 组播地址

五、数据库

sql 三表查询

数据库的查询优化除了索引还有什么?

mysql查询优化的方法

redis单线程还是多线程

redis持久化方式

redis的数据类型

查询出每个员工对应的boss名字(left join)

六、设计模式

手写一个单例模式。

  1. public class Singleton {
  2. private volatile static Singleton instance = null;
  3. private Singleton() {
  4. }
  5. /**
  6. * 当第一次调用getInstance()方法时,instance为空,同步操作,保证多线程实例唯一
  7. * 当第一次后调用getInstance()方法时,instance不为空,不进入同步代码块,减少了不必要的同步
  8. */
  9. public static Singleton getInstance() {
  10. if (instance == null) {
  11. synchronized (Singleton.class) {
  12. if (instance == null) {
  13. instance = new Singleton();
  14. }
  15. }
  16. }
  17. return instance;
  18. }
  19. }

七、操作系统

linux vi命令 linux的其他命令知道哪些?查询一个文件的某一列用shell实现

linux查看进程方法

八、框架

springboot和dubbo

springmvc流程

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号