Java寒假作业——问答题

Java寒假作业

一、问答题(26-50题)

26 解释进程和线程的区别

进程和线程的区别主要包括:

1)线程的划分尺度小于进程,线程隶属于某个进程;

2)进程是程序的一种动态形式,是CPU、内存等资源占用的基本单位,而线程是不能独立的占有这些资源的;

3)进程之间相互独立,通信比较困难,而线程之间共享一块内存区域,通信比较方便;

4)进程在执行过程中,包含比较固定的入口、执行顺序和出口,而线程的这些过程会被应用程序所控制。

27 实现线程的方式有哪些?

线程的实现方式共有四种,第一种是继承Thread抽象类;第二种是实现Runnable接口;第三种是实现Callable接口;最后一种是通过线程池创建线程。

1)继承Thread类

写一个类去继承Thread类,重写其中的run()方法,然后调用start()方法启动线程。

2)实现Runnable接口

写一个类去实现Runnable接口,重写其中的run()方法;用用实现Runnable接口的对象作为参数实例化一个Thread对象,调用Thread类的start()方法来启动线程。

3)实现Callable接口

实现Callable接口,重写call()方法来实现一个线程

4)通过线程池创建线程

线程池可以自动创建也可以手动创建,自动创建体现在Executors工具类中,常见的可以创建newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool;手动创建体现在可以灵活设置线程池的各个参数,体现在代码中即ThreadPoolExecutor类构造器上各个实参的不同:

原文链接:https://blog.csdn.net/blanceage/article/details/125139386

28 如何使用synchronized来让线程同步?

sychronized关键字代表要为某一段代码加上一个同步锁,这样的锁是绑定在某一个对象上边的。如果是同步代码块,需要为该synchronized关键字提供一个对象的引用;如果是同步方法,只需要加一个sychronized关键字修饰。

sychronized为某段代码加上锁以后,某个线程进入该段代码之前,首先需要检查该锁是否被占用,如果没有被占用则继续执行;如果已经被占用,则需要等到该锁被释放以后才能继续执行。其中,线程执行完该段代码就是释放锁的标志。

29 为什么会有线程安全问题?

1)多线程抢占式执行

导致线程安全问题的第一大因素就是多线程抢占式执行,想象一下,如果是单线程执行,或者是多线程有序执行,那就不会出现混乱的情况了,不出现混乱的情况,自然就不会出现非线程安全的问题了。

2)多个线程同时操作一个变量

如果是多线程同时修改不同的变量(每个线程只修改自己的变量),也是不会出现非线程安全的问题了,

3)非原子性操作

原子性操作是指操作不能再被分隔就叫原子性操作。

比如人类吸气或者是呼气这个动作,它是一瞬间一次性完成的,你不可能先吸一半(气),停下来玩会手机,再吸一半(气),这种操作就是原子性操作。而非原子性操作是我现在要去睡觉,但睡觉之前要先上床,再拉被子,再躺下、再入睡等一系列的操作综合在一起组成的,这就是非原子性操作。非原子性操作是有可以被分隔和打断的,比如要上床之前,发现时间还在,先刷个剧、刷会手机、再玩会游戏,甚至是再吃点小烧烤等等,所以非原子性操作有很多不确定性,而这些不确定性就会造成线程安全问题问题。像 i++ 和 i– 这种操作就是非原子的,它在 +1 或 -1 之前,先要查询原变量的值,并不是一次性完成的,所以就会导致线程安全问题。

4)内存不可见

所谓内存不可见性,就是线程对某个共享变量在线程自己的缓冲中存在副本的时候对主内存中共享变量的值是不可见的,看不见主存中的值。所以就会导致线程安全问题。

5)指令重排序(编译器优化)

