牛客刷题笔记

jupiter
2023-12-30 / 4 评论 / 52 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年12月30日,已超过327天没有更新,若内容或图片失效,请留言反馈。

mysql

1.MySQL的NULL值处理方法

在MySQL中不能使用 = NULL 或 != NULL 等比较运算符在列中查找 NULL 值 。

要用IS NULL 或 IS NOT NULL才会进行NULL值或非NULL值得查找。

2.从一张表中选取数据插入到另一张表中

INSERT INTO 语句用于向一张表中插入新的行。

SELECT INTO 语句从一张表中选取数据插入到另一张表中。常用于创建表的备份复件或者用于对记录进行存档。

3.关系代数运算中的集合运算符和关系运算符

4.having必须跟在group By后面

having必须跟在group By后面,不然会报错In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'db_sql.course_sku_publish_record.id'; this is incompatible with sql_mode=only_full_group_by ... 展开

5.关于mysql的insert语句

insert字段名顺序与字段值顺序一致即可,可以给部分或所有字段名加``。

Mysql中表student_info(id,name,birth,sex),字段类型都是varchar,插入:1018 , 赵六 , 2003-08-02 , 男;SQL正确的是()?

A insert overwrite student_info values('1018' , '赵六' , '2003-08-02' , '男');

B insert into student_info values(1018 , '赵六' , '2003-08-02' , '男');

C insert into student_info(birth,id,name,sex) values('2003-08-02' ,'1018' , '赵六' , '男');

D insert into student_info value('1018' , '赵六' , '2003-08-02' , '男');

正确答案:C

你的答案:D

官方解析:A执行报错,插入时是insert into不是insert overwrite;B执行报错,id是varchar类型,插入的1018需要加上单引号;D执行报错,插入时是values不是value;所以C正确,字段名顺序与字段值顺序一致即可,可以给部分或所有字段名加``。

知识点:数据库、SQL

6.MySQL中ALTER TABLE命令的用法

MySQL中ALTER TABLE命令可以修改数据表的表名或数据表的字段。但是接不同后缀意义不同,比如:

  • 要修改表名或索引名时,可以用RENAME函数;当然RENAME也可以更改列名,但是后面要加TO,且它只会更改列的名字,并不更改定义。
  • 要修改字段定义和名称,可以用MODIFY或CHANGE函数。但是MODIFY只改字段定义,不改名字;CHANGE是两个都可以修改。
  • 要修改字段默认值,可以用ALTER 字段名 SET DEFULT 更改值。

1.要将employee 的表名更改为 employee_info,下面MySQL语句正确的是:

A ALTER TABLE employee RENAME employee_info;

B ALTER TABLE employee MODIFY employee_info;

C ALTER TABLE employee ALTER employee_info;

D ALTER TABLE employee CHANGE employee_info;

正确答案:A

你的答案:B

官方解析:本题考察知识点:MySQL中ALTER TABLE命令的用法
MySQL中ALTER TABLE命令可以修改数据表的表名或数据表的字段。但是接不同后缀意义不同,比如:要修改表名或索引名时,可以用RENAME函数;当然RENAME也可以更改列名,但是后面要加TO,且它只会更改列的名字,并不更改定义。要修改字段定义和名称,可以用MODIFY或CHANGE函数。但是MODIFY只改字段定义,不改名字;CHANGE是两个都可以修改。要修改字段默认值,可以用ALTER 字段名 SET DEFULT 更改值。所以根据题意,要修改表名,只能用RENAME函数,因此A正确;BCD则分别是修改字段的方法。

知识点:数据库、SQL

7.MySql修改表名的两种方法

rename table 旧表名 to 新表名;
alter table 旧表名 rename [as] 新表名

8.MySQL中ALTER TABLE修改字段用法

-- 新增字段
ALTER TABLE 表名 ADD COLUMN 字段名 字段类型;

-- 在name字段后面新增一个age列
ALTER TABLE tuser ADD COLUMN age int(11) DEFAULT NULL COMMENT '年龄' AFTER name;
# AFTER:在某字段后, BEFOR:在某字段之前

-- 在表后追加一列
ALTER TABLE tuser ADD COLUMN age int(11) DEFAULT NULL COMMENT '年龄';

-- 修改字段
ALTER TABLE tuser CHANGE name user_name varchar(32) DEFAULT NULL COMMENT '姓名';
#  ALTER TABLE 表名  CHANGE 旧字段名 新字段名 新数据类型;
-- 修改字段类型
ALTER TABLE tuser MODIFY name varchar(32) DEFAULT NULL COMMENT '姓名';
# ALTER TABLE 表名 MODIFY  字段名  数据类型;

-- 删除字段
ALTER TABLE tuser  DROP name;
# ALTER TABLE 表名  DROP 字段名;

9.多表删除时,delete和from之间必须要写明想要删除记录的表名。

Mysql中表student_table(id,name,birth,sex),删除name重复的id最大的记录,比如'张三'重复2次,id分别是1、2,则删除id=2的记录,保留id=1的记录。如下SQL正确的是()?

