后端开发笔试题目集合

[TOC]

数据结构

1.将关键字9, 17, 25, 33, 21, 77, 64, 53, 42, 31依次插入到初始为空的小根堆H中,得到的H是

小根堆是一个完全二叉树,每个节点都要小于等与他的左右节点

根节点是最小的值

最终:

[9, 17, 25, 33, 21, 77, 64, 53, 42, 31]

二叉树的形式:

1
2
3
4
5
6
7
8
9
        9
/ \
17 25
/ \ / \
33 21 77 64
/ \ /
53,42,31


2.在一个二维数组A中,假设每个数组元素的长度为3个存储单元,行下标i为0~9,列下标j为0~7,从首地址200开始连续按列优先存放,在这种情况下,元素A[9][2}的起始地址为( )

一列一列地存,每列里是从上到下。

所以每个元素的起始地址相对于前一个元素的起始地址增加3个存储单元

起始地址 = 首地址 + (j * 行数 + i) * 元素长度

所以最后是287

3.考虑以下递归函数:

1
2
3
4
5
6
7
int calculateI(int i) {
if (i <= 1) {
return i;
} else {
return calculateI(i - 1) + 1;
}
}

对于给定的初始i值(i>1),计算最终的i值是多少?

这个函数是每次调用的时候,i-1,然后调用的结果又+1

所以最后还是i

4.已知串S=‘bccabcaac’,采用KMP算法进行模式匹配,则得到的next数组值为()

这道题采用手工求next数组的方法。

先求串S='bccabcaac’的部分匹配值:

'b’的前后缀都为空,最长相等前后缀长度为0。

'bc’的前缀{b}交集后缀{c}为空

'bcc’前缀{b,bc}交后缀{c,cc}为空

依次求出的部分匹配值如下表第三行所示,将其整体右移一位,低位用-1填充,如下表第四行所示。

PM是部分匹配值(Partial Match)

编号 1 2 3 4 5 6 7 8 9
S b c c a b c a a c
PM 0 0 0 0 1 2 0 0 0
next -1 0 0 0 0 1 2 0 0

next[1]=0所以,next数组整体+1

所以答案为011112311

计算机网络

基础

1.在HTTP协议中,请求报文中的请求行包括:请求方法,url,和http版本号

2.TCP"四次挥手"过程中,第一次"挥手"时,发送的报文段中fin标志位被置为1。

3.在DNS配置文件中,CNAME用于表示某主机别名的

4.令牌总线访问控制方法是在物理总线上建立一个逻辑环,从逻辑上看是环状结构的局域网,从物理上看是总线状结构。

令牌总线MAC方法结合了令牌环和总线两种拓扑结构的优点

从物理结构来看:
- 采用总线型拓扑,所有站点都连接在同一条物理总线上
- 这种结构布线简单,易于扩展和维护
- 站点的物理连接就是一条直线型总线

从逻辑结构来看:
- 站点按照预先确定的顺序组成一个逻辑环
- 令牌在逻辑环中按固定顺序从一个站传递到下一个站
- 站点获得令牌后才能发送数据,发送完毕后将令牌传给下一站

6.TCP连接中的确认号反映了接收方期望收到的下一个序号,一个TCP报文段的序号和确认号与以下因素都有关系:

  1. 初始序号(ISN)
  2. 已传输的数据字节

8.属于DHCP客户端发送的消息是( )

discover

request

discover消息:当DHCP客户端启动时,会在本地网络上广播发送discover消息,用于发现DHCP服务器。这是客户端发起的第一步操作。

request消息:客户端收到服务器的offer消息后,会发送request消息,表明接受某台DHCP服务器提供的IP地址等配置信息。

offer:这是DHCP服务器对客户端discover消息的响应,用于向客户端提供可用的IP地址等配置信息,由服务器发送。

ack:这是DHCP服务器对客户端request消息的确认响应,表示同意将相关配置信息分配给该客户端,同样是由服务器发送。

发送的顺序分别是:

discover->offer->request->ack

c-s-c-s模式

10.在以太网中,帧长度是有明确限制的。根据IEEE 802.3标准规定,以太网帧的长度必须在64-1518字节之间:

最小帧长度为64字节:
- 这是为了确保冲突检测机制(CSMA/CD)能够正常工作
- 如果帧太短,可能无法及时检测到冲突
- 不包括前导码和帧起始定界符的7+1字节

最大帧长度为1518字节:
- 这个限制是由于物理层和链路层的技术约束
- 过长的帧会占用信道时间过长,影响网络性能
- 也会增加出错概率

