晨星准备
- gc是什么,他的原理是什么,回收机制判断没有引用对象时算法是什么
https://www.cnblogs.com/wjtaigwh/p/6635484.html - lock,synchronized的区别
1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;
2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)
6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。
- spring beanfactory factorybean有什么区别
beanFactory是一个Factory,用于管理bean的,有了一个Spring的beanFactory,我们就可以从spring中
获取注册到其中的bean来使用了FactoryBean的功能貌似更像是一种代理,有一种场景是,我们使用一个通用的类来在xml文件中注册bean,我们希望通过该通用bean产生一个我们希望的bean,而这个需求FactoryBean就可以办到,你只需要拦截你需要代理的bean,然后转换成你希望的bean再注册。一个应用场景就是Rpc服务器端的bean注册,以及Rpc客户端的服务调用,都可以通过一个第三方bean来产生我们真正需要的bean。
https://www.jianshu.com/p/a8036f3cc1e6 - jms, activemq发送消息,消息丢失时怎么处理
- nio有用过吗,用过里面的什么方法 byte channel
- Mybatis映射是如何实现的
- 接口和抽象类的区别,什么情况下一定要用接口,什么情况下用抽象类
- 多线程通信
很详细
https://www.cnblogs.com/java1024/p/7685400.html进程间的通信方式
管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信
- 页面访问慢怎么处理
1.用缓存,memcached,ehcached
2.页面的静态化
3.sql优化,数据库优化
4.服务器集群,负载均衡
5.准备图片服务器 - 堆跟栈有什么区别
- uml画两个类的一对多关系
- character与bytes有什么不同
A) 每次读入的字节数不同 B) 前者带有缓冲,后者没有
C) 前者是字符读写,后者是字节读写 D) 二者没有区别,可以互换使用
https://www.cnblogs.com/skipping/p/5429139.html - springframework 可以跨平台,反射
java编译后变成class文件,字节码文件,通过字节码反射实现springframework框架 - 为什么java支持write once, run everywhere
Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class 文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集合符号表以及若干其他辅助信息。
- 数组跟链表有什么区别,什么情况下用数组,什么情况下用双向链表
数组:是将元素在内存中连续存储的;它的优点:因为数据是连续存储的,内存地址连续,所以在查找数据的时候效率比较高;它的缺点:在存储之前,我们需要申请一块连续的内存空间,并且在编译的时候就必须确定好它的空间的大小。在运行的时候空间的大小是无法随着你的需要进行增加和减少而改变的,当数据两比较大的时候,有可能会出现越界的情况,数据比较小的时候,又有可能会浪费掉内存空间。在改变数据个数时,增加、插入、删除数据效率比较低。
链表:是动态申请内存空间,不需要像数组需要提前申请好内存的大小,链表只需在用的时候申请就可以,根据需要来动态申请或者删除内存空间,对于数据增加和删除以及插入比数组灵活。还有就是链表中数据在内存中可以在任意的位置,通过应用来关联数据(就是通过存在元素的指针来联系)。
数组和链表就拿增加数据来说,数组中增加一个元素,需要移动大量的元素,在内存中空出一个元素的空间,然后将增加的元素放到空出的空间中;而链表就是将链表中最后的一个元素的指针指向新增的元素,在指出新增元素是尾元素就好了。
数组应用场景:
1、数据比较少;
2、经常做的运算是按序号访问数据元素;
3、数组更容易实现,任何高级语言都支持;
4、构建的线性表较稳定。
- linkedlist是双向链表实现的,为什么查询效率慢
- 英文自我介绍
- 多线程的pipedStream RandomAcceStream FileStream Filter stream
- C++和java的区别
https://www.cnblogs.com/Allen-rg/p/6692043.html - 不用临时变量,交换变量a和b值的方法,哪种最案例,为什么
- springMVC与struts2的区别
- (C++)HTTP CODE
- (C++)设计模式,敏捷开发
- Java运行时数据区:
- 程序计数器
是用于存储每个线程下一步将执行的jvm指令,如该方法为native的,则程序计数器中不存储任何信息 - jvm栈
jvm栈是线程私有的,每个线程创建的同时都会创建jvm栈,jvm栈中存放的为当前线程中局部基本类型变量,部分返回结果以及stack frame,非基本类型对象在jvm栈上仅存放一个指向堆上的地址 - 堆
它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。
(1)堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的
(2)Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配
(3)TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。
-
方法区(Method Area)
(1)在Sun JDK中这块区域对应的为PermanentGeneration,又称为持久代。
(2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
-
本地方法栈(Native Method Stacks)
JVM采用本地方法栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。
-
运行时常量池(Runtime Constant Pool)
存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。JVM在加载类时会为每个class分配一个独立的常量池,但是运行时常量池中的字符串常量池是全局共享的。
- String,StringBuffer,StringBuilder
StringBuffer是线程安全的,每次操作字符串,String会生成一个新的对象,而StringBuffer不会;StringBuilder是非线程安全的 -
四种线程池
newCachedThreadPool——创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool——创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool——创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor——创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 -
当一个线程进入一个对象的synchronized方法A之后,其他线程是否可进入此对象的synchronized方法B?
给出答案:是不能的,其他线程只能访问该对象的非同步方法,同步方法则不能进入;
因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法,说明对象锁已经被取
晨星笔试
- 星巴克会销售的主要饮料为咖啡,而咖啡由黑咖啡(28元)以及调料组成,其中调料种类会不断增加,假如现在调料包括抹茶和巧克力,其中一份抹茶(3元),巧克力一份(5元),请用面向对象思想设计一个计费程序,并写一个主函数计算加了巧克力和抹茶的咖啡的价格,请考虑咖啡调料种类可能不断增加的情况去选用适当的设计模式。
【假设饮料基类的名字为Beverage,有属性description和方法getCost】
(装饰者模式) - 现在一组整数组成的树的前序顺序为:5,3,7,4,1,8,9,则这棵树的后序遍历结果
- 假如5431=1124,6543=1207,9231=7064,那么2120=?
1224 2122 1022 1024 - 甲乙两车同时从AB两站出发,两车在离A站40公里第一次相遇,然后仍以原速继续行驶。两车分别到达B站和A站后,立即又原路返回当两车第二次相遇时,离B站15公里,则A,B两站间的距离是
95 100 105 110 - 现有一组整数:63981475,使用快速排序法对其排序,假设以第一个数为基准,第一轮以6为基准划分,以下哪一项是可能的结果
53416879 41685379 31546879 35461879 - 以下属于白盒测试的是
系统测试 确认测试 单元测试 集成测试