A delete from student_table where id in (
select t2.*
from
(select name,count(*) as c1 from student_table GROUP BY name having c1 > 1)t1
left join
(select name, max(id) as id from student_table group by name ) t2
on t1.name = t2.name ) ;

B delete from student_table t0
inner join (
select t2.*
from
(select name,count(*) as c1 from student_table GROUP BY name having c1 > 1)t1
left join
(select name, max(id) as id from student_table group by name ) t2
on t1.name = t2.name ) t3
on t0.id = t3.id ;

C delete t0
from student_table t0
inner join (
select t2.*
from
(select name,count(*) as c1 from student_table GROUP BY name having c1 > 1)t1
left join
(select name, max(id) as id from student_table group by name ) t2
on t1.name = t2.name ) t3
on t0.id = t3.id ;

D delete student_table
from student_table t0
inner join (
select t2.*
from
(select name,count(*) as c1 from student_table GROUP BY name having c1 > 1)t1
left join
(select name, max(id) as id from student_table group by name ) t2
on t1.name = t2.name ) t3
on t0.id = t3.id ;

10.COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)而COUNT(*) 函数才返回表中的记录数

11.MySQL添加用户、删除用户、授权及撤销权限

创建用户
 insert into mysql.user(Host,User,Password) values("localhost","test",password("1234"));

这样就创建了一个名为:test 密码为:1234 的用户。

注意:==此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器(例如192.168.1.10),或某个网段(例如192.168.1.%)可以远程登录。==

为用户授权:
授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 

首先为用户创建一个数据库(testDB):

mysql>create database testDB;

授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限):

mysql>grant all privileges on testDB.* to test@localhost identified by '1234';
mysql>flush privileges;//刷新系统权限表,即时生效

如果想指定某库的部分权限给某用户本地操作,可以这样来写:

mysql>grant select,update on testDB.* to test@localhost identified by '1234';
mysql>flush privileges; 

常用的权限有select,insert,update,delete,alter,create,drop等。可以查看mysql可授予用户的执行权限了解更多内容。

2.4 授权test用户拥有所有数据库的某些权限的远程操作:  

mysql>grant select,delete,update,create,drop on *.* to test@"%" identified by "1234";
#test用户对所有数据库都有select,delete,update,create,drop 权限。

2.5 查看用户所授予的权限:

mysql> show grants for test@localhost;
撤销已经赋予用户的权限:

revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:

mysql>grant all on *.* to dba@localhost;
mysql>revoke all on *.* from dba@localhost;

12.drop、trustcate、delete

1:处理效率:drop>trustcate>delete

2:删除范围:drop删除整个表(结构和数据一起删除);trustcate删除全部记录,但不删除表结构;delete只删除数据

3:高水位线:delete不影响自增ID值,高水线保持原位置不动;trustcate会将高水线复位,自增ID变为1。

13.mysql select 字段重命名

as可以做重命名,不过也可以省略as,空格隔开新名称即可。

14.mysql设置外键

todo

2.java

1.java中接口、接口属性、接口方法的修饰符合

java接口的修饰符:abstract(默认不写。interface本身就是抽象的,加不加abstract都一样)
接口中字段的修饰符:public static final(默认不写)
接口中方法的修饰符:public abstract(默认不写)

2.java中的数组创建形式

声明的二维数组中第一个中括号中必须要有值,它代表的是在该二维数组中有多少个一维数组。

下面哪个语句是创建数组的正确语句?( )

A float f[][] = new float[6][6];

B float []f[] = new float[6][6];

C float f[][] = new float[][6];

D float [][]f = new float[6][6];

E float [][]f = new float[6][];

正确答案:ABDE

3.关于java继承

在java中,下列对继承的说法,正确的是( )

A 子类能继承父类的所有成员

B 子类继承父类的非私有方法和状态

C 子类只能继承父类的public方法和状态

D 子类只能继承父类的方法

正确答案:A

官方解析:Constructors, static initializers, and instance initializers are not members andtherefore are not inherited.(构造器、静态初始化块、实例初始化块不继承)

4.java线程的start()和run()的区别

t.run直接执行代码,按顺序打印代码;

t.start是另起线程,与当前线程同时竞争cpu资源,结果存在不确定性

下面程序的运行结果是:( )

public static void main(String args[]) {
    Thread t = new Thread() {
           public void run() {
                pong();
           }
     };
    t.run();
    System.out.print("ping");
}
static void pong() {
    System.out.print("pong");
}

A pingpong

B pongping

C pingpong和pongping都有可能

D 都不输出

E pong

F ping

5.java集合体系

判断对错。List,Set,Map都继承自继承Collection接口。

A 对

B错

正确答案:B

你的答案:A

参考答案:答案:B List,Set等集合对象都继承自Collection接口 Map是一个顶层结果,不继承自Collection接口

6.this不能在static的方法中使用

已知有下列Test类的说明,在该类的main方法的横线处,则下列哪个语句是正确的?()

