Java刷题-错题纠正

Java

JPanle默认布局FlowLayout,JFrame默认布局BoardLayout。

yield和sleep不释放资源。

堆区:只存放类对象,线程共享;

方法区:又叫静态存储区,存放class文件和静态数据,线程共享;

栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享;

a=10; (a++ + a--) 21.

TextField 的事件***接口是ActionListener

所有的byte,short,char型的值将被提升为int型;

被fianl修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化。


字符流和字节流每次读入的字节数是不确定的,可能相同也可能不相同。

枚举,接口变量,双重检索(懒汉式),饿汉式.都是线程安全的单例。

父类静态域——》子类静态域——》父类成员初始化——》父类构造块——》1父类构造方法——》2子类成员初始化——》子类构造块——》3子类构造方法;

InputStreamReader可以设置编码。

1.只看尖括号里边的!!明确点和范围两个概念

2.如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List<A>,List<B>,List<Object>

3.如果尖括号里面带有问号,那么代表一个范围,<? extends A>代表小于等于A的范围,<? super A>代表大于等于A的范围,<?>代表全部范围

4.尖括号里的所有点之间互相赋值都是错,除非是俩相同的点

5.尖括号小范围赋值给大范围,对,大范围赋值给小范围,错。如果某点包含在某个范围里,那么可以赋值,否则,不能赋值

6. List<?>和List是相等的,都代表最大范围

----------------------------------------------------------------------------------

7.补充:List既是点也是范围,当表示范围时,表示最大范围

ThreadLocal用于创建线程的本地变量,该变量是线程之间不共享的

基本类属于原生类。

java中的数据类型分类:
基本数据类型(或叫做原生类、内置类型)8种:
整数:byte,short,int,long(默认是int类型)
浮点类型:float,double(默认是double类型)
字符类型:char
布尔类型:boolean
引用数据类型3种:数组,类,接口。

真数组: 数组元素在内存中是一个接着一个线性存放的。

Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。

(1)加载:容器通过类加载器使用servlet类对应的文件加载servlet

(2)创建:通过调用servlet构造函数创建一个servlet对象

(3)初始化:调用init方法初始化

