一、Day8
1.1 选择题
(1)以下说法错误的是()
A.数组是一个对象
B.数组不是一种原生类
C.数组的大小可以任意改变
D.在Java中,数组存储在堆中连续内存空间里
答案:C
B.Java中,数据类型分为基本数据类型(或叫做原生类、内置类型)和引用数据类型。原生类是指基本数据类型,因此数组不是原生类。
C.数组一旦定义完后,大小是固定的,无法扩容。
(2)Test.main()函数执行后的输出是()
public class Test { public static void main(String [] args){ System.out.println(new B().getValue()); } static class A{ protected int value; public A(int v) { setValue(v); } public void setValue(int value){ this.value = value; } public int getValue(){ try{ value++; return value; } catch(Exception e){ System.out.println(e.toString()); } finally { this.setValue(value); System.out.println(value); } return value; } } static class B extends A{ public B() { super(5); setValue(getValue() - 3); } public void setValue(int value){ super.setValue(2 * value); } }
答案:22 34 17
(3)以下程序运行结果是
public class Test1 { static int cnt = 6; static { cnt += 9; } public static void main(String[] args) { System.out.println("cnt =" + cnt); } static { cnt /= 3; } }
A.cnt=5 B.cnt=2 C.cnt=3 D.cnt=6
答案:A
1.2编程题
public class Main { public static boolean isLengthCompare(String s1,String s2){ int length=s1.length()-s2.length(); if(length<0){ return true; }else { return false; } } public static boolean isLexicCompare(String s1,String s2){ int length =s1.compareTo(s2); if(length<0){ return true; }else { return false; } } public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); //S需要来读入回车键,否则会占用后面的字符串数组空间 String S=scanner.nextLine(); String []arr=new String[n]; for (int i = 0; i <n; i++) { arr[i]=scanner.nextLine(); } int L1=0; int L2=0; for (int i = 0; i < n-1; i++) { if(!isLengthCompare(arr[i],arr[i+1])){ L1++; } if(!isLexicCompare(arr[i],arr[i+1])){ L2++; } } if(L1==0&&L2==0){ System.out.println("both"); }else if(L1==0&&L2!=0){ System.out.println("lengths"); }else if(L1!=0&&L2==0){ System.out.println("lexicographically"); }else { System.out.println("none"); } } }
二、Day9
2.1 选择题
(1)关于JAVA堆,下面说法错误的是()
A.所有类的实例和数组都是在堆上分配内存的
B.对象所占的堆内存是有自动内存管理系统回收
C.堆内存由存活和死亡对象,空闲碎片去组成
D.数组是分配在栈中的
答案:D
实例和数组都是new出来的对象,关键字new出来的对象都是在堆上分配内存的。
(2)Java语言的下面几种数组复制方法中,哪个效率最高 ?
A.for循环逐一复制
B.System.arraycopy
C.Array.copyOf
D.使用clone方法
答案:B
1.for的速度之所以慢是因为下标表示法每次都从起点开始寻找到指定下标处,另外就是它每一次循环都要判断一次是否达到数组最大长度和进行一次额外的纪录下标值的加法运算。
2.System.arraycopy是浅拷贝,也就是说对于非基本类型而言,它拷贝的是对象的引用,而不是新建一个新的对象。
3.Arrays.copyOf源码:
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
Arrays.copyof new了数组并且调用了系统拷贝时间更长。
4. clone对于对象来说是深拷贝,对于数组来说是浅拷贝,clone的效率是高于Arrays.copyOf的。
综上 System.arraycopy>Object.clone>Arrays.copyOf>for
(3)对文件名为Test.java的Java代码描述正确的是()
class Person { String name = "No name"; public Person(String nm) { name = nm; } } class Employee extends Person { String empID = "0000"; public Employee(String id) { empID = id; } } public class Test { public static void main(String args[]) { Employee e = new Employee("123"); System.out.println(e.empID); } }
答案:编译错误
Employee继承Person类,子类的构造方法会默认调用父类的无参构造方法,由于父类没有不带参数的构造方法,编译失败。
(4)有关下述Java代码描述正确的选项是()。
public class TestClass { private static void testMethod(){ System.out.println("testMethod"); } public static void main(String[] args) { ((TestClass)null).testMethod(); } }
A.编译不通过
B.编译通过,运行异常,报NullPointerException
C.编译通过,运行异常,报IllegalArgumentException
D.编译通过,运行异常,报NoSuchMethodException
E.编译通过,运行异常,报Exception
F.运行正常,输出testMethod
答案:D
testMethod是静态方法不依靠实例来调用,是类的方法,可通过类名调用。
(5)在jdk1.5之后欧,下列Java程序输出结果为()。
int i=0; Integer j = new Integer(0); System.out.println(i==j);//自动拆箱 System.out.println(j.equals(i));
A.true,false
B.true,true
C.false,true
D.false,false
E.对于不同的环境结果不同
F.程序无法执行
答案:B
2.2编程题
public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n=in.nextInt(); int m=in.nextInt(); int sum=getNum(n,m); System.out.print(sum); } public static int getNum(int n,int m){ //当n=1或m=1时,路径个数为m+n if(n==1&&m>=1||m==1&&n>=1){ return m+n; } //递归求m-1的路径总条数和n-1路径总条数 return getNum(n-1,m)+getNum(n,m-1); } }
三、Day10
3.1 选择题
(1) 下面代码的输出结果是什么?
public static void main(String[] args) { try{ int i = 100 / 0; System.out.print(i); }catch(Exception e){ System.out.print(1); //e.printStackTrace();//异常处理后,try 块内的代码将不再执行,try-catch 后的代码仍会执行 throw new RuntimeException();//throw 一但抛出异常,其后的代码将不再被执行 }finally{ System.out.print(2); } System.out.print(3); }
答案: 12
(2) 有代码片段如下:
关于下述代码片段叙述正确的是:
A : 输出的结果: 13
B: 语句: b6= b4 + b5 编译出错
C: 语句: b3= b1 + b2 编译出错
D: 运行期抛出异常
byte b1=1,b2=2,b3,b6; final byte b4=4,b5=6; b6=b4+b5; b3=(b1+b2); System.out.println(b3+b6);
答案: C
运算符: ' + ' 会自动向上转型,转变成 int 类型,由于 b4 , b5 被final 修饰,不会发生向上转型, b1+b2 向上转型为 int 类型, 与 b3 类型不匹配,编译错误
四、Day11
4.1 选择题
(1) 以下描述正确的是
A. CallableStatement是PreparedStatement的父接口
B. PreparedStatement是CallableStatement的父接口
C. CallableStatement是Statement的父接口
D. PreparedStatement是Statement的父接口
CallableStatement 继承自 PreparedStatement, PreparedStatement 继承自 Statement
(2) 下列关于容器集合类的说法正确的是?
A. LinkdeList 继承自 List
B. AbstractSet 继承自Set
C. HashSet 继承自 AbstractSet
D. WeakMap 继承自 HashMap
List , Set 是接口,接口是用来被实现的,而不是被继承的
对于HashSet 的实现的源码:
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
weakMap不是Java集合框架中的类,它是JavaScript中的一个类. 所以它并没有继承自任何类
对于HashMap 的实现源码:
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>
(3) ArrayList list =new ArrayLiat(20)中的list扩充了几次?
A. 0 B. 1 C. 2 B. 3
private static final int DEFAULT_CAPACITY = 10; private static final Object[] EMPTY_ELEMENTDATA = {}; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. Any * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA * will be expanded to DEFAULT_CAPACITY when the first element is added. */ /*存储ArrayList 元素的数组缓冲区. ArrayLiat 的容量就是这个数组缓冲区的长度. 任何带有elementData ==DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的空数组列表 将在添加第一个元素时扩展为DEFAULT_CAPACITY*/ transient Object[] elementData; public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
在创建ArrayList 对象时, 若给定初始大小容量, 直接将本类中的 elementData 数组在堆上开辟相应大小空间的数组; 若没有给定初始大小,则对应两个空数组. 接下来每次扩容时 1.5倍扩容
五、Day12
5.1 选择题
(1) 下列哪种异常是检查异常,需要在编写程序时声明?
A. NullPointerException
B. ClassCastException
C. FileNotFoundException
D. IndexOutOfBoundsException
六、Day13
6.1 选择题
(1) 一个关系数据库文件中的各条纪录().
A. 前后顺序不能任意颠倒,一定要按照输入的顺序排列
B. 前后顺序可以任意颠倒,不影响数据库中的数据关系
C. 前后顺序可以任意颠倒,但排序顺序不同,统计处理的结果就可能不同
D. 前后顺序不能任意颠倒,一定要按照关键字字段值的顺序排列
关系数据的逻辑性强而物理性弱,因此关系型数据库的各条纪录前后顺序可以改变,不影响数据库中的关系.由于数据库查询时有自己的逻辑关系,因此在处理数据时结果是相同的.
(2) 下列关于视图说法错误的是:()
A. 视图是从一个或多个基本表导出的表,它是虚表
B. 视图一经定义就可以和基本表一样被查询,删除和更新
C. 某一用户可以定义若干个视图
D. 视图可以用来定义新的视图
答案: B
视图是指计算机数据库中的视图, 是一个虚拟表, 其内容有查询定义.
语法: create view 视图名称 as select column from 表名
视图包含一系列带有名称的行和列数据. 但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询索引用的表,并且在引用视图时动态生成.
视图一旦定义,只能够被查询和删除,要想更新,先把数据删除在进行插入
(3)在Mysql中,订单表 ( 订单号,雇员代号,地区代号,订购日期 ) 中订单号为主键,要删除订单中前三年以前的信息, SQL 为:
A. delete from 订单表 where 订购日期<getdate()+3
B. delete from 订单表 where 订购日期<DATEADD(yy,3,getdate())
C. delete from 订单表 where 订购日期<getdate()-3
D. delete from 订单表 where 订购日期<DATEADD(yy,-3,getdate())
DATEADD() 函数在日期中添加或减去指定时间间隔.
语法
DATEADD(datapart , number, date)
datapart 参数的取值范围是{yy/yyyy , qq/q , mm/m , dy/y , dd/d , wk/ww , dw/w , hh , mi/n , ss/s ,ms , mcs , ns}
number 添加的时间间隔
date 合法的日期表达式
GETDATE() 函数从 SQL Server 返回当前的时间和日期.
MySQL 中获取当前时间和日期的函数是 now() ,日期加减是 data_add() 函数与data_sub()函数. 例: select data add(now(), interval 1 day) daytime
答案: D
(4) 负责数据库中查询操作的数据库语言是().
A. 数据定义语言
B. 数据管理语言
C. 数据操纵语言
D. 数据控制语言
数据定义语言: DDL
数据定义语言: DDL 用来创建数据库中的各种对象: 表,视图,索引,同义词,聚簇等.例如:
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
DDL 操作是隐形提交的,不能rollback.
数据操作语言: DML
主要负责数据的基本操纵, 包含查询及删除,增加和修改等操作
数据库控制语言:DCL
数据库控制语言 DCL 用来授予或回收访问数据库的某种特权, 并控制数据库操纵事务发生的时间及效果, 对数据库实行监视等.如:
(1) GRANT: 授权.
(2) ROLLBACK [WORK] TO [SAVEPOINT] : 退回到某一点. ROLLBACK: 回滚.
回滚命令使数据库状态回到上次最后提交的状态. 其格式为: SQL>TOLLBACK.
(3) COMMIT [WORK] : 提交.
(5) SQL 语句中修改表结构的命令是()
A. MODIFY TABLE
B. MODIFY STRUCTURE
C. ALTER TABLE
D. ALTER STRUCTURE
修改表结构的关键字都是 alter table 表名, 再跟具体修改的语句. 如:
添加表字段
alter table table_name add 字段名称 字段类型
删除表字段
alter table table_name drop 字段名称
修改字段
alter table table_name change 旧字段名称 新字段名称 新字段类型
修改字段的数据类型
alter table table_name modify 字段名称 字段类型
6.2编程题
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n=in.nextInt(); int m=in.nextInt(); int []step=new int[m+1]; for(int i=0;i<step.length;i++){ step[i]=Integer.MAX_VALUE; } //通过比较到达每个位置的最小步数来完成 step[n]=0; for(int i=n;i<m;i++){ if(step[i]==Integer.MAX_VALUE){ continue; } List<Integer> list=div(i); for(int j=0;j<list.size();j++){ int num=list.get(j); if(i+num<=m&&step[i+num]!=Integer.MAX_VALUE){ step[i+num]=Math.min(step[i]+1,step[i+num]); }else if(i+num<=m){ step[i+num]=step[i]+1; } } } if(step[m]==Integer.MAX_VALUE){ System.out.println(-1); }else{ System.out.println(step[m]); } } public static List<Integer> div(int n){ List<Integer> list=new ArrayList<>(); for(int i=2;i*i<=n;i++){ if(n%i==0){ list.add(i); if(n/i!=i){ list.add(n/i); } } } return list; } }
七、Day14
7.1 选择题
(1) 定义学生、教师和课程的关系模式 S (S#,Sn,Sd,Dc,SA )(其属性分别为学号、姓名、所在系、所在系的系主任、年龄); C ( C#,Cn,P# )(其属性分别为课程号、课程 名、先修课); SC ( S#,C#,G) (其属性分别为学号、课程号和成绩),则该关系为( )
A. 第一范式
B. 第二范式
C. 第三范式
D. BCNF范式
范式是符合某一种级别的关系模式的集合.
关系数据库中的关系必须满足一定的要求, 满足不同程度要求的为不同范式. 目前关系数据库有六种方式: 第一范式(1NF) , 第二范式(2NF) , 第三范式(3NF) , Boyce-Codd 范式(BCNF) , 第四范式(4NF) 和第五范式(5NF).
满足最低要求的范式是第一范式(1NF). 在第一范式的基础上进一步满足更多要求的成为第二范式(2NF) , 其余范式以此类推. 一般来说, 数据库只需要满足第三范式(3NF) 就足够了.
第一范式(1NF) : 列不可再分
第一范式是最基本的范式. 确保每个属性都是不可分割的原子值,即每个属性不能包含多个值或值的集合。
第一范式的合理遵循需要根据系统的实际需求来定. 比如某些数据库系统中需要用到 "地址" 这个属性, 本来直接将 "地址" 属性设计成一个数据库的字段就行. 但是如果系统经常会访问 "地址" 属性中的 "城市" 部分, 那么就非要将 "地址" 这个属性重新拆分为省份, 城市, 详细地址等多个部分进行存储, 这样在对地址中某一部分操作的时候将非常方便. 这样设计才算满足了数据库的第一范式.
第二范式(2NF): 属性完全依赖于主键
第二范式(2NF) 是在第一范式(1NF) 的基础上建立起来的, 即满足第二范式(2NF) 必须先满足第一范式(1NF). 并且非主键属性完全依赖于候选键(主键)而不是部分依赖于候选键,即不存在部分依赖关系。
每一行数据只能与其中一列相关, 即一行数据只做一件事. 只要数据列中出现数据重复,就要把表拆分开来
第三范式(3NF): 属性不依赖于其他非主属性 , 属性直接依赖于主键
数据不能存在传递关系, 即每个属性都跟主键有直接关系而不是间接关系.像: a-->b-->c 属性之间含有这样的关系, 是不符合第三范式的.
比如 学生院校关系模式: student(学号, 姓名 , 年龄 , 性别 , 所在院校 , 院校地址 , 院校电话)
这样的一个关系就存在传递关系. 学号--> 所在院校-->(院校地址, 院校电话)
这样的表结构,我们拆开来,如下:
(学号, 姓名, 年龄,性别, 所在院校) --(所在院校, 院校地址,院校电话).
答案: B
(2) 下面不属于数据库系统特点的是()
A. 数据冗余度高
B. 数据具有完整性
C. 数据共享性好
D. 数据独立性高
数据库系统的特点为高共享, 低冗余, 独立性高,具有完整性
(3) 将实体-联系模型转换为关系模型时,实体之间多对多联系在关系模型中的实现方式是()
A. 建立新的关系
B. 建立新的属性
C. 建立新的关键字
D. 建立新的实体
(4) 关于求和函数,以下说法正确的是()
A. sum 返回表达式中所有数的总和, 因此只能用于数字类型的列
B. avg 返回表达式中所有数的平均值, 可以用于数字行和日期行的列
C. max 和 min 可以用于字符型的列
D. count 可以用于字符型的列
答案: A
count 不是求和函数,不符合题意
(5)
答案: C
(6) 某关系表有: 员工(部门编号, 部门名称, 员工编号, 姓名 ,性别, 年龄), 则其主码为().
A. 部门编号 , 员工编号
B. 员工编号
C. 姓名
D. 部门编号
答案:A
7.2编程题
public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n=in.nextInt(); int []arr=new int[n]; int sum=0; int multiply=1; for(int i=0;i<n;i++){ arr[i]=in.nextInt(); } //当数组为有序时,当加入第i个球时,如果sum!=1&&sum<=multiply,那加入第i+1个球是必定不是幸运的袋子,直接break结束递归. Arrays.sort(arr); System.out.print(count(arr,arr.length,0,sum,multiply)); } //pos 表明判断有 pos 个球的袋子是否为幸运的袋子,同时是遍历第pos个球的初始位置 public static int count(int []arr,int n,int pos,int sum,int multiply){ int count=0; for(int i=pos;i<n;i++){ sum+=arr[i]; multiply*=arr[i]; if(sum>multiply){ //如果前 i 个球是幸运的袋子,在有前i 个球的基础上,去判断 i+1个球的幸运的袋子 count=count+1+count(arr,n,i+1,sum,multiply); }else if(sum==1){ //sum==1时是拥有一个球的袋子,即球的号码为1,虽然不是幸运袋子,但1+任何数>1*任何数,因此可以在这个情况下判读如何取舍第二个球成为幸运袋子. count=count+count(arr,n,i+1,sum,multiply); }else{ break; } sum-=arr[i]; multiply/=arr[i]; //因为相同号码是无区别的,因此跳过相同号码的球. while(i<n-1){ if(arr[i]==arr[i+1]){ i++; }else{ break; } } } return count; }