11.Socket,即套接字,是一个对 TCP / IP协议进行封装 的编程调用接口。socket的使用类型主要有:

基于 TCP协议,采用 流的方式 提供可靠的字节流服务

基于 UDP协议,采用 数据报文 提供数据打包发送的服务

基于TCP协议的套接字提供面向连接的、可靠的字节流服务。TCP协议本身就是面向流的协议,能够保证数据的可靠传输。

基于UDP协议的套接字提供无连接的数据报服务。UDP是面向数据报的协议,每个UDP数据报都是一个独立的信息单位。

12.http协议头字段中:

Expires:它通常的使用格式是Expires:Fri ,24 Dec 2027 04:24:07 GMT,后面跟的是日期和时间,超过这个时间后,缓存的内容将失效

Last-Modified / If-Modified:一般服务端在响应头中返回一个Last-Modified字段,告诉浏览器这个页面的最后修改时间

Content-Length:用于描述HTTP消息实体的传输长度

Etag/If-None-Match:用于验证缓存有效性

Content-Length与http缓存没有关系

13.在传输层可采用( )策略防止拥塞

  • 重传策略

  • 流控制策略

协议

1.在BSC(二进制同步通信)协议中,字符填充是为了避免数据中出现的控制字符序列与实际控制字符混淆。当数据中出现DLE(数据链路转义)字符时,需要在其后额外插入一个DLE字符作为填充。

若 BSC 帧的数据段中出现字符串“ A DLE STX ”,则字符填充后的输出为 ( )

所以字符串输出为A DLE DLE STX

2.OSPF(开放最短路径优先)协议是一种链路状态路由协议,直接运行在IP层之上,使用IP协议号89。它不依赖于TCP或UDP等传输层协议。

网络物理连接

5.两个厂商交换机之间双线互联,应该使用动态链路聚合

动态链路聚合的优势:

  1. 自动协商和检测 - 通过LACP协议,两端设备可以自动协商参数并检测链路状态
  2. 故障自动切换 - 当某条链路发生故障时,可以自动切换到备用链路
  3. 兼容性更好 - 动态协议可以更好地处理不同厂商设备之间的互通
  4. 维护便捷 - 无需手动配置大量参数,减少人为错误

7.双绞线一般使用RJ-45接头和接口。RJ-45接头有8个引脚,完全满足双绞线传输的需求,广泛应用于以太网连接中

双绞线一般传输不超过100米

9.下面关于虚拟局域网 VLAN 的叙述错误的是 ()

AVLAN是由一些局域网网段构成的与物理位置无关的逻辑组。

B利用以太网交换机可以很方便地实现VLAN。

C每一个VLAN的工作站可处在不同的局域网中。

D虚拟局域网是一种新型局域网。

VLAN不是一种新型局域网,而是在现有局域网基础上的一种网络管理技术。它通过配置交换机等网络设备,将物理局域网划分成多个逻辑子网。

VLAN确实是由局域网网段构成的逻辑组,其划分与物理位置无关,可以根据功能、部门等需求进行灵活分组。

现代以太网交换机都支持VLAN功能,通过配置交换机端口的VLAN ID等参数就可以方便地实现VLAN。

VLAN的成员可以分布在不同的物理局域网中,只要这些局域网的交换机支持相同的VLAN即可实现通信。

VLAN技术的主要作用是:
\1. 提高网络安全性,限制广播域范围
\2. 减少网络负载,提升网络性能
\3. 简化网络管理,提供灵活的网络配置方案
\4. 降低网络设备成本,有效利用现有网络资源

10.异步传递模式 ATM 采用称为信元的定长分组,并使用光纤信道传输。

11.屏蔽双绞线的缩写为stp

屏蔽双绞线是在非屏蔽双绞线(UTP)的基础上,在双绞线外层加装了金属屏蔽层,可以有效防止电磁干扰。

UTP(Unshielded Twisted Pair)是非屏蔽双绞线的缩写,与题目要求不符
CAT3是3类网线的简称,表示传输速率等级,不是屏蔽双绞线的缩写
CAT5E是5类增强型网线的简称,同样是表示传输速率等级,不是屏蔽双绞线的缩写

操作系统

1.高响应比优先(HRRN)算法属于快速响应式调度算法

2.在操作系统中,PV操作用于管理资源的访问和同步。P用于申请资源,V用于释放资源

3.下面关于 Linux 进程地址空间中的代码段和数据段的说法错误的是