(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求

(5)卸载:调用destroy方法让servlet自己释放其占用的资源

1,2,5只执行一次。

错过的题再错一遍,好意思吗,整理的错题都不去看。

System.arraycopy>clone>Arrays.copyOf>for。


进入DEAD的线程,它还可以恢复,GC不会回收。

获取ServletContext设置的参数值:context.getInitParameter()

java在运行时才进行翻译指令java编译出来的目标文件,可在相同版本的JVM上运行。


可以把任何一种数据类型的变量赋给Object类型的变量。

“tao” + “bao”相当于new String(“tao” + “bao”)

new URL()时必须捕获检查异常,但这个异常是由于字符串格式和URL不符导致的,与网址是否存在无关。URL的toString方法返回字符串,无论网址是否存在。

Java用监视器机制实现了进程之间的同步执行。

Status用Validation做验证的话,使用DynaValidatorActionForm

喂(Vector)S(Stack)H(hashtable)E(enumeration)是线程安全的。

类的成员变量包括实例变量和类变量(静态变量),成员方法包括实例方法和类方法(静态方法)。

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

ThreadLocal采用开放地址法。。。

Class.forName("com.mysql.jdbc.Driver"); //指定MySQL JDBC驱动程序
oracle.jdbc.driver.OracleDriver //oracle驱动
sun.jdbc.odbc.JdbcOdbcDriver//Access数据库

CGI不可移植。


创建Servlet的实例是由Servlet容器来完成的,且创建Servlet实例是在初始化方法init()之前


String就没有decode和encode方法,String类没有fromBytes()和encode以及decode方法!!



抽象方法只可以被public和protected修饰;

接口中只有常量定义,没有变量声明。

Java:当某个线程抛出OutOfMemoryError时,其他线程有可能不受影响,因为在程序内存溢出之后,溢出的内存的线程所占的内存会被快速释放。

JSP共有以下6种基本动作:
jsp:include:在页面被请求的时候引入一个文件;
jsp:useBean:寻找或者实例化一个JavaBean。;
jsp:setProperty:设置JavaBean的属性。;
jsp:getProperty:输出某个JavaBean的属性;
jsp:forward:把请求转到一个新的页面;
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。

两个obj,如果equals()相等,hashCode()一定相等(符合代码规范的情况下)

数组比较:Arrays.equals()

在java中,声明一个数组时,不能直接限定数组长度,只有在创建实例化对象时,才能对给定数组长度。

数组是一个对象,不同类型的数组具有不同的类

ThreadLocal:类用到了解决哈希冲突的开放定址法。

Java反射机制一般会带来效率问题,效率问题主要发生在查找类的方法和字段对象,因此通过缓存需要反射类的字段和方法就能达到与之间调用类的方法和访问类的字段一样的效率。

SorttedMap是接口。

final修饰的方法可以被重载,不能被重写(覆盖Override)。

finally中可以改变return返回值。

每个线程都有一个独立的程序计数器。

Java堆线程共享。

AppletViewer是与html有关的。

引用变量存储在栈,对象存储在堆。

this()才必须是构造函数中的第一个可执行语句,用this调用语句并不需要。

final修饰方法表示方法不能被覆盖,是可以被继承的。

Java中true、false是保留字,不是关键字


抽象方法只可以被public 和 protected修饰。

synchronized不是修饰变量的 它修饰方法或代码块或对象。

synchronized不是修饰变量的 它修饰方法或代码块或对象。



equals()既然已经能实现对比的功能了,为什么还要hashCode()呢?因为重写的equals()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。

那么hashCode()既然效率这么高为什么还要equals()呢 因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,

所以我们可以得出: 1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

之类不可以继承父类的构造方法。

yield()不会释放锁,只是通知调度器自己可以让出cpu时间片,但只是建议,调度器也不一定采纳。join()方***释放当前线程资源。

Java反射会降低效率。

Java的类型有:Applet、Application、Servlet。

设计模式


策略模式使用的是组合关系, 通过注入的方式在客户端传入一个具体策略对象。

策略模式(Strategy)-定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化

正则表达式

[ ]里面是不重复的

Spring


MySQL


概念模型独立与硬件设备(硬盘、SSD、RAM)和DBMS(MySQL、Oracle、SQL Server)。

策略ID主键不能设置默认值。

索引可以理解为给正文(数据)加目录(索引),是不会把书中的页码打乱的,索引的数据存在在与表名相同的.cdx的文件中。

在Access数据库的表设计器中可以修改字段类型、设置索引和增加字段。要想删除表中的记录,需要打开表进行删除。

B函数依赖A,A函数确定B,A->B,如B=A^2,一个确定的B可以对应多个A,一个A只能对应一个B,A与B的联系是多对一

外模式:又称子模式或用户模式,用户可见的局部数据的逻辑结构和特征的描述,是模式的逻辑子集;

模式:数据的逻辑结构和关系的描述;

内模式:是数据的物理结构和存储方式的描述

DBMS是系统软件,是位于用户和操作系统之间的一层数据管理软件是系统软件。

若事务 T 对数据对象 A 加上 S 锁,则事务T可以读A但不能修改A,其它事务只能再对A加S锁而不能X锁。

1NF (first normal form) 要求关系的所有属性值都是原子的。

2NF:每个非主属性完全函数依赖于(候选)

3NF:每个非主属性都不传递依赖于R(候选)

BCNF:每个属性都不传递依赖于R(候选)

4NF:删除同一表内的多对多关系

外模式也称子模式(Subschema)或用户模式。DDL用于描述局部逻辑结构。

between和and关键字是闭区间。

SQL Server中row_number返回结果集分区内行的序列号,每个分区的第一行从1开始。

能唯一标识元组的一个属性或最小的属性组称为关键字。关键字中的属性都称为主属性。

事务日志用以保存数据库数据的变动,包括增删改等操作。

(1)模式 也称逻辑模式或者概念模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。

模式实际上是数据库数据在逻辑级上的视图。一个数据库只有一个模式。定义模式时不仅要定义数据的逻辑结构,而且要定义数据之间的联系,定义与数据有关的安全性、完整性要求。

(2)外模式 外模式也称用户模式,它是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。 外模式通常是模式的子集。一个数据库可以有多个外模式。应用程序都是和外模式打交道的。外模式是保证数据库安全性的一个有力措施。每个用户只能看见和访问所对应的外模式中的数据,数据库中的其余数据对他们是不可见的。

(3)内模式 内模式也称存储模式,一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。例如,记录的存储方式是顺序结构存储还是B树结构存储;索引按什么方式组织;数据是否压缩,是否加密;数据的存储记录结构有何规定等。

SQL的两种使用形式:交互式、嵌入式。

MySQL: utf8不是真正的utf-8,utf8mb4才是真正的utf-8,utf-8每个字符最多支持四个字节,而utf8每个字符最多支持3个字节。

数据库管理系统最主要的功能是定义数据库。

数据库是按照一定的数据模型组织的,长期存储在计算机内,可为多个用户共享的数据的聚集。

查找表结构:DESC。

E-R模型属于概念模型也即信息模型。

COUNT:

1、count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL。

2、count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL。

3、count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空。

select (case when A>=B then A else B end) MAX_AB, (case when C>=D then C else D end) MAX_CD from result

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

Group By默认升序排列。

层次划分过多,会导致层间接口增多并且复杂,层次划分过少,会导致各层功能冗杂难以设计,所以层次划分需谨慎考虑,既不能过多也不能过少

Oracledelete能够回收高水位,只回收使用过的部分。

having子句即可包含聚合函数作用的字段也可包括普通的标量字段

在.NET Framework类库***能相似的类库包含在同一个(文件 )中。

网络

127.0.0.0 ~ 127.255.255.255用于回环测试,属于本机回环地址。

240.0.0.0 ~ 255.255.255.255是E类地址,属于保留地址,未使用。

192.240.150.255/24掩码是24位,低8位为主机地址,但由于全部为1,表示广播地址

计算机网络是分布在不同地理位置的多个独立的(自治计算机)的集合。

计算机网络中:实现网络通信功能的设备及其软件的集合称为网络的通信子网,而网络中实现资源共享功能的设备及其软件的集合称为资源子网

通信子网:通信设备、网络通信协议、通信控制软件等属于通信子网,是网络的内层。

资源子网:比如1.用户计算机(也称工作站)2.网络存储系统3.网络打印机4.独立运行的网络数据设备5.网络终端6.服务器7.网络上运行的各种软件资源8.数据资源等。是网络的外层。

应用层:数据
传输层:报文段
网络层:数据报
链路层:帧
链路层:比特流

TCP协议状态描述:只有执行主动关闭端才会出现TIME_WAIT

请说说你对TCP连接中time_wait状态的理解

解答:

先上TCP的状态变迁图


1. time_wait状态如何产生?

由上面的变迁图,首先调用close()发起主动关闭的一方,在发送最后一个ACK之后会进入time_wait的状态,也就说该发送方会保持2MSL时间之后才会回到初始状态。MSL值得是数据包在网络中的最大生存时间。产生这种结果使得这个TCP连接在2MSL连接等待期间,定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用。

2.time_wait状态产生的原因

1)为实现TCP全双工连接的可靠释放

