瑞亚科技(北京)网络科技有限公司
一、基础
1)java基础类型有哪些,基础类型和封装类型的区别?
| 数据类型 | 包装类 | 字节长度 | 默认值 |
| int | Integer | 4 | 0 |
| short | Short | 2 | 0 |
| long | Long | 8 | 0I或0L |
| byte | Byte | 1 | 0 |
| float | Float | 4 | 0.0F或0.0f |
| double | Double | 8 | 0.0 |
| char | Character | 2 | u0000 |
| boolean | Boolean | 1 | false |
备注:
1.1 基本类型只能按值传递,每个基本类型对应的封装类是按引用传递的。
1.2 基本类型在内存中是存储在栈中,引用类型的引用(值得地址)存储在栈中,而值是存储在堆中。
2)列举几个开发中常用的设计模式,并用代码实现一个设计模式
设计模式是不分语言的;前辈们总结出来的设计模式分: 3种类型及 23种模式:
设计模式主要分三个类型:创建型、结构型和行为型。
创建型有:
一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
行为型有:
六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。
十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。
十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。
十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
结构型有:
十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。
十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。
十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
二十、Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
二十一、Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
二十二、Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化。
二十三、Flyweight,享元模式
开发模式:
JAVA中的开发模式:
MVC是一个很常用的程序开发设计模式,M-Model(模型):封装应用程序的状态;V-View(视图):表示用户界面;C-Controller(控制器):对用户的输入作出反应,创建并设置模型。
单例模式: package com.freddy; //懒汉式单例,在第一次调用时,实例化自己 public class Singleton { private Singleton(){} private static Singleton single = null; //静态工厂方法 public static Singleton getInstance(){ if(single==null){ single = new Singleton(); } return single; } } package com.freddy; //恶汉式单例,在类初始化时,已经自行实例化 public class Singleton1 { private Singleton1(){} private static final Singleton1 single = new Singleton1(); //静态工厂方法 public static Singleton1 getInstance(){ return single; } }
3)java实现一个读写锁实例?
概念:
假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(译者注:也就是说:读-读能共存,读-写不能共存,写-写不能共存)。这就需要一个读/写锁来解决这个问题。
Java5在java.util.concurrent包中已经包含了读写锁。
这里差一个实现案例;
4)介绍JAVA中的Collection FrameWork(包括如何写自己的数据结构)?
Java collection是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。
Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator、Arrays和Collections)。
Java collection 结构图:

5)JAVA中char型变量中能不能存储一个中文汉字,为什么?
能
在C语言中,char类型占1一个字节,而汉子占2个字节,所以不能存储。
在Java中,char类型占2个字节,而且Java默认采用Unicode编码,以个Unicode码是16位,所以一个Unicode码占两个字节,Java中无论汉子还是英文字母都是用Unicode编码来表示的。
所以,在Java中,char类型变量可以存储一个中文汉字。
6)用最有效的方法算出2乘以8等于几?
因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,
而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。
package com.freddy; /* * 用最有效的方式算出2*8等于几 */ public class Singleton1 { public static void main(String[] args){ int a = 2<<3; System.out.println("2左移3位是:"+a); } }
7) 简述JAVA内存模型,了解哪些JVM参数配置,是否配置过线上JVM参数?
8)使用过哪些数据库,是否了解数据库常用的索引类型及实现原理?
9)简述一个工作中使用的算法?
二分查找的思想:
二分查找法使用的基本条件是一个有序的数组,通过从数组头部和尾部折半,判断要查找的数和mid位置数值的大小,来判断要查找的数是在那一半,之后继续折半查找,直至找到这个数或者最后小端大于大段则结束查找!
二 . 算法题(三选二作答)
1)实现二分查找递归版本和非递归版本
package com.freddy; /** * * @author FreddyTang * @function :两种方法实现二分查找 */ public class BinarySearch { /** * * @Author FreddyTang * @function :非递归方法实现二分查找!arr是要查找的数组,n是要查找的数,返回被查找的数的位置 */ /*{1,2,3,4,5,6}*/ public static int search(int []arr,int n){ int low=0;//低位 int high=arr.length-1;//高位 while(low<=high){//低位和高位不重复的时候或者相等的时候 int mid=(low+high)/2;//计算中间值 //如果相等 if(arr[mid]==n){ return mid;//结束方法 } if(arr[mid]<n){ low=mid+1; }else{ high=mid-1; } } //没找到 return -1; } /** * * @Author FreddyTang * @function :递归方法实现要查找的数,arr是要查找的数组,n是要查找的数,begin是低位,end是高位!返回被查找的数的位置 */ public static int search0(int []arr,int n,int begin ,int end){ int mid=(begin+end)/2; if(n<arr[begin]||n>arr[end]||arr[begin]>arr[end]){ return -1;//结束 } if(arr[mid]<n){ return search0(arr, n, mid+1, end); } else if(arr[mid]>n){ return search0(arr, n, begin, mid-1); }else{ return mid; } } public static void main(String[] args) { int [] arr={1,2,3,4,5,6}; System.out.println(BinarySearch.search(arr,6)); System.out.println(BinarySearch.search(arr,6)); } }
2)一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
方法一:
package com.freddy; public class Ball { public static void main(String[] args) { double sum1 = 0, sum2 = 0, hight = 100.0; for (int i = 0; i < 10; i++){ sum1 = sum1 + hight;//球从上下落的距离 System.out.println("sum1:"+sum1); hight = hight / 2;//50 25 if (i < 9) { sum2 = sum2 + hight;//球从地面弹起的距离 } } System.out.println("第10次落地时,共经过" + (sum1 + sum2) + "米"); System.out.println("第十次反弹高度为" + hight + "米"); } } //第10次落地时,共经过299.609375米 //第十次反弹高度为0.09765625米
方法二:
public static void count() { // 定义球的高度 double high = 100; // 定义球一共经过多少米,因为球是从100米高度掉下来,所以初始值给100 double totalLen = 100; for (int i = 0; i < 10; i++) { // 每次把球掉落的高度减去一倍 high = high / 2; // 计算球掉落弹起的米数 totalLen += high * 2; } System.out.println("第10次反弹高度为:"+high); System.out.println("第10次落地时,共经过多少 "+totalLen+" 米"); }
3)假设现在有OrderManager.java类,该类有四个方法createOrder、getOrderById、updateOrder、deleteOrder。
基于java多线程进行这四个接口的并发测试。启动线程数量做为参数传递main args[] 。
三、论述
1)简述工作中比较有成就感的项目,此项目中所扮演的角色,有没有系统重构或优化经验。
可能考察:1.你表达的逻辑思维能力; 2.回答问题时,不要跑题
浙公网安备 33010602011771号