指令重排序是指 Java 程序为了提高程序的执行速度,所以会对一下操作进行合并和优化的操作。比如说,张三要去图书馆还书,舍友又让张三帮忙借书,那么程序的执行思维是,张三先去图书馆把自己的书还了,再去一趟图书馆帮舍友把书借回来。而指令重排序之后,把两次执行合并了,张三带着自己的书去图书馆把书先还了,再帮舍友把书借出来,整个流程就执行完了,这是正常情况下的指令重排序的好处。但是指令重排序也有 “副作用”,而 “副作用” 是发生在多线程执行中的,还是以张三借书和帮舍友还书为例,如果张三是一件事做完再做另一件事是没有问题的(也就是单线程执行是没有问题的),但如果是多线程执行,就是两件事由多个人混合着做,比如张三在图书馆遇到了自己的多个同学,于是就把任务分派给多个人一起执行,有人借了几本书、有人借了还了几本书、有人再借了几本书、有人再借了还了几本书,执行的很混乱没有明确的目标,到最后悲剧就发生了,这就是在指令重排序带来的线程安全问题。

原文链接:https://www.wangan.com/wenda/9998

30 什么是锁并解释死锁的原因?

死锁:是指多个进程在运行过程中因争夺资源而造成的一种僵局当进程处于这种僵局时若无外力作用它们都将无法再向前推进。

产生死锁的原因:

1)竞争资源。当系统中供多个进程共享的资源其数目不足以满足诸进程的需要时会引起计算进程对资源的竞争而产生死锁。

2)进程间推进顺序非法。进程在运行过程中请求和释放资源的顺序不当也同样会导致产生进程死锁。

31 反射的原理是什么?

Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编·译,从而获取对象的各种信息。

Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。

32 Class类的含义和作用是什么?

class的意思为“类”,是java中的一个类,是定义一个特定类的实现,存在于java.lang包中,它的构造函数是私有的,由JVM(类加载器)创建Class对象,可以通过getClass()方法获取到Class对象。

33 创建对象有哪几种形式?

一般使用字面量的形式直接创建对象,但是这种创建方式对于创建大量相似对象的时候,会产生大量的重复代码。但 js和一般的面向对象的语言不同,在 ES6 之前它没有类的概念。但是可以使用函数来进行模拟,从而产生出可复用的对象创建方式,常见的有以下几种

1.第一种是工厂模式,工厂模式的主要工作原理是用函数来封装创建对象的细节,从而通过调用函数来达到复用的目的。但是它有一个很大的问题就是创建出来的对象无法和某个类型联系起来,它只是简单的封装了复用代码,而没有建立起对象和类型间的关系

2.第二种是构造函数模式。js 中每一个函数都可以作为构造函数,只要一个函数是通过 new 来调用的,那么就可以把它称为构造函数。执行构造函数首先会创建一个对象,然后将对象的原型指向构造函数的 prototype 属性,然后将执行上下文中的 this 指向这个对象,最后再执行整个函数,如果返回值不是对象,则返回新建的对象。因为 this 的值指向了新建的对象,因此可以使用 this 给对象赋值。构造函数模式相对于工厂模式的优点是,所创建的对象和构造函数建立起了联系,因此可以通过原型来识别对象的类型。但是构造函数存在一个缺点就是,造成了不必要的函数对象的创建,因为在 js 中函数也是一个对象,因此如果对象属性中如果包含函数的话,那么每次都会新建一个函数对象,浪费了不必要的内存空间,因为函数是所有的实例都可以通用的

3.第三种模式是原型模式,因为每一个函数都有一个 prototype 属性,这个属性是一个对象,它包含了通过构造函数创建的所有实例都能共享的属性和方法。因此可以使用原型对象来添加公用属性和方法,从而实现代码的复用。这种方式相对于构造函数模式来说,解决了函数对象的复用问题。但是这种模式也存在一些问题,一个是没有办法通过传入参数来初始化值,另一个是如果存在一个引用类型如 Array 这样的值,那么所有的实例将共享一个对象,一个实例对引用类型值的改变会影响所有的实例。

4.第四种模式是组合使用构造函数模式和原型模式,这是创建自定义类型的最常见方式。因为构造函数模式和原型模式分开使用都存在一些问题,因此可以组合使用这两种模式,通过构造函数来初始化对象的属性,通过原型对象来实现函数方法的复用。这种方法很好的解决了两种模式单独使用时的缺点,但是有一点不足的就是,因为使用了两种不同的模式,所以对于代码的封装性不够好

5.第五种模式是动态原型模式,这一种模式将原型方法赋值的创建过程移动到了构造函数的内部,通过对属性是否存在的判断,可以实现仅在第一次调用函数时对原型对象赋值一次的效果。这一种方式很好地对上面的混合模式进行了封装

