恒生电子java实习笔/面试总结(更新其他小公司)

尝试着像大佬一样来写写总结。恒生笔试不难,编程就是冒泡排序和字符串处理。但是数据库因为没怎么看,估计要凉。下面就碰到的问题说一说。

1.Thread类的常用方法:

2.创建数据库、表、索引

CREATE DATABASE 数据库名称

CREATE TABLE Person ( LastName varchar(30), FirstName varchar, Address varchar, Age int(3) )

CREATE INDEX PersonIndex ON Person (LastName)

3.查找Linux下指定内容(yk的txt文件)

find ./ -name “*.txt” -exec grep -l “yk” {} \ ;(ls -d只能列出目录下文件)

 

再回顾下6.23日的面试:

第一次参加面试,紧张的不行,前后就问了三个技术问题,其它在聊天(可能已经被拒),总结如下:

1.hashmap、hashtable区别:

a、HashMap是线程不安全的,在多线程环境下会容易产生死循环,但是单线程环境下运行效率高;Hashtable线程安全的,很多方法都有synchronized修饰,但同时因为加锁导致单线程环境下效率较低。

b、HashMap允许有一个key为null,允许多个value为null;而Hashtable不允许key或者value为null。

一般我这种新手可以这样回答,但还是要从源码来谈更好。

 

2.springmvc加载启动过程:

a.用户发送请求至前端控制器DispatcherServlet。
b.DispatcherServlet收到请求调用HandlerMapping处理器映射器。
c.处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
d.DispatcherServlet调用HandlerAdapter处理器适配器。
e.HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
f.Controller执行完成返回ModelAndView。
g.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
h.DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
i.ViewReslover解析后返回具体View.
j.DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
k.DispatcherServlet响应用户。

 

3.sleep()和wait()的区别:

a.sleep() 是 Thread 类的静态本地方法;wait() 是Object类的成员本地方法
b.sleep() 方法可以在任何地方使用;wait() 方法则只能在同步方法或同步代码块中使用,否则抛出异常Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
c.sleep() 会休眠当前线程指定时间,释放 CPU 资源,不释放对象锁,休眠时间到自动苏醒继续执行;wait() 方法放弃持有的对象锁,进入等待队列,当该对象被调用 notify() / notifyAll() 方法后才有机会竞争获取对象锁,进入运行状态
d.JDK1.8 sleep() wait() 均需要捕获 InterruptedException 异常

 

愿所有善良的人被这个世界温柔以待~

 

6.24接着更新,面了两个小公司,都问到了java线程池的问题,需要引起注意。另外的问题总结如下:

1.java线程池

优点:并发线程数很多,而且一半都是执行一个短任务就结束了,这样频繁创建销毁线程会大大降低系统的效率。因此可以使用线程池,即执行完一个任务,并不被销毁,而是放在一个池子中以备后续使用。

java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,继承了AbstractExecutorService抽象类,实现了ExecutorService接口。

Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable),返回值为void,参数为Runnable类型,从字面意思可以理解,就是用来执行传进去的任务的;然后ExecutorService接口继承了Executor接口,并声明了一些方法:submit、invokeAll、invokeAny以及shutDown等;抽象类AbstractExecutorService实现了ExecutorService接口,基本实现了ExecutorService中声明的所有方法;然后ThreadPoolExecutor继承了类AbstractExecutorService。

ThreadPoolExecutor重要方法:execute()、submit()、shutdown()等等

一个网上的例子:

假如有一个工厂,工厂里面有10个工人(核心线程数),每个工人同时只能做一件任务。

  因此只要当10个工人中有工人是空闲的,来了任务就分配给空闲的工人做;

  当10个工人都有任务在做时,如果还来了任务,就把任务进行排队等待(workqueue工作队列);

  如果说新任务数目增长的速度远远大于工人做任务的速度,那么此时工厂主管可能会想补救措施,比如重新招4个临时工人进来;

  然后就将任务也分配给这4个临时工人做;

  如果说着14个工人(最大核心线程数)做任务的速度还是不够,此时工厂主管可能就要考虑不再接收新的任务或者抛弃前面的一些任务了。

  当这14个工人当中有人空闲时,而新任务增长的速度又比较缓慢,工厂主管可能就考虑辞掉4个临时工了,只保持原来的10个工人,毕竟请额外的工人是要花钱的。

任务提交给线程池之后的处理策略,这里总结一下主要有4点:

  • 如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;
  • 如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任务;
  • 如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;
  • 如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止

拒绝策略图示(默认为AbortPolicy)

2.java多态

多态是同一个行为具有多个不同表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同操作

虚函数的存在是为了多态。Java 中其实没有虚函数的概念,它的普通函数就相当于 C++ 的虚函数,动态绑定是Java的默认行为。如果 Java 中不希望某个函数具有虚函数特性,可以加上 final 关键字变成非虚函数。(虚函数主要能实现父子类方法的一个调用转换)

方式一:重写:

详细可查看:Java 重写(Override)与重载(Overload)

方式二:接口

  • 1. 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。

  • 2. java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。具体可以看 java接口 这一章节的内容。

方式三:抽象类和抽象方法

3.mysql为什么使用b+树索引

答:减少磁盘io:一层节点就意味着一次磁盘io,而b树节点有数据,io慢;红黑树io过多,b+树则很适合,而且b+树所有节点都用链表连接起来,更加容易进行区域查询。而且每个数据查询效率相当(稳定)

 

6.28上午 衡泰软件初试:

1.单例模式 双重校验锁

懒汉:要用了再实例化;饿汉:马上实例化;

双重校验锁:第一个锁使大部分情况无需运行,提升效率;第二个锁防止多个对象的出现。

 

2.类加载机制

加载-验证-准备-解析-初始化-使用-卸载

加载阶段完成后,虚拟机外部的二进制字节流就按格式存在方法区,之后便是连接阶段的第一步-验证。为了保证代码安全,验证阶段会进行四个阶段:文件格式、元数据、字节码与符号引用。其中字节码验证最为复杂,此时将对类的方法体进行校验分析,保证被校验类的方法在运行时不会做出危害JVM安全的事件。
接下来的准备阶段是正式为类变量分配内存并设置初始值,这些内存都在方法区分配(仅分配类变量而非实例变量);之后是解析阶段,该阶段是虚拟机将常量池内的符号引用替换为直接引用的过程;
初始化阶段:到了这阶段,才真正开始执行类中定义的Java程序代码

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章