public class Test
{
private float f = 1.0f;
int m = 12;
static int n = 1;
public static void main (String args[])
{
Test t = new Test();
————————
}
}

A t.f = 1;

B this.n = 1;

C Test.m = 1;

D Test.f = 1;

正确答案:A

你的答案:B

A的答案中变量虽然为private,但因为main函数在该类中,所以即使private也仍可使用,B的答案static变量不能使用this

7.Java中的byte,short,char进行计算时都会提升为int类型。

代码片段:

byte b1=1,b2=2,b3,b6; 
final byte b4=4,b5=6; 
b6=b4+b5; 
b3=(b1+b2); 
System.out.println(b3+b6);

关于上面代码片段叙述正确的是()

A 输出结果:13

B 语句:b6=b4+b5编译出错

C 语句:b3=b1+b2编译出错

D 运行期抛出异常

正确答案:C

你的答案:A

参考答案:C. 被final修饰的变量是常量,这里的b6=b4+b5可以看成是b6=10;在编译时就已经变为b6=10了 而b1和b2是byte类型,java中进行计算时候将他们提升为int类型,再进行计算,b1+b2计算后已经是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会通过,需要进行强制转换。 Java中的byte,short,char进行计算时都会提升为int类型。

8.boolean 类型不能转换成任何其它数据类型。

Java中可以将布尔值与整数进行比较吗 ?

A 可以

B 不可以

正确答案:B

你的答案:A

官方解析:boolean 类型不能转换成任何其它数据类型。

9.java中的char是两个字节

执行如下程序代码

char chr = 127;
int sum = 200;
chr += 1;
sum += chr;

后,sum的值是()

备注:同时考虑c/c++和Java的情况的话

A 72

B 99

C 328

D 327

正确答案:AC

你的答案:A

java中只有byte, boolean是一个字节, char是两个字节, 所以对于java来说127不会发生溢出, 输出328

但是对于c/c++语言来说, char是一个字节, 会发生溢出, 对127加一发生溢出, 0111 1111 --> 1000 0000, 1000 0000为补码-128, 所以结果为200-128=72

10.java中Object类的方法有哪些?

  1. equals(Object obj): 该方法用于比较当前对象与参数对象是否相等。
  2. hashCode(): 该方法返回该对象的哈希码值。
  3. toString(): 该方法返回该对象的字符串表示。
  4. clone(): 该方法创建并返回该对象的副本。
  5. finalize(): 该方法是垃圾回收器在对该对象进行清理之前调用的方法。
  6. getClass(): 该方法返回表示此对象的运行时类(包含该对象的类的对象)的Class对象。
  7. wait(long timeout): 该方法使当前线程等待,直到另一个线程调用该对象的notify()notifyAll()方法,或者经过指定的时间量。
  8. wait(long timeout, int nanos): 该方法使当前线程等待,直到另一个线程调用该对象的notify()notifyAll()方法,或者经过指定的时间量和纳秒数。
  9. notify(): 该方法唤醒正在等待该对象监视器的单个线程(如果没有线程在等待,则抛出IllegalMonitorStateException异常)。
  10. notifyAll(): 该方法唤醒正在等待该对象监视器的所有线程。

在JAVA中,下列哪些是Object类的方法()

A synchronized()

B wait()

C notify()

D notifyAll()

E sleep()

正确答案:BCD

你的答案:BCDE

参考答案:A synchronized Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 B C D 都是Object类中的方法 notify(): 是唤醒一个正在等待该对象的线程。 notifyAll(): 唤醒所有正在等待该对象的线程。 E sleep 是Thread类中的方法 wait 和 sleep的区别: wait指线程处于进入等待状态,形象地说明为“等待使用CPU”,此时线程不占用任何资源,不增加时间限制。 sleep指线程被调用时,占着CPU不工作,形象地说明为“占着CPU睡觉”,此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。

11.java中整数类型 默认为 int 带小数的默认为 double

在基本JAVA类型中,如果不明确指定,整数型的默认是什么类型?带小数的默认是什么类型?

A int float

B int double

C long float

D long double

正确答案:B

你的答案:A

参考答案:整数类型 默认为 int 带小数的默认为 double

12.java访问控制修饰符

  • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
  • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
  • public : 对所有类可见。使用对象:类、接口、变量、方法
  • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

我们可以通过以下表来说明访问权限:

