面试题(一)北京宏林

今天去面试,有很多不会的地方,总结出来以方便自己以后的复习。
问答题:
一..抽象类和接口的区别;
1 .接口只能包含抽象方法,抽象类可以包含普通方法。
2. 接口只能定义静态常量属性,抽象类既可以定义普通属性,也可以定义静态常量属性。
3 .接口不包含构造方法,抽象类里可以包含构造方法。
4.抽象类不能被实例化,但不代表它不可以有构造函数,抽象类可以有构造函数,备继承类扩充
5.接口是核心,其定义了要做的事情,包含了许多的方法,但没有定义这些方法应该如何做。
6. 如果许多类实现了某个接口,那么每个都要用代码实现那些方法
7.如果某一些类的实现有共通之处,则可以抽象出来一个抽象类,让抽象类实现接口的公用的代码,而那些个性化的方法则由各个子类去实现。
所以,抽象类是为了简化接口的实现,他不仅提供了公共方法的实现,让你可以快速开发,又允许你的类完全可以自己实现所有的方法,不会出现紧耦合的问题。
二、阐述arrayList、vector.LinkedList的存储性能和特性。
ArrayList 和Vector他们底层的实现都是一样的,都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。
Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。
LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
Vector属于遗留容器(Java早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用,但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。
三、实现线程有几种方式。
有四种方式。
四、Session,Cookie的区别
答案如下
编程题
1.对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。

链:https://www.nowcoder.com/questionTerminal/78758d46ebf4492690262d2c6f809a7f?toCommentId=386378

//Java.
public class Solution{
//if not found, return -1;
public int binary_search(int[] array, int n){
if (array == null || array.length < 1)
return -1; //不需要寻找.
int top = 0, button = array.length - 1;
while (top <= button){
int mid = top + (button - top) / 2;
if (n < array[mid]){ //n在数组左边.
button = mid - 1;
}else if (n > array[mid]){ //n在数组右边.
top = mid + 1;
}else {
return mid; //find.
}
}
}
}

对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。

#!/usr/bin/env python3

def find_str_repeat(s):
        d = {}
        for i in range(len(s)):
                if d.get(s[i]):
                        return s[i]
                else:
                        d[s[i]]= i
        return False

def find_str_repeat1(s):
        d = {}
        for i in s:
                if d.get(i):
                        return i
                else:
                        d[i] = i
        return False

if __name__ == "__main__":
        s = "qywyer23tdd"
        print(find_str_repeat(s))
        print(find_str_repeat1(s))

JAVA实现一种排序
链接
写一个Singleton出来
class Singleton {
private static Singleton s;
private Singleton(){
System.out.println(“A Singleton Model example”);
}
public static Singleton getSigleton()
{
if(s==null)s=new Singleton();
return s;
}
}

数据库相关
一.存储过程和函数的区别
本质上没区别。只是函数有如:只能返回一个变量的限制。而存储过程可以返回多个。而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。执行的本质都一样。
函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少
1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
2. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象。
3. 存储过程一般是作为一个独立的部分来执行(EXEC执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。
4. 当存储过程和函数被执行的时候,SQL Manager会到procedure cache中去取相应的查询语句,如果在procedure cache里没有相应的查询语句,SQL Manager就会对存储过程和函数进行编译。
Procedure cache中保存的是执行计划 (execution plan) ,当编译好之后就执行procedure cache中的execution plan,之后SQL SERVER会根据每个execution plan的实际情况来考虑是否要在cache中保存这个plan,评判的标准一个是这个execution plan可能被使用的频率;其次是生成这个plan的代价,也就是编译的耗时。保存在cache中的plan在下次执行时就不用再编译了。
二、oracle中truncate和delete命令有何区别?
lianjie :
三、Oracle中Char和varchar2数据类型有什么区别?有数据“test”分别存放到char(10)和vchar2(10)的字段中,其存储长度有何区别?
char是定长字符类型,而varchar是变长字符类型。
有数据”test”分别存放到char(10)和varchar2(10)类型的字段中,其存储长度及类型?
用char(10)进行存储时,存储被补齐10个空格,其长度为10个字节,而varchar2的存储长度为4个字节
四,写出你最常用SQL语句的关键字
aa

猜你喜欢

转载自blog.csdn.net/qq_33148349/article/details/81416310
今日推荐