由TCP状态变迁图可知,假设发起主动关闭的一方(client)最后发送的ACK在网络中丢失,由于TCP协议的重传机制,执行被动关闭的一方(server)将会重发其FIN,在该FIN到达client之前,client必须维护这条连接状态,也就说这条TCP连接所对应的资源(client方的local_ip,local_port)不能被立即释放或重新分配,直到另一方重发的FIN达到之后,client重发ACK后,经过2MSL时间周期没有再收到另一方的FIN之后,该TCP连接才能恢复初始的CLOSED状态。如果主动关闭一方不维护这样一个TIME_WAIT状态,那么当被动关闭一方重发的FIN到达时,主动关闭一方的TCP传输层会用RST包响应对方,这会被对方认为是有错误发生,然而这事实上只是正常的关闭连接过程,并非异常。

2)为使旧的数据包在网络因过期而消失

为说明这个问题,我们先假设TCP协议中不存在TIME_WAIT状态的限制,再假设当前有一条TCP连接:(local_ip, local_port, remote_ip,remote_port),因某些原因,我们先关闭,接着很快以相同的四元组建立一条新连接。本文前面介绍过,TCP连接由四元组唯一标识,因此,在我们假设的情况中,TCP协议栈是无法区分前后两条TCP连接的不同的,在它看来,这根本就是同一条连接,中间先释放再建立的过程对其来说是“感知”不到的。这样就可能发生这样的情况:前一条TCP连接由local peer发送的数据到达remote peer后,会被该remot peer的TCP传输层当做当前TCP连接的正常数据接收并向上传递至应用层(而事实上,在我们假设的场景下,这些旧数据到达remote peer前,旧连接已断开且一条由相同四元组构成的新TCP连接已建立,因此,这些旧数据是不应该被向上传递至应用层的),从而引起数据错乱进而导致各种无法预知的诡异现象。作为一种可靠的传输协议,TCP必须在协议层面考虑并避免这种情况的发生,这正是TIME_WAIT状态存在的第2个原因。