修饰符当前类同一包内子孙类(同一包)子孙类(不同包)其他包
publicYYYYY
protectedYYYY/N(说明N
defaultYYYNN
privateYNNNN

13.java中创建线程的方法

  1. 实现Runnable接口:这是最常用的方法。创建一个实现了Runnable接口的类,然后实现run()方法。这个run()方法将包含线程应该运行的代码。然后,创建一个Thread对象,并将Runnable对象作为参数传递给Thread的构造函数。最后,调用Thread对象的start()方法来启动线程。
  2. 继承Thread类:这是另一种创建线程的方法,但是通常不推荐使用,因为Java不支持多重继承。创建一个继承了Thread类的类,然后重写run()方法。然后,创建一个Thread对象,并调用start()方法来启动线程。
  3. 使用Callable和Future:这是一种更现代的方法,主要用于并发编程。Callable接口与Runnable接口类似,但Callable可以返回结果并且可以抛出异常。Future接口代表异步计算的结果。通过使用ExecutorService,你可以执行Callable任务并获取Future对象,然后使用Future对象的get()方法获取结果。

14.jvm内存:堆区栈区存储

下列Java代码中的变量a、b、c分别在内存的____存储区存放。

class A {
    private String a = “aa”;
    public boolean methodB() {
        String b = “bb”;
        final String c = “cc”;
    }
}

A 堆区、堆区、堆区

B 堆区、栈区、堆区

C 堆区、栈区、栈区

D 堆区、堆区、栈区

E 静态区、栈区、堆区

F 静态区、栈区、栈区

正确答案:C

你的答案:F

参考答案:答案是C a是类中的成员变量,存放在堆区 b、c都是方法中的局部变量,存放在栈区

15.java流体系

16.java异常体系

20190213193033108

17.java类加载过程

Java类加载过程是Java虚拟机(JVM)运行时将类文件加载到内存中的过程。这个过程可以分为三个阶段:加载、链接(验证、准备、解析)和初始化。

  1. 加载:这是类加载过程的第一个阶段,主要任务是加载类。JVM通过类的全限定名来获取定义此类的二进制字节流。这个过程主要通过以下几种方式完成:

    • 通过类路径(Classpath)查找类文件(.class文件)。
    • 从JAR或ZIP文件中读取,这些文件可能被放在类路径中。
    • 从网络或其他源动态加载。
    • 通过Java反射机制从已加载的类中生成。
  2. 链接:这个阶段是验证、准备和解析阶段,主要任务是确保被加载的类文件的正确性,为类的静态变量分配内存并设置初始值,以及解析符号引用。

    • 验证:确保被加载的类文件的正确性,没有安全方面的隐患。
    • 准备:为类的静态变量分配内存,并设置默认的初始值。
    • 解析:将符号引用转换为直接引用。符号引用是在编译时生成的,包含了被引用的类的全限定名;而直接引用可以直接指向数据。
  3. 初始化:这是类加载过程的最后一个阶段,主要任务是执行类构造器方法<clinit>()。这个方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块(但不执行其中的方法)组成的。JVM会创建Class对象,并执行<clinit>()方法。

注意,类加载器在执行完这三个阶段后,会为这个类生成一个Class对象,这个Class对象在JVM中表示这个类的类型信息。每个Class对象都对应于Java虚拟机中的元空间的一个类或接口的符号引用。

此外,Java类加载器有三种:

  1. 启动类加载器(Bootstrap Class Loader):负责加载核心类库,如 rt.jar、resources.jar、charsets.jar等,它是其他所有类加载器的父类加载器。由于该类加载器负责加载的是核心类库,所以它是不负责扩展类的加载的。
  2. 扩展类加载器(Extension Class Loader):该类加载器负责加载JRE的扩展目录(java.ext.dirs系统属性或者java.library.path)中的类库,它是ExtensionClassLoader的父类加载器。由于该类加载器是ClassLoader中的sun.misc.Launcher$ExtClassLoader的默认实现,所以一般情况下我们不需要直接使用扩展类加载器。
  3. 系统类加载器(System Class Loader):也被称为应用程序类加载器(Application Class Loader),它负责在应用程序的classpath中查找并加载类。它是ClassLoader中的sun.misc.Launcher$AppClassLoader的默认实现,也是我们最常直接使用的类加载器。

    以下哪项不属于java类加载过程?

    A 生成java.lang.Class对象

    B nt类型对象成员变量赋予默认值

    C 执行static块代码

    D 类方法解析

    正确答案:B

    你的答案:D

    参考答案:不应该选D,而应该选B 类的加载包括:加载,验证,准备,解析,初始化。 选项A:生成java.lang.Class对象是在加载时进行的。生成Class对象作为方法区这个类的各种数据的访问入口。 选项B:既然是对象成员,那么肯定在实例化对象后才有。在类加载的时候会赋予初值的是类变量,而非对象成员。 选项C:这个会调用。可以用反射试验。 选项D:类方法解析发生在解析过程。

18. sleep、wait、yield、join区别

sleep
sleep 方法是属于 Thread 类中的,sleep 过程中线程不会释放锁,只会阻塞线程让出cpu给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态,可中断,sleep 给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会

wait
wait 方法是属于 Object 类中的,wait 过程中线程会释放对象锁,只有当其他线程调用 notify 才能唤醒此线程。wait 使用时必须先获取对象锁,即必须在 synchronized 修饰的代码块中使用,那么相应的 notify 方法同样必须在 synchronized 修饰的代码块中使用,如果没有在synchronized 修饰的代码块中使用时运行时会抛出IllegalMonitorStateException的异常

yield
和 sleep 一样都是 Thread 类的方法,都是暂停当前正在执行的线程对象,不会释放资源锁和 sleep 不同的是 yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。还有一点和 sleep 不同的是 yield 方法只能使同优先级或更高优先级的线程有执行的机会

join

等待调用join方法的线程结束之后,程序再继续执行,一般用于等待异步线程执行完结果之后才能继续运行的场景。例如:主线程创建并启动了子线程,如果子线程中药进行大量耗时运算计算某个数据值,而主线程要取得这个数据值才能运行,这时就要用到 join 方法了

下列哪些操作会使线程释放锁资源?

A sleep()

B wait()

C join()

D yield()

正确答案:BC

你的答案:BD

19.java ThreadLocal

ThreadLocal是Java中的一个类,它提供了线程局部变量(thread-local variables)的实现。线程局部变量允许程序员将与线程关联的特定值(通常是一个对象引用)存储在变量中。每个线程都可以拥有自己独立的变量副本,而不会与其他线程共享。

ThreadLocal的主要用途是解决多线程中的数据同步问题,避免使用synchronized关键字来锁定整个方法或代码块,从而提高程序的性能。

ThreadLocal的工作原理是:每个线程持有一个该变量的副本,当线程需要访问该变量时,它将获取自己的副本,而不是共享变量。因此,每个线程都可以独立地修改自己的变量副本,而不会影响其他线程的变量。

ThreadLocal的使用方法如下:

  1. 创建一个ThreadLocal对象:
ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
  1. 将值设置为每个线程的变量副本:
threadLocal.set(42); // 设置当前线程的变量副本为42
  1. 从每个线程获取自己的变量副本:
int value = threadLocal.get(); // 获取当前线程的变量副本的值
  1. 在不再需要时清除当前线程的变量副本:
threadLocal.remove(); // 清除当前线程的变量副本

ThreadLocal在Web开发中经常被用于存储每个请求的上下文信息,例如用户信息、会话信息等。这样,每个请求都可以有自己的独立上下文,而不会与其他请求共享。

20.关于HashMap的知识点

a) HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap的底层结构是一个数组,数组中的每一项是一条链表。