A 代码段用于存储程序的可执行指令

B 数据段用于存储初始化的全局和静态变量

C 代码段和数据段通常属于只读内存区域

D 在 Linux 中,代码段和数据段总是共享同一个物理页面

在Linux进程地址空间中,代码段和数据段是两个不同的内存区域,它们有着不同的特点和用途。

代码段(text segment)确实用于存储程序的可执行指令,这些指令是CPU直接执行的机器码。

数据段(data segment)用于存储已初始化的全局变量和静态变量,这些数据在程序启动时就被加载到内存中。

代码段通常是只读的,这样可以防止程序在运行时意外修改指令;而数据段中可能包含只读数据区(.rodata)。

代码段和数据段出于以下原因通常不会共享同一个物理页面:
1 内存保护需求不同:代码段需要执行权限,数据段需要读写权限
2 缓存效率考虑:分开存放有利于CPU缓存的使用效率
3 内存对齐要求:不同段可能有不同的对齐要求
4 安全性考虑:分开存放可以防止缓冲区溢出等攻击

4.某系统中有3个并发进程,都需要同类资源4 个,试问该系统不会发生死锁的最少资源数是()

系统不会发生死锁的安全条件是:

系统可用资源数 ≥ 所有进程最大需求数 - 1

这需要用到银行家公式
$$
通用公式如下:

最少资源数=P×(R−1)+1
$$

  • P:进程数

  • R:每个进程最多需要的资源数

所以此题的答案是10个

5.进程和线程是操作系统中最基本的概念,下列有关描述不正确的是()

A进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位

B线程之间的通信简单(共享内存即可,但须注意互斥访问的问题),而不同进程之间的通信通常需要调用内核实现

C由于线程没有独立的地址空间,因此同一个进程的一组线程可以访问该进程资源,这些线程之间的通信也很高效

D线程有独立的虚拟地址空间,但是拥有的资源相对进程来说,只有运行所必须的堆栈,寄存器等。

因为线程并不具有独立的虚拟地址空间,线程是共享所在进程的地址空间的。线程确实拥有独立的运行时资源如堆栈和寄存器等,但地址空间是与其所在进程的其他线程共享的

线程是轻量级的进程,它们共享所在进程的地址空间和其他资源,但拥有独立的运行时资源(如堆栈、程序计数器、寄存器等)。这种特性使得线程的创建、切换开销较小,且线程间通信效率较高。

进程是进行分配资源的最小单位,线程没有独立资源。线程是调度的最小单位

数据库

E-R图

1.在 E-R 图中,矩形用于表示实体

4.一般情况下,当对关系R和S进行自然连接时,要求R和S含有一个或者多个共有的属性,也就是表中的行

5.在数据库设计中,将E-R图转换成关系数据模型的过程属于逻辑设计阶段

备份

2.增量备份能基于上次任意一种备份,将上次备份后发生变化的数据进行备份,并将备份后的数据进行标记

sql语句

3.在MySQL存储过程中,以下关于声明存储过程的参数类型的说法正确的是()

A使用DECLARE语句声明参数类型

B在参数名前加上“@”符号来表示参数类型

C在参数名后加上数据类型来声明参数类型

D在存储过程名后使用中括号来声明参数类型

在MySQL存储过程中,可以在存储过程名后使用括号来声明参数

在存储过程中,也可以使用DECLARE语句来声明变量的类型,但是不能用来声明存储过程的参数类型。在MySQL中,不需要在参数名前加上“@”符号来表示参数类型。

6.众所周知,MySQL通过使用绑定变量能够极大地提高执行效率,并且执行重复的语句。因为

  • 只需解析1次SQL语句
  • 仅发送参数和句柄
  • 参数之间缓存至内存中

8.通过CHARINDEX如果能够找到对应的字符串,则返回该字符串位置i(有效位置范围为1<= i <= length(input)),否则返回0。

注意*位置是从1开始*

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

expressionToFind :目标字符串,就是想要找到的字符串,最大长度为8000 。

expressionToSearch :用于被查找的字符串。

start_location:开始查找的位置,为空时默认从第一位开始查找。

9.使用insert插入字段的时候,不能使用双引号,否则会执行报错

10.MySQL 通过创建并填充临时表的方式来执行union查询。除非确实要消除重复的行,否则建议使用union all。原因在于如果没有all这个关键词,MySQL会给临时表加上distinct选项,这会导致对整个临时表的数据做唯一性校验,这样做的消耗相当高。

