计算机基础知识整理
1.字符串+数字
1.applet 的方法
1、 public void init()
init()方法是 Applet 运行的起点。当启动 Applet 程序时,系统首先调用此方法,以执行初始化任务。
2、 public void start()
start()方法是表明 Applet 程序开始执行的方法。当含有此 Applet 程序的 Web 页被再次访问时调用此方法。因此,如果每次访问 Web 页都需要执行一些操作的话,就需要在 Applet 程序中重载该方法。在 Applet 程序中,系统总是先调用 init() 方法,后调用 start() 方法。
3、 public void stop()
stop()方法使 Applet 停止执行,当含有该 Applet 的 Web 页被其他页代替时也要调用该方法。
4、 public void destroy()
destroy()方法收回 Applet 程序的所有资源,即释放已分配给它的所有资源。在 Applet 程序中,系统总是先调用 stop() 方法,后调用 destroy() 方法。
5、 paint(Graphics g)
paint(Graphics g)方法可以使 Applet 程序在屏幕上显示某些信息,如文字、色彩、背景或图像等。参数 g 是 Graphics 类的一个对象实例,实际上可以把 g 理解为一个画笔。对象 g 中包含了许多绘制方法,如 drawstring() 方法就是输出字符串。
1.Java值传递
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | publicclassExample{ String str=newString("tarena"); char[]ch={'a','b','c'}; publicstaticvoidmain(String args[]){ Example ex=newExample(); ex.change(ex.str,ex.ch); System.out.print(ex.str+" and "); System.out.print(ex.ch); } publicvoidchange(String str,charch[]){ //引用类型变量,传递的是地址,属于引用传递。 str="test ok"; ch[0]='g'; } } |
正确答案: B 你的答案: D (错误)
tarena and abc
tarena and gbc
test ok and abc
test ok and gbc
1.java多线程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class Threads4{ public staticvoid main(String[] args){ new Threads4().go(); } public void go(){ Runnable r=new Runnable(){ public void run(){ System.out.print("foo"); } }; Thread t=new Thread(r); t.start(); } } |
从Java.lang.Thread类派生一个新的线程类,重写它的run()方法
实现Runnable接口,重写Runnable接口中的run()方法
正确答案: B 你的答案: C (错误)
dazhongdianping
dianpingdazhong
a和b都有可能
dianping循环输出,dazhong夹杂在中间
1.分配在内存哪个区域?
2.weblogic中开发消息Bean时的persistent与non-persisten的差别:
- persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此MDB可用的时候发送过来。
- non-persistent方式的消息将被丢弃。
正确答案: A B C D 你的答案: A B (错误)
session
Cookie
地址重写
隐藏域
1).隐藏表单域:<input type="hidden">,非常适合步需要大量数据存储的会话应用。
2).URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。
3).Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP
响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个
Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至
在客户端计算机重启后它仍可以保留其值
4).Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话
3.关于Java声明
4.包装类与数据类型,以及转换
1、整数类型byte(1个字节)short(2个字节)int(4个字节)long(8个字节)
2、字符类型char(2个字节)
3、浮点类型float(4个字节)double(8个字节)
基本数据类型转化成包装类是装箱 (如: int --> Integer)。
包装类转化成基本数据类型就是拆箱 (如:Integer --> int)。
包装类就是引用类型,基本数据类型就是值类型。所以选C 装箱、拆箱操作发生在:
引用类型与值类型之间
正确答案: D 你的答案: A (错误)
3.500000
3
2.000000
3.000000
’a’ = 1/3
5.如何获取ServletContext设置的参数值
getInitParameter获取Tomcat的server.xml中设置Context的初始化参数
getRequestDispatcher是请求转发。
init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法
service()方法处理客户机发出的所有请求
destroy()方法标志servlet生命周期的结束
6.3个访问权限
6.Java输入输出
正确答案: C 你的答案: A (错误)
java.io.inputStream
java.io.outputStream
java.io.inputStreamReader
java.io.outputStreamReader
Java创建对象的说法正确的有()
正确答案: A B C D 你的答案: A B C D (正确)
用new语句创建对象,是最常见的创建对象的方法。
运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
调用对象的clone()方法。
运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
6.Java常识
java源文件的后缀名是.java。源文件通过jvm虚拟机编译后会生成二进制字节码文件,后缀是.class
1) 事件源(Event Source):即事件发生的场所,就是指各个组件,如按钮等,点击按钮其实就是组件上发生的一个事件;
2) 事件(Event):事件封装了组件上发生的事情,比如按钮单击、按钮松开等等;
3) 事件***(Event Listener):负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相应的事件;
AOP不能替代OOP,OOP是obejct abstraction,而AOP是concern abstraction,前者主要是对对象的抽象,诸如抽象出某类业务对象的公用接口、报表业务对象的逻辑封装,更注重于某些共同对象共有行为的抽象,如报表模块中专门需要报表业务逻辑的封装,其他模块中需要其他的逻辑抽象 ,而AOP则是对分散在各个模块中的共同行为的抽象,即关注点抽象。一些系统级的问题或者思考起来总与业务无关又多处存在的功能,可使用AOP,如异常信息处理机制统一将自定义的异常信息写入响应流进而到前台展示、行为日志记录用户操作过的方法等,这些东西用OOP来做,就是一个良好的接口、各处调用,但有时候会发现太多模块调用的逻辑大都一致、并且与核心业务无大关系,可以独立开来,让处理核心业务的人专注于核心业务的处理,关注分离了,自然代码更独立、更易调试分析、更具好维护。
核心业务还是要OOP来发挥作用,与AOP的侧重点不一样,前者有种纵向抽象的感觉,后者则是横向抽象的感觉, AOP只是OOP的补充,无替代关系。
顶层容器包含JApplet、JDialog、JFrame和JWindow及其子类.
JFrame中就可以放Jtree(树形组件)
较典型的面向对象语言有:
复制效率
优化Hibernate所鼓励的7大措施:
1.尽量使用many-to-one,避免使用单项one-to-many
2.灵活使用单向one-to-many
3.不用一对一,使用多对一代替一对一
4.配置对象缓存,不使用集合缓存
5.一对多使用Bag 多对一使用Set
6.继承使用显示多态 HQL:from object polymorphism="exlicit" 避免查处所有对象
7.消除大表,使用二级缓存
下列关于包(package)的描述,正确的是()
正确答案: D 你的答案: A (错误)
包(package)是Java中描述操作系统对多个源代码文件组织的一种方式。
import语句将所对应的Java源文件拷贝到此处执行。
包(package)是Eclipse组织Java项目特有的一种方式。
定义在同一个包(package)内的类可以不经过import而直接相互使用。
2、import语句并没有将对应的java源文件拷贝到此处仅仅是引入,告诉编译器有使用外部文件,编译的时候要去读取这个外部文件。B错
3、Java提供的包机制与IDE没有关系。C错
4、定义在同一个包(package)内的类可以不经过import而直接相互使用。
解释性,编译性
下面关于程序编译说法正确的是()
正确答案: C 你的答案: D (错误)
java语言是编译型语言,会把java程序编译成二进制机器指令直接运行
java编译出来的目标文件与具体操作系统有关
java在运行时才进行翻译指令
java编译出来的目标文件,可以运行在任意jvm上
JDK提供的用于并发编程的同步器有哪些?
正确答案: A B C 你的答案: B C (错误)
Semaphore
CyclicBarrier
CountDownLatch
Counter
A,Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
B,CyclicBarrier 主要的方法就是一个:await()。await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行。
C,直译过来就是倒计数(CountDown)门闩(Latch)。倒计数不用说,门闩的意思顾名思义就是阻止前进。在这里就是指 CountDownLatch.await() 方法在倒计数为0之前会阻塞当前线程。
D,Counter不是并发编程的同步器
6.JSP
正确答案: A 你的答案: B (错误)
先取总记录数,得到总页数,最后显示本页的数据。
先取所有的记录,得到总页数,再取总记录数,最后显示本页的数据。
先取总页数,得到总记录数,再取所有的记录,最后显示本页的数据。
先取本页的数据,得到总页数,再取总记录数,最后显示所有的记录。
正确答案: A 你的答案: D (错误)
该页面可以使用 exception 对象
该页面发生异常会转向 error.jsp
存在 errorPage 属性时,isErrorPage 是默认为 false
error.jsp 页面一定要有isErrorPage 属性且值为 true
当isErrorPage ="true"时,页面会直接使用exception
6.原码,补码,反码
正确答案: B 你的答案: B (正确)
-126
-125
-32
-3
7.Java内部类
对于局部内部类,只有在方法的局部变量被标记为final或局部变量是effctively final的,内部类才能使用它们
成员内部类位于外部类内部,可以直接调用外部类的所有方法(静态方法和非静态方法)
还有更重要的是匿名类只能使用一次,而局部类则可以在自己的定义域内多次使用。
8. java threadlocal
ThreadLocal存放的值是线程封闭,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递
从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收
在Thread类中有一个Map,用于存储每一个线程的变量的副本
对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式
9.关于对象序列化描述
对象序列化的所属类需要实现Serializable接口
10.下面有关java的instanceof、?、&、&&说法正确
instanceof 可用来判断某个实例变量是否属于某种类的类型。
但是实例变量可以放置在前面也可以放置在后面,还可以判断某个类是否属于某个类的子类的类型
"?:" 三目运算符
&在逻辑运算中是非短路逻辑与,在位运算中是按位与
&& 逻辑运算:逻辑与
10. Java继承
子类能继承父类的所有成员
{
public static void main (String[] args)
{
new Car(). run();
}
private final void run()
{
System. out. println ("Car");
}
}
class Vehicle
{
private final void run()
{
System. out. println("Vehicle");
}
}
运行结果为 car
class Shape {
private Shape wf;
protected Shape() {
wf = this;
}
private int length() {
return 0;
}
private int width() {
return 0;
}
public int getArea() {
return wf.length()*wf.width();
}
}
public class OverridingShape extends Shape {
public int length() {
return 10;
}
//@Override 不是覆盖,基类该方法是private,子类不可见
public int width() {
return 10;
}
public static void main(String[] args) {
Shape s=new OverridingShape();
System.out.println(s.getArea());
//结果是0而不是100 调用的是父类的方法,然后访问的是父类的private方法
}
}
11.左增和右增
12.成员变量和局部变量的区别
this关键字
区分成员变量和局部变量的重名问题,this.name指的是类中的成员变量--而不是方法内部的
2)、局部变量:包括形参,方法局部变量,代码块局部变量,存在于方法的参数列表和方法定义中以及代码块中。
2、成员变量可以被public,protect,private,static等修饰符修饰,而局部变量不能被控制修饰符及 static修饰;两者都可以定义成final型。
3、成员变量存储在堆,局部变量存储在栈。局部变量的作用域仅限于定义它的方法,在该方法的外部无法访问它。成员变量的作用域在整个类内部都是可见的,所有成员方法都可以使用它。如果访问权限允许,还可以在类的外部使用成员变量。
4、局部变量的生存周期与方法的执行期相同。当方法执行到定义局部变量的语句时,局部变量被创建;执行到它所在的作用域的最后一条语句时,局部变量被销毁。类的成员变量,如果是实例成员变量,它和对象的生存期相同。而静态成员变量的生存期是整个程序运行期。
5、成员变量在累加载或实例被创建时,系统自动分配内存空间,并在分配空间后自动为成员变量指定初始化值,初始化值为默认值,基本类型的默认值为0,复合类型的默认值为null。(被final修饰且没有static的必须显式赋值),局部变量在定义后必须经过显式初始化后才能使用,系统不会为局部变量执行初始化。
13.Java多态
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
public void bark(){
System.out.println("狗可以吠叫");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal();
Animal b = new Dog();
a.move();
b.move();
b.bark();
}
}
但是要调用非静态方法时,由于Animal类的对象是用Cat()来实例化的,这个非静态方法在运行时会被重写,从而输出子类中方法重写后的结果。这就是“编译看左边,运行看右边”。
14.关于类变量调用和静态变量
已知如下类说明:
1 2 3 4 5 6 7 8 | publicclassTest{ private float f=1.0f; intm=12; static int n=1; public static void main(String args[]){ Test t=newTest(); } } t.f = 1.0 this.n Test.m Test.n |
B:this的使用时针对在方法内部使局部变量等值于实例变量而使用的一个关键字,此处的n是静态变量而非实例变量 所以this的调用会出错(试想一下,static本来是全类中可以使用的,是全局的,你非得this去调用,这不是区分局部变量和实例变量的分水线吗?但是此处是全局的,不需要区分)在static的main方法里用有问题, 如果是普通的方法里this.n没问题(静态方法不能以任何方式引用this和super关键字。)
C:m是实例变量,什么是实例变量:就是需要new 一个对象出来才能使用的,这里直接用类名就调用了,jvm怎么知道m是谁?
D:类变量可以通过类直接调用
正确答案: A 你的答案: B (错误)
能编译通过,并正确运行
因为使用了未初始化的变量,所以不能编译通过
以错误的方式访问了静态方法
能编译通过,但因变量为null,不能正常运行
另外,在其他类的静态方法中也是可以调用公开的静态方法,此题hello方法是使用public修饰的所以在MyApplication中调用hello也是可以的。
总结:即使Test test=null;这里也会加载静态方法,所以test数据中包含Test类的初始化数据。(静态的,构造的,成员属性)
因此test.hello是会调用到hello方法的。
15.Python 中万物皆为对象
-
函数可以赋值给一个变量
-
函数可以作为元素添加到集合对象中
-
函数可以作为参数值传递给其它函数
-
函数可以当做函数的返回值
16.python socket操作
-
使用recvfrom()接收TCP数据 错误 udp! socket.recv是tcp协议,recvfrom是udp传输 返回值是(data,address) 其中data是包含接收数据的字符串,address是 发送数据 的套接字地址。
-
使用getsockname()获取连接套接字的远程地址 错误 自己的! 返回套接字自己的地址 通常是一个元组(ipaddr,port)
-
使用connect()初始化TCP服务器连接 连接到address处的套接字。正确 一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
-
服务端使用listen()开始TCP监听 正确
-
17.Python赋值深浅拷贝
18.Python运行代码:
World!')
print('__name__
value: ', __name__)
def main():
print('This message is from main function')
if __name__ ==
'__main__':
main()
print_module.py的代码如下:
import print_func
print("Done!")
Hello World! __name__ value: print_func Done!
19.Python常识
- Python 是弱类型脚本语言,变量就是变量,没有特定类型,因此不需要声明。
- 但每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
- 用 del 语句可以释放已创建的变量(已占用的资源)。
20.Java赋值语句
int i =1000;
float f = 45.0; 错误,没有f
char s = ‘\u0639’错误 选择没有;
Object o = ‘f’; 可以把任何一种数据类型的变量赋给Object类型的变量,因为java所有类默认继承Object,基本数据类型赋值给Object会先装箱,装箱之后就是Object的子类了
String s = "hello,world\0";
Double d = 100; 错误
long test=012
float f=-412
int other =(int)true
double d=0x12345678
byte b=128
21.Java接口和抽象类
正确答案: A B D 你的答案: B D (错误)
抽象类可以有构造方法,接口中不能有构造方法
抽象类中可以有普通成员变量,接口中没有普通成员变量
抽象类中不可以包含静态方法,接口中可以包含静态方法
一个类可以实现多个接口,但只能继承一个抽象类。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。 不能用new实例化
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
jdk1.8之前
接口
1.多实现
2.变量类型默认且只能为为public static final
3.函数类型默认且只能为public,只能有public类型的静态成员函数
4.非静态成员函数没有方法体,静态成员函数有方法体
5.子类必须实现所有接口函数
6.可以有main方法;可以new一个接口,需要在方法体中实现所有接口函数
7.没有构造器
抽象类
1.单继承
2.变量类型不限(静态变量+非静态变量)
3.函数类型不限(静态函数+非静态函数)
4.非静态函数包含没有方法体的抽象函数. 有方法体的普通函数
5.子类可以不覆写父类的抽象方法,但子类也要申明为抽象类;子类可以选择覆写父类的非抽象方法
6.可以有main方法;不可以new一个抽象类
7.可以有构造器
Jdk1.8
接口中可以有default类型的方法,实现类可以选择实现该方法
意义:默认方法的主要优势是提供一种拓展接口的方法,而不破坏现有代码。另一个优势为该方法是可选的,子类可以根据不同的需求Override或默认实现。
B、接口允许定义成员,但必须是常量。
C、抽象类和接口类的无法实例化,任何编译器中直接使用new会报错。
D、同A,单继承,多实现。
22.在Java中,HashMap中是用哪些方法来解决哈希冲突的?
23.JavaWEB中有一个类,通知:
HttpSessionAttributeListener:可以实现此侦听器接口获取此web应用程序中会话属性列表更改的通知;
HttpSessionBindingListener:当该对象从一个会话中被绑定或者解绑时通知该对象,这个对象由HttpSessionBindingEvent对象通知。这可能是servlet程序显式地从会话中解绑定属性的结果,可能是由于会话无效,也可能是由于会话超时;
HttpSessionObjectListener:没有该接口API;
HttpSessionListener:当web应用程序中的活动会话列表发生更改时通知该接口的实现类,为了接收该通知事件,必须在web应用程序的部署描述符中配置实现类;
HttpSessionActivationListener:绑定到会话的对象可以侦听容器事件,通知它们会话将被钝化,会话将被激活。需要一个在虚拟机之间迁移会话或持久会话的容器来通知所有绑定到实现该接口会话的属性。
24.try-catch-finally 规则( 异常处理语句的语法规则 )
1) 必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。
2) 必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。3) catch 块与相应的异常类的类型相关。
4) 一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。即Java虚拟机会把实际抛出的异常对象依次和各个catch代码块声明的异常类型匹配,如果异常对象为某个异常类型或 其子类的实例,就执行这个catch代码块,不会再执行其他的 catch代码块
5) 可嵌套 try-catch-finally 结构。
6) 在 try-catch-finally 结构中,可重新抛出异常。
7) 除了下列情况,总将执行 finally 做为结束: JVM 过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击
由此可以看出,catch只会匹配一个,因为只要匹配了一个,虚拟机就会使整个语句退出{
public void method()
{
try
{
System.out.println("进入到try块");
}
catch (Exception e)
{
System.out.println("异常发生了!");
}
finally
{
System.out.println("进入到finally块");
}
System.out.println("后续代码");
}
public static void main(String[] args)
{
ExceptionTest test = new ExceptionTest();
test.method();
}
}
链接:https://www.nowcoder.com/questionTerminal/f6351ea54cf94fad808b7af7cd18067b
来源:牛客网
下面哪些情况可以引发异常:
正确答案: A B C 你的答案: A B (错误)
数组越界
指定URL不存在
使用throw语句抛出
使用throws语句
25.堆,栈
1 2 3 4 5 6 7 | classA { private String a = “aa”; public boolean methodB() { String b = “bb”; final String c = “cc”; } } |
25.java 堆管理,新生代和老年代
这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。
堆的内存模型大致为:
这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。
堆的内存模型大致为:
本人使用的是 JDK1.6,以下涉及的 JVM 默认值均以该版本为准。
默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。
老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 to,以示区分。
默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。
JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。
因此,新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间。
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
正确答案: D 你的答案: D (正确)
5120m,1024m
5120m,2048m
10240m,1024m
10240m,2048m
正确答案: C D E 你的答案: B C E (错误)
栈空间满
年轻代空间满
老年代满
持久代满
System.gc()
2,老年代:当Survivor区也满了之后就通过Minor GC将对象复制到老年代。老年代也满了的话,就将触发Full GC,针对整个堆(包括新生代、老年代、持久代)进行垃圾回收。
3,持久代:持久代如果满了,将触发Full GC。
26.super
根据以下代码段,执行new Child("John", 10); 要使数据域data得到10,则子类空白处应该填写( )。
class Parent { private int data; public Parent(int d){ data = d; } } class Child extends Parent{ String name; public Child(String s, int d){ ___________________ name = s; } } |
正确答案: D 你的答案: C (错误)
data = d;
super.data = d;
Parent(d);
super(d);
27.关键字保留字
28.Java 集合
28。类之间存在以下几种常见的关系:
正确答案: A B C 你的答案: A C (错误)
“USES-A”关系
“HAS-A”关系
“IS-A”关系
“INHERIT-A”关系
28.重写和重载
28.数据库的键
主键(Primary Key):从候选键中,选中用来作为唯一标识的属性或者属性组被称为主键;
29.数据库的插入
30。数据库的设计过程
实体之间的联系有一对一、一对多、多对多。
属性为实体或联系在某一方面的特征。
数据库管理系统是位于用户和OS之间的一层管理 软 件 ,数据库系统是由数据库,硬件,软件,数据库管理员组成。
31 锁
锁的类型有三种:
共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页; 通常是该页被读取完毕,S锁立即被释放。
排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;X锁一直到事务结束才能被释放。该事务既可读又可写
更新(U)锁:用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的页将要被更新时,则升级为X锁;U锁一直到事务结束时才能被释放。
以下( )封锁违反两段锁协议。
正确答案: D 你的答案: C (错误)
Slock A … Slock B … Xlock C ………… Unlock A … Unlock B … Unlock C
Slock A … Slock B … Xlock C ………… Unlock C … Unlock B … Unlock A
Slock A … Slock B … Xlock C ………… Unlock B … Unlock C … Unlock A
Slock A …Unlock A ……Slock B … Xlock C ………...Unlock B … Unlock C
两端锁
两段锁协议(Two-Phase Locking――2PL)
① 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。
② 在释放一个封锁之后,事务不再申请和获得其它任何封锁。
即事务的执行分为两个阶段:
第一阶段是获得封锁的阶段,称为扩展阶段。
定理:若所有事务均遵守两段锁协议,则这些事务的所有交叉调度都是可串行化的。
对于遵守两段协议的事务,其交叉并发操作的执行结果一定是正确的。值得注意的是,上述定理是充分条件,不是必要条件。一个可串行化的并发调度的所有事务并不一定都符合两段锁协议,存在不全是2PL的事务的可串行化的并发调度。
同时我们必须指出,遵循两段锁协议的事务有可能发生死锁。
此时事务T1 、T2同时处于扩展阶段,两个事务都坚持请求加锁对方已经占有的数据,导致死锁。
为此,又有了一次封锁法。一次封锁法要求事务必须一次性将所有要使用的数据全部加锁,否则就不能继续执行。因此,一次封锁法遵守两段锁协议,但两段锁并不要求事务必须一次性将所有要使用的数据全部加锁,这一点与一次性封锁不同,这就是遵守两段锁协议仍可能发生死锁的原因所在。
32 层次模型
・ 冗余节点法――两个实体的多对多的联系转换为两个一对多的联系,该方法的优点是节点清晰,允许节点改变存储位置,缺点是需要额外的存储空间,有潜在的数据不一致性。
・ 虚拟节点分解法――将冗余节点转换为虚拟节点,虚拟节点是一个指引元,指向所代替的节点,该方法的优点是减少对存储空间的浪费,避免数据不一致性,缺点是改变存储位置可能引起虚拟节点中指针的修改。
33.关系数据库中的选择,投影,连接,除法
选择
定义:在关系中选择在指定属性上有确定值的关系的子集。表示为:
选择运算是选择关系中行的子集,即选择满足条件的元组
例:
1.查询信息系(IS系)全体学生
σ Sdept=‘IS’(Student)
2.查询年龄小于20岁的学生
σ Sage<20(Student)
选择运算的特性:
投影
投影是选取关系中列的子集。设模式R上关系r,X是R上属性的子集(x就是列),r到 X上的投影r`表示为:
投影操作是从列的角度进行行的运算。投影的结果不是原来的关系,是X中的几列属性。
特别注意
由于投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组,因为取消了某些属性列之后,就可能出现重复行,投影结果中不应该包含重复行
例子:查询学生关系Student中都有哪些系,即查询关系Student上所在系属性上的投影
Student关系如图所示:
Sname | Sdept |
---|---|
李勇 | CS |
刘晨 | CS |
王小明 | MA |
张超 | IS |
求 : π Sdept(Student)
因为Student关系原来有4个元组,但是我们的投影结果需要取消重复的CS元组,因此投影结果只有三个元组:
Sdept |
---|
CS |
MA |
IS |
投影的特性
连接(Join):自然连接,等值连接
定义: 连接也称为θ连接。它是从两个关系的笛卡尔积中选取属性间满足一定条件的元组。
记作:
(θ为比较符: >,<,≥,≤,=,≠)
1.等值连接
θ为 = 符号的连接运算称为等值连接。它是从关系R与S的广义笛卡尔积中选取A , B 属性值相等的那些元组。
(被水印遮住的地方是A=B)
2.自然连接
自然连接是一种特殊的等值连接。它要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中把重复的属性列去掉
表示为: R⋈S={t r⌒ts |tr∈R∧ts∈S∧tr[B]=ts[B]}
(自然连接也可看作是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系。)
所以等值连接和自然连接的区别是
自然连接是去除了重复的属性列的!
例题
求R和S的自然连接,等值连接,以及非等值连接R[C<e> R :</e>
A | B | C |
---|---|---|
a1 | b1 | 5 |
a1 | b2 | 6 |
a2 | b3 | 8 |
a2 | b4 | 12 |
S:
B | E |
---|---|
b1 | 3 |
b2 | 7 |
b3 | 10 |
b3 | 2 |
b5 | 2 |
自然连接:R⋈S
A | B | C | E |
---|---|---|---|
a1 | b1 | 5 | 3 |
a1 | b2 | 6 | 7 |
a2 | b3 | 8 | 10 |
a2 | b3 | 8 | 2 |
等值连接:R[R.B=S.B]S
A | R.B | C | S.B | E |
---|---|---|---|---|
a1 | b1 | 5 | b1 | 3 |
a1 | b2 | 6 | b2 | 7 |
a2 | b3 | 8 | b3 | 10 |
a2 | b3 | 8 | b3 | 2 |
非等值连接:R[C<e> A R.B C S.B E a1 b1 5 b2 7 a1 b1 5 b3 10 a1 b2 6 b2 7 a1 b2 6 b3 10 a2 b3 8 b3 10
</e>
A | R.B | C | S.B | E |
---|---|---|---|---|
a1 | b1 | 5 | b2 | 7 |
a1 | b1 | 5 | b3 | 10 |
a1 | b2 | 6 | b2 | 7 |
a1 | b2 | 6 | b3 | 10 |
a2 | b3 | 8 | b3 | 10 |
除法运算(division)
设关系R除以关系S的结果为关系T,则T包含所有在R但不在S中的属性及其值,且T的元组与S的元组的所有组合都在R中
除法的结果可以用计算象集的方法来解决,以一道题为例来说明怎么求除法
例题:已知关系R和S如下,求R➗S的结果
第一步 : 因为R÷S所得到的属性值 是包含于R,但是S不包含的属性, 所以R➗S得到的属性列有(A,B),S在(C,D)属性上的投影为{(c1,d1),(c2,d2)}
第二步 : 关系R中,AB属性可以取值为={(a1,b1),(a2,b2),(a3,b3)}
第三步 : 求象集
- (a1,b1)={(c1,d1),(c2,d2),(c3,d3)}
- (a2,b2)={(c2,d2)}
- (a3,b3)={(c1,d1),(c2,d2)}
第四步: 从第三步中可以发现,有象集(a1,b1)和(a3,b3)包含了S在(C,D)属性上的投影,所以R÷S={(a1,b1),(a3,b3)}
A | B |
---|---|
a1 | b1 |
a3 | b3 |
33.数据库与数据库管理系统
1) 实体完整性:规定表的每一行在表中是惟一的实体。举例:设属性A是关系R的主属性,则属性A不能取空值(NULL) 2) 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。
3) 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
4) 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。
物理独立性是模式不变,内模式改变,如数据库存储结构发生改变,选用另一种数据结构,由数据库管理员对各个模式/内模式的映像做相应改变,可以使得模式不变 ,从而保证了应用程序也不变
34.范式
35.数据库的修改
修改表结构包括:增加字段、删除字段、增加约束、删除约束、修改缺省值、修改字段数据类型、重命名字段、重命名表等。这些操作都是用 alter table 命令来完成。常用用法如下:
1、增加字段:ALTER TABLE 表名 ADD 字段名 字段类型;
2、删除字段:ALTER TABLE 表名 DROP COLUMN 字段列名;
3、增加约束:ALTER TABLE 表名 ADD CHECK(字段名<>'')或者 ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(字段名);4、删除约束:ALTER TABLE 表名 DROP CONSTRAINT 约束名;
5、修改字段缺省值:ALTER TABLE 表名 ALTER COLUMN 字段名 SET DEFAULT 默认值;
6、 修改字段数据类型:ALTER TABLE 表名 ALTER COLUMN 字段名TYPE l类型;
7、重命名字段:ALTER TABLE 表名 RENAME COLUMN 旧字段名TO 新字段名;
8、重命名表:ALTER TABLE 表名 RENAME TO 新表名。
36 删除
B: truncate table book 是删除表中的数据,删除速度比delete更快,无法撤回(回退)。
C: delete from book 删除数据表中的数据,可以回退,可添加where 子句。
37 复合索引
MongoDB 属于文档型非关系数据库;
PostgreSQL 关系型数据库
Redis 属于KV键值数据库
HBase 属于列数据库
40. 树
AEFDHZMG
分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是()
正确答案: D 你的答案: 空 (错误)
(100,80,60,90,120,130,110)
(100,120,110,130,80,60,90)
(100,80,90,60,120,110,130)
(100,60,80,90,120,110,130)
二叉排序树查找在在最坏的情况下,需要的查找时间取决于树的深度:
当二叉排序树接近于满二叉树时,其深度为 l o g 2 n 最坏情况下查找时间为O( l o g 2 n) 与折半查找是同数量级的。
最坏情况下 当二叉树形成单枝树时,其深度为n,最坏情况下查找时间为O(n),与顺序查找属于同一数量级。
————————————————
版权声明:本文为CSDN博主「蓝墨49」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq447995687/article/details/95376501
- 平衡二叉树定义
平衡二叉树(Balanced Binary Tree),它是一棵空树,或者是具有以下性质:
- 它的左右两个子树的深度差的绝对值不超过1;
- 它的左右两个子树也分别是平衡二叉树。
————————————————
版权声明:本文为CSDN博主「蓝墨49」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq447995687/article/details/95376501
正确答案: D 你的答案: 空 (错误)
28、36、18、46、35
18、36、28、46、35
46、28、18、36、35
46、36、18、28、35
正确答案: A 你的答案: B (错误)
1234567
1245367
1376254
1327654
完全二叉树是由满二叉树而引出来的,若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(即1~h-1层为一个满二叉树),第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
堆一般都是用完全二叉树来实现的。
41.线性表
42.图
深度优先遍历
广度优先遍历
拓扑排序
关键路径算法
(1) 选择一个入度为0的顶点,输出
(2) 从图中删除此顶点以及所有的出边
循环结束后,若输出的顶点数小于网中的顶点数,则说明有回路
正确答案: B C D 你的答案: D (错误)
1,2,3,4,5,6,7
1,2,4,3,6,7,5
1,3,4,5,7,6,2
1,2,4,6,7,5,3
43.hash
HASH 函数冲突处理方式包括:
- 开放定址法
- 再哈希法
- 链地址法
- 设置公共溢出区法
44.堆
正确答案: C 你的答案: 空 (错误)
A、C、D、G、H、M、P、Q、R、X
A、C、M、D、H、P、X 、G、0、R
A、D、P、R、C、Q、X 、M、H、G
A、D、C、M、P、G、H、X 、R、Q
正确答案: A B C D 你的答案: A B C D (正确)
堆排序的时间复杂度为O(nlogn)
整个构建堆的时间复杂度为O(n)
堆排序的空间复杂度为O(1)
堆排序是一种不稳定的排序算法
45.栈
设链式栈中结点的结构为(data ,link),且top是指向栈顶的指针,若想在链式栈的栈顶插入一个由指针s所指的结点,则应执行( )操作。
正确答案: C 你的答案: 空 (错误)
top->link=s; 栈顶的下一个节点指向s,原栈中数据丢失。错误
s->link=top->link; top->link=s; 相当于把s放到了top节点后当作第二节点。错误
s->link=top; top=s; s的link指向原top,新的top指向s。正确
s->link=top; top=top->link; 把s放到头节点之前,再更新头节点为原第二节点,s和原top丢失。错误
队列
基本操作
◆ 初始化:front=rear=0。
◆ 队列为空:front=rear。
◆ 队满:(rear + 1) % MaxSize == fornt
◆ 入队:将新元素插入rear所指的位置,然后rear加1。
◆ 出队:删去front所指的元素,然后加1并返回被删元素。
sq.front=(sq.front+1)% maxsize;
◆ 取队首元素:返回fornt指向的元素值
46.数组和指针
正确答案: B 你的答案: 空 (错误)
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。
用运算符sizeof 可以计算出数组的容量(字节数)
指针可以随时指向任意类型的内存块。
用运算符sizeof 可以计算出指针所指向内容的容量(字节数)
正确答案: C 你的答案: C (正确)
cde
字符"c"
字符"c"的地址
不确定
1 | fprintf(stderr, "%s\n", s); |
47.排序算法
桶排序(不稳定) O(n) O(n) O(n)
基数排序(稳定) O(n) O(n) O(n)
归并排序(稳定) O(nlogn) O(nlogn) O(nlogn)
快速排序(不稳定) O(nlogn) O(nlogn) O(n^2)
堆排序(不稳定) O(nlogn) O(nlogn) O(nlogn)
希尔排序(不稳定) O(n^1.25)
冒泡排序(稳定) O(n^2) O(n) O(n^2)
选择排序(不稳定) O(n^2) O(n^2) O(n^2)
直接插入排序(稳定) O(n^2) O(n) O(n^2)
快速排序
堆排序
归并排序
插入排序
正确答案: A 你的答案: 空 (错误)
10,15,12,18,19,36,45,21
10,15,12,18,19,45,36,21
15,10,12,18,19,36,45,21
10,15,12,19,18,45,36,21
下列排序算法中,已基本有序却反而变得更复杂的排序算法是:( )。
正确答案: B 你的答案: 空 (错误)
冒泡排序
快速排序
堆排序
简单选择排序
- 快排采用分治的思想,第一次循环结束时,它实际上会产生一个轴,轴左边的都小于轴值,右边的都大于轴值,这样通过轴就分成了两个子序列,再对两个子序列递归快排,最终得到排好序的序列。
- 快排对越混乱的数据,排序效果越好,现在说一下为什么对一个基本有序的却更复杂,那是因为这样会导致每次轴划分出的两个子序列,一个趋近于1的数量级,一个趋近于n数量级,那么递归快排就近似总是对n做排序,时间复杂度O(n²),而且非常不符合快排的思想。比较好的情况是每次递归大致平分成两个n/2数量级的子序列,时间复杂度O(nlogn)
大概是:24直接放进去 24
第一趟 15比24小放到24前面,比较1次 15 24
正确答案: A 你的答案: 空 (错误)
{21,25,5,17,9,23,30}
{25,23,30,17,21,5,9}
{21,9,17,30,25,23,5}
{5,9,17,21,23,25,30}
分割后子序列内部的排序算法是直接插入排序
具有n个整数的数组A=[27,9,14,16,10]使用冒泡排序(Bubble Sort)算法排序,算法伪代码如下: |
正确答案: A 你的答案: C (错误)
9,10,14,16,27
9,14,16,10,27
9,14,10,16,27
9,16,10,14,27
48.存储结构
- 顺序存储
- 链式存储
- 索引存储
- 哈希(或散列)存储
元素按值有序且采用顺序存储结构首先折半查找,必须要求地址是连续的,数组,而且有明确的边界。然后还要求数组里面存放的数据是有序的,要不然无异于随机查找。
49.查找
当增加或减少节以及节点的关键码改变时,只需将该节点调整到所在的块即可。在空间复杂性上,分块查找的主要代价是增加了一个辅助数组。
一般先用二分查找索引表,确定需要查找的关键字在哪一块,然后再在相应的块内用顺序查找。
null | 顺序查找 | 二分查找 | 分块查找 |
---|---|---|---|
表的结构 | 有序、无序 | 有序 | 块内无序、块间有序 |
表的存储 | 顺序、链式 | 顺序 | 顺序、链式 |
平均查找长度 | 最大 | 最小 | 中间 |
时间复杂度 | O(n) | O(log2n) | 中间 |
顺序 分块 折半 哈希
-
二分查找首先要求数据是有序的,同时要求能随机访问数据元素, 有序数组可以, 链表不行,
-
二分查找因为每次都是从中间点开始查找,所以最坏情况是目标元素存在于最边缘的情况。最坏为O(LogN)
正确答案: B C D 你的答案: A B (错误)
10
8
4
1
50.旅行商
正确答案: D 你的答案: 空 (错误)
旅行商问题(travelling salesman problem)
带时间窗的旅行商问题 (travelling salesman problem with time windows)
有紧前关系的旅行商问题 (travelling salesman problem with precedence constraints)
多旅行商问题 (multiple travelling salesmen problem)
51.共识算法
区块链中,常见的共识算法有 PBFT,Raft,PoW,PoS,DPoS,Ripple等等。
采用 PoS 共识算法的项目有 (未来的)以太坊Ethereum、Peercoin、Nxt等等;
52.手机解锁
正确答案: C 你的答案: 空 (错误)
1000种量级
10000种量级
100000种量级
500000种以上