b) HashMap的实例有俩个参数影响其性能: “初始容量” 和 装填因子。

c) HashMap实现不同步,线程不安全。 HashTable线程安全

d) HashMap中的key-value都是存储在Entry中的。

e) HashMap可以存null键和null值,不保证元素的顺序恒久不变,它的底层使用的是数组和链表,通过hashCode()方法和equals方法保证键的唯一性

f) 解决冲突主要有三种方法:定址法,拉链法,再散列法。HashMap是采用拉链法解决哈希冲突的。

21.关于java的内存区域

以下描述错误的一项是( )?

A 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行 到了第几行,是线程隔离的

B 原则上讲,所有的对象都是在堆区上分配内存,是线程之间共享的

C 方法区用于存储JVM加载的类信息、常量、静态变量,即使编译器编译后的代码等数据,是线程隔离的

D Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的

22.三元操作符如果遇到可以转换为数字的类型,会做自动类型提升。

以下JAVA程序的运行结果是什么( )

public static void main(String[] args) {
    Object o1 = true ? new Integer(1) : new Double(2.0);
    Object o2;
    if (true) {
    o2 = new Integer(1);
    } else {
        o2 = new Double(2.0);
    }
    System.out.print(o1);
    System.out.print(" ");         
    System.out.print(o2);
}

A 1 1

B 1.0 1.0

C 1 1.0

D 1.0 1

正确答案:D

你的答案:A

23.类实现多个接口的时候,只需要一个implements,多个接口通过逗号进行隔开,先继承类再实现接口

在java中,已定义两个接口B和C,要定义一个实现这两个接口的类,以下语句正确的是()

A interface A extends B,C

B interface A eimplements B,C

C class A implements B,C

D class A implements B,implements C

正确答案:C

你的答案:D

24.类中实例变量可以不用初始化,使用相应类型的默认值即可;方法中的定义的局部变量必须初始化,否则编译不通过。

下面代码的运行结果是()

public static void main(String[] args){
    String s;
    System.out.println("s="+s);
}

A 代码编程成功,并输出”s=”

B 代码编译成功,并输出”s=null”

C 由于String s没有初始化,代码不能编译通过。

D 代码编译成功,但捕获到NullPointException异常

正确答案:C

你的答案:A

参考答案:局部变量没有默认值

25.switch支持 int及以下(char, short, byte),String, Enum 。不支持long类型

在java7中,下列不能做switch()的参数类型是?

A int型

B 枚举类型

C 字符串

D 浮点型

正确答案:D

你的答案:B

参考答案:D

switch语句后的控制表达式只能是short、char、int整数类型和枚举类型,不能是float,double和boolean类型。String类型是java7开始支持。

下面的switch语句中,x可以是哪些类型的数据:()

switch(x)
{
default:
System.out.println("Hello");
}

A long

B char

C float

D byte

E double

F String

正确答案:BDF

你的答案:ABDF

26.java是面向对象的,但是不是所有的都是对象,基本数据类型就不是对象,所以才会有封装类的;

27.java多线程生命周期及对应的方法调用