11.如果查询包括 GROUP BY 但你并不想对分组的值进行排序,你可以指定 ORDER BY NULL禁止排序

视图

7.视图:

视图可以被嵌套,当SELECT语句的选择列表有TOP子句时,视图可以包含ORDER BY子句,其他情况下不行

视图不能对临时表或表变量进行引用。更新视图数据可用sp_refreshview。sp_helptext用于获取自定义视图创建的T_SQL文本

java

1.下面 Java 代码能够编译通过的是()

A int arr[3] = {1, 2, 3};

B int arr[] = new int[3];

C int[] arr = new int[]{1, 2, 3};

D int[] arr = {1, 2, 3};

错误的是A,Java中声明数组时不能在[]中指定长度。

反射

2.下面关于 Java 中反射机制的说法正确的是()

A反射机制可以在程序运行时获取类的信息

B反射机制可以动态地创建对象、调用方法和访问属性

C反射机制能够提高程序的性能和安全性

D反射机制只能用于访问 public 访问控制修饰符修饰的成员

反射机制实际上会降低程序的性能,因为它需要在运行时进行类型检查和解析。同时,反射也可能破坏封装性,带来安全风险,因为它可以访问私有成员。

反射机制不仅可以访问public成员,通过setAccessible(true)方法,它还可以访问private、protected等其他访问控制级别的成员。这也是反射强大但需要谨慎使用的原因之一。

所以选择A和B这是反射的关键特性和优势

集合

3.下面关于 Java 中集合相关的说法正确的是()

A List 是一个有序的集合,可以包含重复的元素

B Java 中的集合框架只包括 List、Set 两种类型的集合

C Set 是一个无序的集合,不允许包含重复的元素

D Map 是一种键值对的集合,其中键和值都可以重复

Java集合框架不仅包括List和Set,还包括Map、Queue等多种集合类型。这是对Java集合框架范围的错误理解。

Map中的键(Key)必须是唯一的,不能重复,而值(Value)可以重复。这是Map的基本特性,确保了每个键都能唯一标识一个值。比如HashMap、TreeMap等Map实现类都必须遵守这个规则。

Set是一个不允许重复元素的集合接口。Set的实现类(如HashSet)不保证元素的存储顺序,因此是无序的。虽然LinkedHashSet保持了插入顺序,TreeSet按照自然顺序排序,但Set接口本身的特性是无序的。

特性

volatile

4.下列关于 Java 中 volatile 关键字的说法正确的是()

A volatile 关键字修饰的变量被修改之前会从主存中读取最新的值覆盖掉cpu缓存

B volatie 底层实现遵循 happens-before 原则

C volatile 关键字修饰的共享变量是线程安全的

D volatile 关键字可以保证被修饰变量在运算时不会进行指令重排

volatile关键字是Java中用于保证变量可见性和有序性的重要机制。

volatile变量在每次被线程访问时,都强制从主内存中重新读取最新值,而不是使用线程工作内存中的值。这确保了变量的可见性。

volatile的实现确实遵循happens-before原则。happens-before原则是Java内存模型中的重要概念,它保证了volatile写操作一定happens-before于后续对这个volatile变量的读操作。

volatile关键字通过内存屏障(Memory Barrier)来阻止指令重排序。它能确保volatile变量读写操作的顺序性,防止编译器和处理器对这些操作进行重排序优化。

volatile不能保证线程安全。它只能保证变量的可见性和禁止指令重排序,但不能保证原子性。

volatile只能保证可见性和有序性,无法保证互斥性和原子性。例如count++这样的操作,volatile无法保证其原子性,因为这个操作实际包含读取、递增、写入三个步骤。

volatile只能用于修饰变量,不能修饰方法和类。这是Java语法规定的使用范围。

volatile不能完全替代锁机制。虽然volatile能保证可见性和有序性,但无法保证原子性,因此在需要互斥访问或原子操作的场景下,仍然需要使用synchronized等锁机制来实现线程安全。

Garbage Collection

5.在Java中,当对象的所有引用都消失后,对象使用的内存将自动回收是Garbage Collection

Garbage Collection(垃圾回收)是Java中的一种自动内存管理机制,当程序中的对象不再被引用时,JVM会自动回收这些对象占用的内存空间。C选项正确地描述了这一机制:当对象的所有引用都消失后,对象使用的内存将自动回收。

6.局部变量在Java中必须要先初始化后才能使用,直接运行的话直接会编译失败

重写

7.在java中重写方法应遵循规则的包括