3)总结

具体而言,local peer主动调用close后,此时的TCP连接进入TIME_WAIT状态,处于该状态下的TCP连接不能立即以同样的四元组建立新连接,即发起active close的那方占用的local port在TIME_WAIT期间不能再被重新分配。由于TIME_WAIT状态持续时间为2MSL,这样保证了旧TCP连接双工链路中的旧数据包均因过期(超过MSL)而消失,此后,就可以用相同的四元组建立一条新连接而不会发生前后两次连接数据错乱的情况。

3.time_wait状态如何避免

首先服务器可以设置SO_REUSEADDR套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。

数据结构

用线性探测方法:当发生冲突时,尝试存在下一个位置。

操作系统

硬盘的存取访问时间分为三个部分: 寻道时间Ts,旋转延迟时间Tr和传送时间Tt。

可重定位存储管理能实现紧凑技术的存储管理。

正因为程序运行具有局部性规律,才可以只装入部分程序到内存就开始运行。

同步信号量的初值一般设为0;

互斥信号量的初值一般设为1;

同步信号量的用途:防止被抢占初始为空

低优先级的任务持有信号量,高优先级的任务需要这个信号量,只有当低优先级的任务give(释放)信号量,高优先级的任务才能take(获取)信号量。通过这种机制低优先级的任务就可以防止被高优先级的任务抢占。give和take是分别在两个任务里做的。

互斥信号量的用途:对临界区上锁初始为满

当一个任务想对临界区访问时,为了防止别的任务也对该临界区操作,它需要对该临界区上锁,即take(获取)一个互斥的信号量,以保证独享。当该任务take(获取)一个互斥的信号量以后,它仍然能被高优先级的任务抢占,但高优先级的用户仍然无法访问它已经上锁的临界区。而解锁也是由上锁的任务来做的。take和give是在一个任务里完成的。

其他

C++程序运行时函数的地址:地址是否固定要看系统配置和编译选项,如果开启了地址随机化,那地址是每次都变的,如果没开启,那么地址每次都一样。

C++中纯虚函数也可以定义。

malloc和free申请和释放的虚拟内存。

因为在Debug中有ASSERT断言保护,所以要崩溃,而在Release优化中就会删掉ASSERT,所以会出现正常运行。

strcat拼接字符串。

#Java#
全部评论
谢谢分享😋
点赞 回复
分享
发布于 2020-09-02 21:08
mk
点赞 回复
分享
发布于 2020-09-12 10:34
博乐游戏
校招火热招聘中
官网直投

相关推荐

7 25 评论
分享
牛客网
牛客企业服务