6.第六种模式是寄生构造函数模式,这一种模式和工厂模式的实现基本相同,我对这个模式的理解是,它主要是基于一个已有的类型,在实例化时对实例化的对象进行扩展。这样既不用修改原来的构造函数,也达到了扩展对象的目的。它的一个缺点和工厂模式一样,无法实现对象的识别

原文链接:https://blog.csdn.net/hddlsj/article/details/123029298

参考连链接:https://www.cnblogs.com/gromimiss/p/5938647.html

34 如何利用反射机制来访问一个类的私有成员?

想要实现访问类的私有成员,我们有两个思路,一个是将私有成员转换成公有成员,另一个思路是在访问私有成员的时候绕过java语言检测。

绕过java语言检测,这需要用到新的java知识——反射。

首先创建一个对象。在主函数里写一个方法,先获取相关对象,然后获取其构造函数,执行构造函数创建对象,获取此对象的相关方法(如果该方法是非公有方法需要用getDeclaredMethod方法获取),非公有方法需要用setAccessible绕过java语言检测,最后执行这些方法即可。

原文链接:https://blog.csdn.net/weixin_41475710/article/details/82841911

35 什么是TCP什么是UDP?

TCP/IP协议族为运输层指明了两个协议:TCP和UDP,它们都是作为应同程序和网络操作的中介物。

TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义TCP是面向连接的、可靠的流协议。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

两者的区别:

1、TCP是面向连接的,UDP是面向无连接的;

2、UDP程序结构较简单;

3、TCP是面向字节流的,UDP是基于数据报的;

4、TCP保证数据正确性,UDP可能丢包;

5、TCP保证数据顺序,UDP不保证。

36 简述七层网络模型架构

应用层

网络服务与最终用户的一个接口。

协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

表示层

数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)

格式有,JPEG、ASCll、EBCDIC、加密格式

会话层

建立、管理、终止会话。(在五层模型里面已经合并到了应用层)

对应主机进程,指本地主机与远程主机正在进行的会话

传输层

定义传输数据的协议端口号,以及流控和差错校验。

协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层

网络层

进行逻辑地址寻址,实现不同网络之间的路径选择。

协议有:ICMP IGMP IP(IPV4 IPV6)

数据链路层

建立逻辑连接、进行硬件地址寻址、差错校验 [3] 等功能。(由底层网络定义协议)

将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。

物理层

建立、维护、断开物理连接。(由底层网络定义协议)

37 简述对TCP/IP协议的理解

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCPIP两个协议,而是指一个由FTPSMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。

38 什么是IP?

IP指网际互连协议,Internet Protocol的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。

IP 地址是一个唯一地址,用于标识互联网或本地网络上的设备。IP 代表“互联网协议”,它是控制通过互联网或本地网络发送的数据格式的一组规则。本质上,IP 地址是允许在网络上的设备之间发送信息的标识符:它们包含位置信息,并使设备可进行通信。

IP 地址是一串由句点分隔的数字。IP 地址表示为一组四个数字,比如 192.158.1.38 就是一个例子。该组合中的每个数字都可以在 0 到 255 的范围内。因此,完整的 IP 寻址范围从 0.0.0.0 到 255.255.255.255。

39 什么是NAT?

NAT(Network Address Translation,网络地址转换)是一种地址转换技术,它可以将 IP 数据报文头中的 IP 地址转换为另一个 IP 地址,并通过转换端口号达到地址重用的目的。NAT 作为一种缓解 IPv4 公网地址枯竭的过渡技术,由于实现简单,得到了广泛应用。

40 什么是DNS?

DNS是域名系统(DomainNameSystem)的缩写。该系统用于命名组织到域层次结构中的计算机和网络服务。域名是由圆点分开一串单词或缩写组成的,每一个域名都对应一个唯一的IP地址,在Internet上域名与IP地址之间是一对应的,DNS就是进行域名解析的服务器。

41 什么是DHCP?