以下哪个事件会导致线程销毁?()

A 调用方法sleep()

B 调用方法wait()

C start()方法的执行结束

D run()方法的执行结束

正确答案:D

你的答案:C

28.抛InterruptedException的代表方法有:

  • java.lang.Object 类的 wait 方法
  • java.lang.Thread 类的 sleep 方法
  • java.lang.Thread 类的 join 方法

29.线程安全的集合有Vector、Stack、Hashtable

30. 数组无论是在定义为实例变量还是局部变量,若没有初始化,都会被自动初始化

31. 发生继承关系时父子类代码执行顺序

1.父类静态代码块:如果有多个静态代码块,按顺序执行,仅执行一遍

2.子类静态代码块:同上

3.父类非静态代码块: 有多个非静态代码块,按顺序执行,且每次new,每次执行

4.父类构造函数

5.子类非静态代码块: 有多个非静态代码块,按顺序执行,且每次new,每次执行

6.子类构造函数

32.序列化的是对象,不是类,类变量不会被序列化

有以下一个对象:

public class DataObject implements Serializable{
    private static int i=0;
    private String word=" ";
    public void setWord(String word){
        this.word=word;
    }
    public void setI(int i){
        Data0bject.i=i;
     }
}

创建一个如下方式的DataObject:

DataObject object=new Data0bject ( );
object.setWord("123");
object.setI(2);

将此对象序列化为文件,并在另外一个JVM中读取文件,进行反序列化,请问此时读出的Data0bject对象中的word和i的值分别为:

A "", 0

B "", 2

C "123", 2

D "123", 0

正确答案:D

你的答案:C

参考答案:这道题的答案应该是: D,序列化保存的是对象的状态,静态变量属于类的状态,因此,序列化并不保存静态变量。所以i是没有改变的

33.java数组的复制效率:System.arraycopy>使用clone方法>Array.copyOf>for 循环逐一复制

34.HashTable和HashMap的区别(7点):

1.继承的父类不同:HashTable继承Dictory类,HashMap继承AbstractMap.但都实现了Map接口;

2.线程安全性不同:HashTable是线程安全的,适用于多线程;HashMap是非线程安全,更适合于单线程;

3.是否提供contains方法:HashTable中保留了contains方法,与constainsValue功能相同;HashMap中去掉了contains方法;

4.key和value是否可为null值:HashTable的key、value都不允许null值;HashMap,null可以作为key;

5.遍历方式的内部实现不同:HashTable、HashMap都使用了Iterator,HashTable还使用过Enumeration方式;

6.hash值不同:HashTable直接使用对象的hashCode,而HashMap重新计算hash值。

7.内部使用的数组初始化和扩容方式不同:Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂;Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。

35.Math 类三个用于数值处理的静态方法:ceil(), floor()round().

ceil()

Math.ceil() 方法返回大于或等于给定数字的最小整数。换句话说,它会将给定的数字向上取整。

floor()

Math.floor() 方法返回小于或等于给定数字的最大整数。换句话说,它会将给定的数字向下取整。

round()

Math.round() 方法将给定的数字四舍五入为最接近的整数。

36.关于父子类方法重写的错题:

class Car extends Vehicle
{
    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");
    }
}

下列哪些针对代码运行结果的描述是正确的?

A Car

B Vehicle

C Compiler error at line 3

D Compiler error at line 5

E Exception thrown at runtime

正确答案:A

你的答案:D

参考答案:答案:A 首先final声明的方法是不能被覆盖的,但是这里并不错误,因为方法是private的,也就是子类没有继承父类的run方法,因此子类的run方法跟父类的run方法无关,并不是覆盖。new Car().run()也是调用子类的run方法。

37.Java ArrayList扩容

在 Java 中,ArrayList 是一种动态数组,其大小(即容量)可以根据需要自动增长。当你向 ArrayList 中添加元素,并且当前的容量不足以容纳新的元素时,ArrayList 会自动进行扩容。

下面是 ArrayList 扩容的基本过程:

  1. 初始化容量:当你创建一个新的 ArrayList 时,你可以指定一个初始容量。如果你不指定,它会使用默认容量,通常是 10。
  2. 添加元素:当你使用 add 方法向 ArrayList 中添加元素时,它会检查当前数组是否有足够的空间来容纳新元素。
  3. 扩容:如果当前数组已满,ArrayList 会创建一个新的数组,其容量通常是当前数组的 1.5 倍(确切地说,新容量 = 当前容量 + (当前容量 >> 1)),然后将所有现有元素复制到新数组中。
  4. 添加新元素:在新数组中,将新元素添加到适当的位置。

ArrayList list = new ArrayList(20);中的list扩充几次

A 0

B 1

C 2

D 3

正确答案:A

你的答案:B

38.类的final成员变量必须满足以下其中一个条件

1、在构造函数中赋值
2、初始化赋值

class Foo {
    final int i;
    int j;
    public void doSomething() {
        System.out.println(++j + i);
    }
}

的输出是?

A 0

B 1

C 2

D 不能执行,因为编译有错