在Java中重写(Override)方法确实需要遵循一些规则

可以有不同的访问修饰符

参数列表必须完全与被重写的方法相同

访问修饰符的限制不一定要大于被重写方法。实际上是可以相等,也可以更宽松,但不能更严格。例如,如果父类方法是protected,子类重写的方法可以是protected或public,但不能是private。

参数列表必须相同而不是不同。如果参数列表不同,那就变成了方法重载(Overload)而不是方法重写(Override)。

泛型

5.下列关于 Java 中泛型(Generics)的说法正确的是()

A 泛型可以在编译时检查类型安全性,避免运行时出现类型转换异常

B 泛型可以应用于类、接口和方法,但不能用于数组

C 泛型中的类型参数可以是任何类或接口类型,甚至包括基本数据类型

D 泛型中的类型参数只能是对象类型,不能是基本数据类型

泛型的一个主要优势就是在编译时进行类型检查。这可以帮助开发者在编码阶段就发现类型不匹配的问题,而不是等到运行时才出现ClassCastException。这提高了代码的类型安全性和可靠性。

Java泛型支持任何引用类型(类或接口)作为类型参数。这包括自定义类、集合类、包装类等所有对象类型。

Java泛型不仅可以应用于类、接口和方法,还可以用于数组。虽然不能直接创建泛型数组(如new T[]),但可以声明泛型数组类型。例如List[] array是合法的。

6.封住、继承、多态是面向对象的三大特征

封装就是将属性私有化,提供公有的方法访问私有属性,修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值( getter )方法和赋值( setter )方法,用于对这些属性的访问。
如:

1
2
3
4
5
6
7
private String name;
public String getName(){
return;
}
public void setName(String name){
this.name=name;
}

通过封装,可以实现对属性的数据访问限制,同时增加了程序的可维护性。
由于取值方法和赋值方法隐藏了实现的变更,因此并不会影响读取或修改该属性的类,避免了大规模的修改,程序的可维护性增强

7.instanceof是可以判断一个对象是否是类或者接口的对象

8.同一个类的不同对象会在堆内存中占用不同的内存空间,而静态成员则是该类所有对象共享的,存储在方法区中的静态区

9.因为Integer类型的默认值是null而不是1。作为包装类型,Integer对象的默认值是null。

int和Integer的主要区别还包括:

int是基本数据类型,而Integer是引用类型

int变量存储在栈中,而Integer对象存储在堆中

int不可以为null,而Integer可以为null

Integer提供了更多的方法来操作数据

10.在使用 interface 声明一个外部接口时,只可以使用public修饰符修饰该接口

11.java8中,下面ThreadLocal类用到了解决哈希冲突的开放定址法

序列化

12.以下关于对象序列化描述正确的是

A使用FileOutputStream可以将对象进行传输

B使用PrintWriter可以将对象进行传输

C使用transient修饰的变量不会被序列化

D对象序列化的所属类需要实现Serializable接口

在Java对象序列化中,C和D是正确的答案。

C选项正确:transient关键字用于声明不需要序列化的成员变量。当一个对象被序列化时,被transient修饰的变量的值不会被保存,在反序列化后,这些变量会被设置为默认值。这通常用于那些不需要或不应该被序列化的敏感数据或临时数据。

D选项正确:要实现对象序列化,该对象的类必须实现Serializable接口。这是Java序列化机制的基本要求,Serializable是一个标记接口,表明该类的对象可以被序列化。

A选项错误:FileOutputStream是字节流,它只能处理原始字节数据的写入,不能直接序列化对象。要序列化对象,需要使用ObjectOutputStream包装FileOutputStream。

B选项错误:PrintWriter是处理字符数据的输出流,主要用于写入文本数据,不能直接进行对象序列化。要序列化对象必须使用ObjectOutputStream

需要注意的是,正确的对象序列化过程通常需要:
\1. 实现Serializable接口
\2. 使用ObjectOutputStream进行序列化
\3. 可以通过transient关键字控制某些字段不被序列化

Servle

13.ServletConfig可以获得Servlet的初始化参数

每个Servlet都有自己的ServletConfig对象,可以通过init()方法获得。开发者可以在web.xml中通过标签为Servlet配置初始化参数,然后在代码中通过ServletConfig的getInitParameter()方法获取这些参数值。

ServletContext用于获取整个Web应用程序的配置信息和共享数据,

json

JSON格式有严格的语法规则要求