DHCP(Dynamic Host Configuration Protocol),动态主机配置协议:计算机用来获得配置信息的协议。DHCP容许给某一计算机赋以IP地址而不需要管理者在服务器数据中配置有关该计算机信息。DHCP作用就是给PC分配一个IP。在一个局域网里面,你的路由有这个功能的话,那它就会把PC的MC地址记住,然后给这个PC分配一个IP地址,然后这个MC地址的PC以后就用这个IP地址上网,作用就是可以防止外来PC上网,和避免IP地址重复使用造成的错误。

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。DHCP有3个端口,其中UDP67和UDP68为正常的DHCP服务端口,分别作为DHCP Server和DHCP Client的服务端口;546号端口用于DHCPv6 Client,而不用于DHCPv4,是为DHCP failover服务,这是需要特别开启的服务,DHCP failover是用来做“双机热备”的。

42 子网掩码是干什么的?

子网掩码(subnet mask)又叫网络掩码地址掩码、子网络遮罩,它用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。

子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在广域网上。

43 IP地址分类有哪些?

ip地址分为5类:

1)A类地址 1.0.0.1-127.255.255.254

是指在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码;

2)B类地址 128.0.0.1-191.255.255.254

是指在IP地址的四段号码中,前两段号码为网络号码;

3)C类地址 192.0.0.1-223.255.255.254

是指在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码;

4)D类地址 224.0.0.0-239.255.255.255。

其第一个字节以“1110”开始,是一个专门保留的地址;

5)E类地址,以“1111”开始。

其中240.0.0.0~255.255.255.254作为保留地址,255.255.255.255作为广播地址。

44 Java与C/C++有什么异同?

Java 与C ++都是面向对象的语言,都使用了面向对象思想 (例如封装、继承、多态等),由于面向对象有许多非常好的特性(继承、组合等),因此二者都有很好的可重用性。

Java与C/C++的区别:

Java 是由 C++发展而来的,保留了 C++的大部分内容,其编程方式类似于 C++。但Java 的句法更清晰、规模更小、更易学。Sun 公司对多种程序设计语言进行了深入研究,并摒弃了其他语言的不足之处,最终推出了 Java语言。

1)Java 没有指针的概念,从而有效地防止了在 C/C++语言中,容易出现的指针操作失误(如指针悬空所造成的系统崩溃)。在 C/C++中,指针操作内存时,经常会出现错误。在Java 中没有指针,更有利于Java程序的安全。

2)多重继承C++支持多重继承,它允许多父类派生一个子类。也就是说,一个类允许继承多个父类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦、编译程序实现它也很不容易。所以 Java 不支持多重然承,但允许一个类实现多个接口。可见,Java 既实现了C++多重继承的功能。又避免了 C++的许多缺陷。

3)数据类型Java 是完全面向对象的语言,所有方法和数据都必须是类的一部分。除了基本数据类型之外,其余类型的数据都作为对象型数据。例如对象型数据包括字符串和数组。类将数据和方法结合起来,把它们封装在其中,这样每个对象都可实现具有自己特点的行为。而 C++将函数和变量定义为全局的,然后再来调用这些函数和变量,从而增加了程序的负担。此外,ava 还取消了C/C++中的结构和联合,使编译程序更简洁。

4)自动内存管理Java 程序中所有的对象都是用 new 操作符建立在堆栈上的,这个操作符类似于 C++的"new"操作符。Java 自动进行无用内存回收操作,不需要程序员进行删除。当Java 中一个对象不再被用到时,无须使用内存回收器,只需要给它加上标签以示删除。无用内存的回收器在后台运行,利用空闲时间工作。而C++中必须由程序释放内存资源,增加了程序设计者的负担。

5)操作符重载Java 不支持操作符重载,操作符重载被认为是 C++的突出特征。在 Java 中虽然类可以实现这样的功能,但不支持操作符重载,这样是为了保持 Java 语言尽可能简单。

6)预处理功能C/C++在编译过程中都有一个预编译阶段,即预处理器。预处理器为开发人员提供了方便,但增加了编译的复杂性。Java 允许预处理,但不支持预处理器功能,因为 Java 没有预处理器,所以为了实现预处理,它提供了引入语句(import),它与 C++预处理器的功能类似。