正确答案:D

你的答案:B

39.定义在同一个包(package)内的类可以不经过import而直接相互使用

40.static不能修饰局部变量

关于下面的程序Test.java说法正确的是( )。

public class Test {
    static String x="1";
    static int y=1;
    public static void main(String args[]) {
        static int z=2;
        System.out.println(x+y+z);
    }
}

A 3

B 112

C 13

D 程序有编译错误

正确答案:D

你的答案:B

41.java标识符规则

标识符的组成元素是字母(a-z,A-Z),数字(0~9),下划线(_)和美元符号($)。

标识符不能以数字开头。

java的标识符是严格区分大小写的。

标识符的长度可以是任意的。

关键字以及null、true、false不能用于自定义的标识符。

下列可作为java语言标识符的是()

A a1

B $1

C _1

D 11

正确答案:ABC

你的答案:AC

42.replaceAll()函数的第一个参数是一个正则表达式

以下代码将打印出

public static void main (String[] args) { 
    String classFile = "com.jd.". replaceAll(".", "/") + "MyClass.class";
    System.out.println(classFile);
}

A com. jd

B com/jd/MyClass.class

C ///////MyClass.class

D com.jd.MyClass

正确答案:C

你的答案:B

官方解析:本题有一处陷阱,replaceAll()函数的第一个参数是一个正则表达式,而"."在正则表达式中代表了全部的字符,因此"com.jd."会全部被替换成"/"。之后字符串正常拼接,输出"///////MyClass.class",答案选择C。如想仅仅替换".",就需要使用转义字符"\."

知识点:Java、正则表达式

43.关于java的内部类

44.Java一维数组的两种初始化方法

1、静态初始化

int array[] = new int[]{1,2,3,4,5}
// 或者
int array[] = {1,2,3,4,5}
//需要注意的是,写成如下形式也是错误的
int array[] = new int[5]{1,2,3,4,5}

2、动态初始化

int array[] = new int[5];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;

静态与动态初始化的区别就在于,前者是声明的时候就初始化,后者是先声明,再动态初始化。

45.List<>赋值给List<>的限制

  1. 只看尖括号里边的!!明确点和范围两个概念
  2. 如果尖括号里的是一个类,那么尖括号里的就是一个,比如List<A>,List<B>,List<Object>
  3. 如果尖括号里面带有问号,那么代表一个范围<? extends A>代表小于等于A的范围,<? super A>代表大于等于A的范围,<?>代表全部范围
  4. 尖括号里的所有点之间互相赋值都是错,除非是俩相同的点
  5. 尖括号小范围赋值给大范围,对,大范围赋值给小范围,错。如果某点包含在某个范围里,那么可以赋值,否则,不能赋值
  6. List<?>和List 是相等的,都代表最大范围
  7. 补充:List既是点也是范围,当表示范围时,表示最大范围
class A {}
class B extends A {}
class C extends A {}
class D extends B {}
下面的哪4个语句是正确的?
A The type List<A>is assignable to List.
B The type List<B>is assignable to List<A>.
C The type List<Object>is assignable to List<?>.
D The type List<D>is assignable to List<?extends B>.
E The type List<?extends A>is assignable to List<A>.
F The type List<Object>is assignable to any List reference.
G The type List<?extends B>is assignable to List<?extends A>.
正确答案:ACDG
你的答案:CDEG

46.关于final:修饰方法影响重写,但是不影响重载

final修饰方法后,方法是不可被重写的,因为它已经是“最终形态”了。但不会影响重载

以下说法错误的是( )

A final修饰的方法不能被重载

B final可以修饰类、接口、抽象类、方法和属性

C final修饰的方法也不能被重写

D final修饰的属性是常量,不可以修改

正确答案:AB

你的答案:B

47.关于java的自动类型转换和强制类型转换

数据类型的转换,分为自动转换和强制转换。自动转换是程序在执行过程中 “ 悄然 ” 进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。

自动数据类型转换

自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:

  低 ---------------------------------------------> 高  
 byte,short,char-> int -> long -> float -> double

运算中,不同类型的数据先转化为同一类型,然后进行运算,转换规则如下:

运算中,不同类型的数据先转化为同一类型,然后进行运算,转换规则如下:

操作数 1 类型操作数 2 类型转换后的类型
byte 、 short 、 charintint
byte 、 short 、 char 、 intlonglong
byte 、 short 、 char 、 int 、 longfloatfloat
byte 、 short 、 char 、 int 、 long 、 floatdoubledouble

强制数据类型转换

强制转换的格式是在需要转型的数据前加上 “( )” ,然后在括号内加入需要转化的数据类型。有的数据经过转型运算后,精度会丢失,而有的会更加精确

设计模式

1.备忘录模式(Memento pattern)

当你需要让对象返回之前的状态时(例如, 你的用户请求"撤销"), 你使用备忘录模式

现在大多数软件都有撤销(Undo)的功能,快捷键一般都是Ctrl+Z。这些软件可能使用了()模式来进行。

A 备忘录模式

B 访问者模式