A选项 {company:4399} 错误原因:
- JSON中的键必须用双引号括起来
- 使用了中文冒号而不是英文冒号
正确写法应该是 {“company”:4399}

C选项 {[4399,4399,4399]} 错误原因:
- JSON对象必须是键值对的形式
- 数组不能直接作为对象的值,必须有键名
正确写法应该是 {“array”:[4399,4399,4399]}

接口

在Java中接口是一种完全抽象的类型,主要用于定义对象的行为规范。

接口中的方法默认就是public和abstract的。这是Java接口的特性,即使不显式声明这些修饰符,编译器也会自动添加。这样可以确保接口方法的可访问性和抽象性。

Java确实使用interface关键字定义接口,使用implements关键字实现接口。这是Java的基本语法规则,体现了面向对象编程中接口的语法实现方式。

Java支持多接口实现,一个类可以同时实现多个接口,这体现了Java的多继承特性。同时,接口之间也可以通过extends关键字实现继承,且支持多继承。

线程

10.TLS(线程局部存储)是一种特殊的存储机制,它为每个线程提供独立的变量副本

TLS确实是解决多线程访问冲突的一种技术。通过为每个线程提供独立的变量副本,避免了线程间的数据竞争,从而解决了并发访问冲突问题。

它会为每个线程创建并维护一个独立的变量副本,这些副本与特定线程绑定,其他线程无法访问。

虽然TLS为每个线程提供了独立的变量副本,但这并不意味着完全不需要同步。如果变量的操作涉及多个步骤,或者存在其他共享资源的访问,仍然可能需要同步机制。

Java中的ThreadLocal类就是TLS技术的一个具体实现。它提供了创建线程局部变量的功能,使每个线程都拥有自己的变量副本。

11.ThreadLocal是Java中实现线程本地存储的重要机制。

ThreadLocal确实采用哈希表的实现方式,在Thread类中有一个ThreadLocalMap成员变量,用于存储本线程的ThreadLocal变量。每个线程访问ThreadLocal变量时,实际是在操作自己的ThreadLocalMap中的副本。

ThreadLocal的设计目的就是为了保证线程安全,它为每个线程提供了独立的变量副本,使得每个线程都可以独立地改变自己的副本,而不会影响其他线程的数据。

ThreadLocal不是继承自Thread类,它是一个独立的类,主要用于实现线程本地存储。

ThreadLocal并没有实现Runnable接口,它与线程的执行方式无关,只负责提供线程本地变量的存储机制。

ThreadLocal的重要作用恰恰相反,它是为了避免多线程间共享数据,而是让每个线程都拥有自己的数据副本,实现线程间的数据隔离。共享数据会导致线程安全问题,而ThreadLocal正是解决这个问题的一种方案。

用了开放定址法来解决了hash冲突问题

IO流

1.Java IO确实包含了字符流和字节流两种输入输出方式。字节流以字节为单位进行操作(如InputStream、OutputStream),字符流以字符为单位进行操作(如Reader、Writer)。这是Java IO的基本架构设计。

InputStream和OutputStream都是抽象类,它们分别是所有字节输入流和输出流的抽象基类。作为抽象类,它们不能直接实例化使用,必须使用它们的具体子类,如FileInputStream、ByteArrayOutputStream等。

Reader和Writer确实是字符流的抽象基类,它们提供了字符流操作的基本接口。所有的字符流类都继承自这两个抽象类。

Scanner类不仅可以从键盘读取数据,还可以从文件、字符串等多种数据源读取数据。它是一个通用的数据读取类,可以解析各种格式的输入。例如可以使用Scanner(File file)构造方法来读取文件,使用Scanner(String source)来读取字符串等。

File类中的mkdir()和mkdirs()方法都可以用来创建文件夹,其中:
- mkdir()方法用于创建单个目录
- mkdirs()方法用于创建多级目录,如果父目录不存在会自动创建父目录

AWT

AWT中TextField是专门用于文本输入的组件类,它允许用户输入和编辑单行文本

Menu是菜单组件类,用于创建下拉菜单,不是文本框组件

Label是标签组件类,用于显示不可编辑的文本标签

List是列表组件类,用于显示可选择的列表项目

TextField作为文本框组件的主要特点包括:
\1. 支持文本输入和编辑
\2. 可以设置文本框的大小和位置
\3. 可以响应文本变化事件
\4. 可以设置是否支持编辑、是否可见等属性
\5. 可以通过getText()和setText()方法获取和设置文本内容

分布式

1.Mapreduce是用于分布式数据分析的通用计算模型和运行时系统