Java 不支持缺省函数参数,而 C++支持。在语言中,代码组织在函数中,函数可以访问程序的全局变量。C++增加了类,提供了类算法,该算法是与类相连的函数,C++类方法与Java 类方法十分相似。由于 C++仍然支持 C,所以C++程序中仍然可以使用C 的函数,结果导致函数和方法混合使用,使得 C++程序比较混乱。

Java 没有函数,作为一个比C++更纯的面向对象的语言。Java 强迫开发人员把所有例行程序包括在类中。事实上,用方法实现例行程序可激励开发人员更好地组织编码。

45 Java中的作用域有哪些?

1)public。表明该成员变量或方法对所有类或对象都是可见的,所有类或对象都可以直

接访问。

2)private。表明该成员变量或方法是私有的,只有当前类对其具有访问权限,除此之外

的其他类或者对象都没有访问权限。

3)protected。表明该成员变量或方法对自己及其子类是可见的,即自己和子类具有权限访问,除此之外的其他类或者对象都没有访问权限。

4)default。表明该成员变量或方法只有自己和与其位于同一包内的类可见。若父类与子类位于同一个包内,则子类对父类的default的成员变量或方法都有访问权限。若父类与子类位于不同的 package(包)内,则没有访问权限。

需要注意的是,这些修饰符只能修饰成员变量,不能用来修饰局部变量。private 与 protected 不能用来修饰类(只有 public、abstract 或 final能用来修饰类)。

原文链接:https://blog.csdn.net/m0_65562481/article/details/124586582

46 一个Java文件中是否可以定义多个类?

一个java文件中可以定义多个类,但是最多只有一个类被public修饰,并且这个类的类名与文件名必须相同,若这个文件中没有public的类,则文件名随便是一个类的名字即可。需要注意的是,当用javac指令编译有多个类的Java文件时,它会给每一个类生成一个对应的.class 文件

一个java文件中可以有很多类。不过注意以下几点:

1、public 限的类只能有一个(也可以一个都没有,但最多只有1个)

2、这个.java文件的文件名必须是public类的类名(一般的情况下,这里放置main方法是程序的入口。)

3、若这个文件中没有public的类,则文件名随便是一个类的名字即可

4、用javac 编译这个.java文件的时候,它会给每一个类生成一个.class文件

47 为什么Java中有些接口没有任何方法?

在 Java 语言中,有些接口内部没有声明任何方法,也就是说,实现这些接口的类不需要

重写任何方法,这些没有任何方法声明的接口又被叫做标识接口,标识接口对实现它的类没有

任何语义上的要求,它仅仅充当一个标识的作用,用来表明实现它的类属于一个特定的类型。

这个标签类似于汽车的标志图标,每当人们看到一个汽车的标志图标时,就能知道这款汽车的

品牌。Java 类库中已存在的标识接口有 Cloneable 和 Serializable 等。在使用时会经常用 instan-

ceof 来判断实例对象的类型是否实现了一个给定的标识接口。

原文链接:https://blog.csdn.net/m0_65562481/article/details/124590321

48 Java中的clone方法有什么作用?

Java中所有的类都默认继承自Object类,而Object类中提供了一个clone()方法,这个方法的作用是返回一个Object对象的复制,这个复制方法返回的是一个新的对象而不是一个引用。以下是使用clone()方法的步骤:

1.实现clone的类首先需要继承Cloneable接口(Cloneable接口实质是一个标识接口,没有任何的接口方法)。

2.在类中重写Object类中的clone()方法

3.在clone()方法中调用super.clone()。无论clone类继承结构是什么,super.clone()会直接或间接java.lang.Object类中的clone()方法。

4.把浅复制的引用指向原型对象新的克隆体。

原文链接:https://blog.csdn.net/qq_41378597/article/details/90456972

49 什么是浅拷贝和深拷贝?

浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用

深拷贝: 创建一个新的对象和数组,将原对象的各项属性的“”(数组的所有元素)拷贝过来,是“值”而不是“引用”

50 什么是反射机制?

1)反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

2)对于任意一个对象,都能够调用它的任意一个方法和属性;

3)这种动态获取的信息以及动态调用对象的方法的功能就是反射机制;

4)也就是说通过反射机制,我们可以获取想要获取到的东西,对前面所学到的范围限定词的限制就可以打破约束

原文链接:https://blog.csdn.net/qq_45874107/article/details/114498777

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值