诺瓦科技面试(2021/8/7)
提示:对面试问的知识点做记录汇总,便于以后查看。
# 一、面向对象的是哪个特性
要点: 面向对象就是将程序模块化,对象化。面向对象主要有三个特征:封装、继承和多态。
- 继承: 继承就是父类的相关的属性、方法,可以被子类重复使用,子类不必再在自己的类里面重新定义一回,父类里有的子类可以直接拿过来用,提高代码的重用性。而对于子类特有的属性和方法,子类可以自己来扩展了
- 封装就是把具体事物的属性和通过这些属性来实现一些动作的具体方法放到一个类里面。
- 多态:.多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
多态的例子: 有一个动物类,内部有一个吃的方法。猫类,狗类继承了动物类,重写了吃的方法,猫的吃的方法为猫吃鱼,狗的吃的方法为狗吃骨头。 定义一个实现类,定义对象动物,在调用吃的方法时,如果右边新建的是猫的对象,调用时指向猫吃鱼方法。如果新建的是狗的对象,那么抵用勇士指向狗类,执行狗吃骨头方法。
二、final关键字
1.数据
2.方法
3.类
回忆static关键字
静态变量:又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它。静态变量在内存中只存在一份。
静态方法在类加载的时候就存在了,它不依赖于任何实例。所以静态方法必须有实现,也就是说它不能是抽象方法。【只能访问所属类的静态字段和静态方法,方法中不能有 this 和 super 关键字。】
静态语句块在类初始化时运行一次。
*4. 静态内部类
非静态内部类依赖于外部类的实例,而静态内部类不需要。
public class OuterClass {
class InnerClass {
}
static class StaticInnerClass {
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
InnerClass innerClass = outerClass.new InnerClass();
StaticInnerClass staticInnerClass = new StaticInnerClass();
}
}
*5. 静态导包
在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。 import static com.xxx.ClassName.**
*5. 初始化顺序
静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序。
三、抽象类与接口
1.抽象类与普通类区别
抽象类是抽象方法和非抽象方法的集合 ** 抽象类和抽象方法都使用 abstract 关键字进行声明。如果一个类中包含抽象方法,那么这个类必须声明为抽象类。**抽象类和普通类最大的区别是,抽象类不能被实例化,需要继承抽象类才能实例化其子类
包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:
1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
2)抽象类不能用来创建对象;
3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
2. 接口
**接口中只包含常量和抽象方法,而没有变量和方法的实现;接口对类来说是一套规范,一套行为准则;接口不是了,所以不能被实例化。
接口中可以含有 变量和方法。但是要注意
- 接口的成员(字段 + 方法)默认都是 public 的,并且不允许定义为 private 或者 protected。
方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。 - 接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误)
- 接口是抽象类的延伸,在 Java 8 之前,它可以看成是一个完全抽象的类,也就是说它不能有任何的方法实现。从 Java 8 开始,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高了。在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类。
这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。
接口特点: 1.有interface来定义 2.接口中所有的成员变量默认由public static final修饰(相当于全局常量) 3.接口中所有方法都默认由public static修饰的。接口没有构造方法 4.实现接口中的类必须提供接口中所有方法的具体实现内容 5.多个无关的类可以实现同一个接口 7.一个类可以实现多个无关的接口 8.与继承关系类似,接口与实现类之间存在多态性 9.接口也可以继承另一个接口,用extends关键字
3.接口与抽象类的区别:
1.接口不能含有任何抽象方法,但抽象类可以。【.抽象类可以理解为抽象方法和非抽象方法的混合体,接口中的方法则完全是抽象方法。一般来说,有关系的类才能继承同一个抽象类,而无关的类不可能有同一个抽象类,但无关的了可以实现同一个接口】 2.类可以实现多个接口,但只能有一个父类;接口之间可以有多继承。例如 public interface A extends B, C (B,C也是接口) 3.接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。 4.接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限
四 生产者和消费者
生产者与消费者模型详解与举例
生产者与消费者模型详解与简单例子
总结:这里是对生产者和消费者模式的两个简单的例子。可以参考了解 ** 如果遇到多个生产者该咋办 多生产者模型的具体代码:出现的问题以及解决方案 JAVA多线程之生产者消费者模型 总结:使用wait和notify
五 java中的容器有哪些
容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。
1.Collection
1.TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。 2. HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说 使用 Iterator 遍历。 HashSet 得到的结果是不确定的。 3. LinkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。
1.ArrayList:基于动态数组实现,支持随机访问。 Vector:和 ArrayList 类似,但它是线程安全的。 2.LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此, LinkedList 还可以用作栈、队列和双向队列。
1.LinkedList:可以用它来实现双向队列。 2.PriorityQueue:基于堆结构实现,可以用它来实现优先队列。
2.Map
1.TreeMap:基于红黑树实现。 2.HashMap:基于哈希表实现。 3.HashTable:和 HashMap类似,但它是线程安全的,这意味着同一时刻多个线程可以同时写入 HashTable 并 且不会导致数据不一致。它是遗留类,不应该去使用它。现在可以使ConcurrentHashMap 来支持线程安 全,并且ConcurrentHashMap 的效率会更高,因为 ConcurrentHashMap 引入了分段锁。 4.LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。
- Hashmap 和 Hashtable 之间的区别
HashMap和Hashtable都实现了Map接口,很多特性非常相似。但是,他们有以下不同点:
①. HashMap允许键或者值是null,而Hashtable不允许键或者值是null。 ②.Hashtable线程安全,HashMap非线程安全,Hashtable并发性不如ConcurrentHashMap,需要线程安全的场合可以用ConcurrentHashMap替换HashMap(Hashtable效率低)。 ③.HashMap继承AbstractMap抽象类,Hashtable继承Dictionary类,是遗留类。 ④. HashMap提供了可供应用迭代键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
六 计算机网络中的一些知识点
1.TCP和UDP的不同
2.咋样实现Udp的可靠连接:
udp如何实现可靠性传输? 传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。
实现确认机制、重传机制、窗口确认机制。
如果你不利用Linux协议栈以及上层socket机制,自己通过抓包和发包的方式去实现可靠性传输,那么必须实现如下功能:
发送:包的分片、包确认、包的重发
接收:包的调序、包的序号确认
目前有如下开源程序利用udp实现了可靠的数据传输。分别为RUDP、RTP、UDT。
3.cookie 和 session 的区别(详细看文档)
1.cookie和session都是用来跟踪浏览器用户身份的会话方式。 2.session和cookie的最大区别在于session是保存在服务端的内存里面,而cookie保存于浏览器或客户端文件里面; 3.session是基于访问的进程,记录了一个访问的开始到结束,当浏览器或进程关闭之后,session也就“消失”了,而cookie(持久cookie)更多地被用于标识用户,它可以是长久的,用于用户跟踪和识别唯一用户。 4.session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。平常所说的cookie主要指的是另一类cookie——持久cookie(persistent cookies)。持久cookie是指存放于客户端硬盘中的 cookie信息(设置了一定的有效期限)
4.粘包
- TCP是个“流”协议,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。
七 sql
1.子查询和连接查询有啥不一样。那个查询效率更高。
一 、子查询就是查询中又嵌套的查询,子查询比较灵活,方便,形式多样,适合用于作为查询的筛选条件或相关子查询中; (2)而表连接更适合与查看多表的数据; (3)表连接都可以用子查询,但不是所有子查询都能用表连接替换; (4)子查询不一定需要两个表有关联字段,而连接查询必须有字段关联。
二、子查询 和 连接查询哪个效率更高
(1)一般情况下表连接的效率要高于子查询; (2)如果子查询只有一条记录且需要唯一的列,最好用子查询; (3)对于数据量多的用连接查询更快,因为子查询会多次遍历所有的数据,而连接查询只会遍历一次。
|