C 模板方法模式

D 责任链

正确答案:A

你的答案:D

spring

1.Spring事务

参考资料:Spring事务管理详解-CSDN博客

Spring事务的传播属性

small_ca28ae2b83eebbcd96aeb20f2f9cc035png

Spring定义了7个以PROPAGATION\_开头的常量表示它的传播属性。

名称解释
PROPAGATION\_REQUIRED0支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是Spring默认的事务的传播。
PROPAGATION\_SUPPORTS1支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION\_MANDATORY2支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION\_REQUIRES\_NEW3新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION\_NOT\_SUPPORTED4以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION\_NEVER5以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION\_NESTED6如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION\_REQUIRED类似的操作。
Spring事务的隔离级别
名称解释
ISOLATION\_DEFAULT-1这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应
ISOLATION\_READ\_UNCOMMITTED1这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻读。
ISOLATION\_READ\_COMMITTED2保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
ISOLATION\_REPEATABLE\_READ4这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。
ISOLATION\_SERIALIZABLE8这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻读。

2.@Autowired注解

用@Autowired注入的流程为 :
1.先根据类型进行实现类的匹配,多个实现类则不适用
2.多个实现类则会变为根据名称来匹配,就是比较注入的变量名称是否与实现类的名称相同

有如下接口:

public interface Student{
 public void introduce();
}

该接口有两个实现类:

@Component
public class StudentImplXH implements Student {
 @Override
 public void introduce() {
     System.out.println("我叫小华");
 }
}
@Component
public class StudentImplXM implements Student{
 @Override
 public void introduce() {
     System.out.println("我叫小明");
 }
}

测试类中代码如下:

@Autowired
private Student student;
@Test
void StudentTest(){
 student.introduce();

运行测试代码,控制台会输出什么结果?( )

A 我叫小华我叫小明

B我叫小华

C我叫小明

D程序发生异常

正确答案:D

你的答案:C

官方解析:@Autowired注解提供这样的规则,首先根据类型找到对应的Bean,如果对应类型的 Bean 不是唯一的,那么就根据属性名称和Bean的名称进行匹配。如果匹配得上,就会使用该Bean。如果还无法匹配,就会抛出异常。

3.BeanFactory和FactoryBean

BeanFactory是所有Spring Bean的容器根接口,其给IoC容器提供了一套完整的规范。FactoryBean是 一种创建Bean的方式,是对Bean的一种扩展。

4.Spring容器中Bean作用域

• singleton:在每个Spring IoC容器中只有一个Bean实例。
• prototype:一个Bean的定义可以有多个实例。
• request:在Web应用中,为每个HTTP请求创建一个Bean实例。
• session:在Web应用中,为每个HTTP会话创建一个Bean实例。
• global session:在基于portlet的Web应用中,为每个全局HTTP会话创建一个Bean实例。

数据库理论

1. 在数据库系统中,产生不一致的原因

数据库中可能存在不一致的数据,主要有以下三个方面:

A.数据冗余;

B.并发控制不当;

C.故障或者错误

下面选项中,在数据库系统中,产生不一致的最重要原因是( )

A 数据存储量太大

B 没有严格保护数据

C 未对数据进行完整性控制

D 数据冗余

正确答案:D

你的答案:C

参考答案:选D 数据库中有可能会存在不一致的数据。 造成数据不一致的原因主要有: 数据冗余 如果数据库中存在冗余数据,比如两张表中都存储了用户的地址,在用户的地址发生改变时,如果只更新了一张表中的数据,那么这两张表中就有了不一致的数据。 并发控制不当 比如某个订票系统中,两个用户在同一时间订同一张票,如果并发控制不当,可能会导致一张票被两个用户预订的情况。当然这也与元数据的设计有关。 故障和错误 如果软硬件发生故障造成数据丢失等情况,也可能引起数据不一致的情况。因此我们需要提供数据库维护和数据恢复的一些措施。

知识点:数据库

2.数据库设计的六个阶段

1、需求分析:分析用户的需求,包括数据、功能和性能需求
2、概念结构设计:主要采用E-R模型进行设计,包括画E-R图
3、逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型的转换
4、数据库物理设计:主要是为所设计的数据库选择合适的存储结构和存取路径
5、数据库的实施:包括编程、测试和试运行
6、数据库运行与维护:系统的运行与数据库的日常维护

0

评论 (4)

打卡
取消
  1. 头像
    jupiter 作者
    Windows 10 · Google Chrome

    滴!贵宾卡!打卡时间:2024/1/4 19:54:38,请上车的乘客系好安全带~

    回复
    1. 头像
      jupiter 作者
      Windows 10 · Google Chrome
      @ jupiter

      表情

      回复
      1. 头像
        jupiter 作者
        Windows 10 · Google Chrome
        @ jupiter

        滴!贵宾卡!打卡时间:2024/1/4 19:55:08,请上车的乘客系好安全带~

        回复
      2. 头像
        jupiter 作者
        Windows 10 · Google Chrome
        @ jupiter

        表情

        回复