答题与解题(7)

JavaSE专题

1、下列说法正确的有(A)
A、数组是一种对象
B、数组属于一种原生类
C、int number=[]={31,23,33,43,35,63}
D、数组的大小可以任意改变

解题:原生类是指Java中,数据类型分为基本数据类型(或叫做原生类、内置类型)和引用数据类型。在Java中,任何事物都可为对象,所以数组是对象。

2、在 JAVA 编程中, Java 编译器会将 Java 程序转换为(A )
A、字节码
B、可执行代码
C、机器代码
D、以上都不对

解题:编译器将Java源代码编译成字节码class文件
类加载到JVM里面后,执行引擎把字节码转为可执行代码
执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行。

3、下面哪个标识符是合法的?D
A、“9HelloWorld”
B、"_Hello World"
C、“Hello*World”
D、“Hello$World”

解题:java的变量名有三种元素构成:数字+字符+$+下划线。
java对这三种元素的顺序也是有要求的:不能以数字开头+不能是关键字.
A中错在以数字开头、B中错在有空格、C中错在有*.

4、以下描述错误的一项是(C )?
A、程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行 到了第几行,是线程隔离的
B、原则上讲,所有的对象都是在堆区上分配内存,是线程之间共享的
C、方法区用于存储JVM加载的类信息、常量、静态变量,即使编译器编译后的代码等数据,是线程隔离的
D、Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的

解题:JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
栈区:
1、每个线程包含一个栈区,栈中只保存方法中(不包括对象的成员变量)的基础数据类型和自定义对象的引用(不是对象),对象都存放在堆区中
2、每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3、栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
堆区:
1、存储的全部是对象实例,每个对象都包含一个与之对应的class的信息(class信息存放在方法区)。
jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,几乎2、所有的对象实例和数组都在堆中分配。
方法区:
又叫静态区,跟堆一样,被所有的线程共享。它用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

5、关于JAVA的垃圾回收机制,下面哪些结论是正确?B
A、程序可以任意指定释放内存的时间
B、JAVA程序不能依赖于垃圾回收的时间或者顺序
C、程序可明确地标识某个局部变量的引用不再被使用
D、程序可以显式地立即释放对象占有的内存

解题:java提供了一个系统级的线程,即垃圾回收器线程。用来对每一个分配出去的内存空间进行跟踪。当JVM空闲时,自动回收每块可能被回收的内存,GC是完全自动的,不能被强制执行。程序员最多只能用System.gc()来建议执行垃圾回收器回收内存,但是具体的回收时间,是不可知的。
当对象的引用变量被赋值为null,可能被当成垃圾。

6、设int x=1,float y=2,则表达式x/y的值是:(D)
A、0
B、1
C、2
D、以上都不是

解题:不同基本数据类型转化与运算byte-short-int-long-float-double,float=1转化为float=1.0,int/float相比先转化为同一类型即float(1.0)/float(2.0)=0.5

7、下面属于JSP内置对象的是?ABCD
A、out对象
B、response对象
C、application对象
D、page对象

解题:JSP内置对象有:
1.request对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
2.response对象
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
3.session对象
session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例.
4.out对象
out对象是JspWriter类的实例,是向客户端输出内容常用的对象
5.page对象
page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
6.application对象
application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
7.exception对象
exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
8.pageContext对象
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本 类名也叫pageContext。
9.config对象
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)

8、下面哪些属于JSP内置对象及方法?ABCD
A、request
B、out
C、application
D、config

解题:根据上题可以会得出答案

9、下面有关 JAVA 异常类的描述,说法正确的有(ABC)
A、异常的继承结构:基类为 Throwable,Error 和 Exception 实现 Throwable,RuntimeException 和 IOException 等继承 Exception
B、非 RuntimeException 一般是外部错误(不考虑Error的情况下),其必须在当前类被 try{}catch 语句块所捕获
C、Error 类体系描述了 Java 运行系统中的内部错误以及资源耗尽的情形,Error 不需要捕捉
D、RuntimeException 体系包括错误的类型转换、数组越界访问和试图访问空指针等等,必须 被 try{}catch 语句块所捕获

解题:在这里插入图片描述
都是Throwable的子类:
1.Exception(异常) :是程序本身可以处理的异常。
2.Error(错误): 是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,一般不需要程序处理。
3.检查异常(编译器要求必须处置的异常) : 除了Error,RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
4.非检查异常(编译器不要求处置的异常): 包括运行时异常(RuntimeException与其子类)和错误(Error)。

10、下面哪项技术可以用在WEB开发中实现会话跟踪实现?ABCD
A、session
B、Cookie
C、地址重写
D、隐藏域

会话跟踪是一种灵活、轻便的机制,它使Web上的状态编程变为可能。
HTTP是一种无状态协议,每当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的、非连续的。当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟踪技术就可以解决这个问题。当一个客户在多个页面间切换时,服务器会保存该用户的信息。
有四种方法可以实现会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。
1).隐藏表单域:,非常适合步需要大量数据存储的会话应用。
2).URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。
3).Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP
响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个
Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至
在客户端计算机重启后它仍可以保留其值
4).Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话

数组专题

1、已知二维数组A10×10中,元素a20的地址为560,每个元素占4个字节,则元素a10的地址为( A)。
A、520
B、522
C、524
D、518

解题:元素a20表示a[2][0]为第三行第一列的那个元素的地址为560,每个元素占4个字节,元素a10表示a[1][0]第二行第一列的那个元素的,已知二维数组为A10×10,所以a[2][0]和a[1][0]相距10个元素,所以4*10=40个字节

2、设有一个 10 阶的下三角矩阵 A (包括对角线),按照从上到下、从左到右的顺序存储到连续的 55 个存储单元中,每个数组元素占 1 个字节的存储空间,则 A[5][4] 地址与 A[0][0] 的地址之差为( B)
A、10
B、19
C、28
D、55

解题:下三角矩阵A,
A[5][5]的地址:1+2+3+4+5+6=21
A[5][4]地址:21-1=20
A[5][4]-A[0][0]=20-1=19

3、下面描述中正确的为:C
A、线性表的逻辑顺序与物理顺序总是一致的。
B、线性表的顺序存储表示优于链式存储表示。
C、线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。
D、二维数组是其数组元素为线性表的线性表。

解题:A,线性表逻辑上是线性的,存储上可以是顺序的,可以是链式的
B,顺序存储和链式存储各有优缺点
C,链式存储可以连续,可以不连续,存储时不管其连续还是不连续,都是用指针指向下一个结点
D,二维数组是顺序存储的线性表,其元素都是线性表的元素

4、设一维数组中有n个数组元素,则读取第i个数组元素的平均时间复杂度为(C)。
A、O(n)
B、O(nlog2n)
C、O(1)
D、O(n2)

解题:数组读取元素
一维数组读取:address = a[0] + i * Type_size,地址寻址的方式读取数据。
二维数组读取:address = a[0][0] + (i*m + j)*Type_size(对于 m * n 的数组),也是利用地址寻址的方式读取数据。

5、下列程序的功能是求两个 2 行 3 列的数组的和,即数组对应位置的元素—相加,请为横线处选择合适的程序(D)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
A、void M::
B、friend M
C、M
D、M M::

解题:作为学习Java的我一脸蒙蔽,所以就看看人家的评论
M M::中,第一个M的表示返回值的类型,第二个M是类名,该函数最后return c,c又是类M的对象,所以返回值的类型是类M

链表专题

1、给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
在这里插入图片描述
**问题分析:**此题考察对链表的应用,这里我们就要用到ListNode,然后分析题目,将链表的对应位置相加,重新给于一个新的链表。
在这里插入图片描述
这里先考虑新的链表,需不需要虚拟头结点,当然搞一个虚拟的比较方便,因为你返回新链表只需要返回虚拟头结点的下一跳就可以,大大方便我们操作。然后开始相当,这里我们不能直接放相加的值,因为两者相加可能大于10,所以放它们的余数,然后重新定义个变量来确定它有没有进位,还有就是必须尾插,用头插就不能符合题意得逆序,有进位下一位就必须加上这个变量。当然不排除两者链表其中之一元素一多一少,我们应该将多的直接往后添加就行。
代码实现:

		ListNode head = new ListNode(0);
		ListNode rear = head;
		int count = 0;
		while (true) {
			if (l1 == null && l2 == null && count == 0) {
				break;
			}
			int num = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + count;
			ListNode p = new ListNode(num % 10);
			rear.next = p;
			rear = p;
			count = num / 10;
			l1 = l1 == null ? null : l1.next; //特殊情况l1与l2两者有一者已经结束得情况
			l2 = l2 == null ? null : l2.next;

		}

		return head.next;

2、给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
在这里插入图片描述
**问题解析:**问题想让我们使用一次遍历就将该元素移除,那么不能常规得方法,这里记住当遇到数组和链表我们一定要想想双指针能不能更好一点。
在这里插入图片描述
首先我们要判断该链表是否为空或者头结点得下一跳为空,如果是就返回null
创建两个结点,一个为r一个为l,然后先让l先走n次,然后判断当前l是否为空,如果为空则饭后头结点得下一跳,否则做一个循环让r结点和l结点一起运动,条件是先走的l不能为空,循环结束我们直接让r得下一跳等一它自身下一跳得下一跳,就相当于让删除元素踢开。
代码实现:

if (head == null || head.next == null) {
			return null;
		}
		ListNode r = head;
		ListNode l = head;
		for (int i = 1; i <= n; i++) {
			r = r.next;
		}
		if (r == null) {
			return head.next;
		}
		while (r.next != null) {
			r = r.next;
			l = l.next;
		}
		l.next = l.next.next;

		return head;

3、将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
在这里插入图片描述
**问题解析:**此问题,跟之前得都一样,就是两个结点进行比较,谁小谁进新的链表,当然有特殊情况,并且题都是给的有序得,当然两个结点相等时,都必须进去。
在这里插入图片描述
首先需要创建一个新的结点,然后定义一个 结点来确定此时得位置,在创建两个结点指向l1和l2的结点,然后开始循环,此时就开始要分析情况
1、当l1和l2为空的时候,直接跳出循环
2、当有一边为空的时候,另一边就需要指向此时的定义结点
3、当然当前两者的前者小于后者,将前者指向此时当前定义的结点,否则后者指向此时当前定义的结点,最后定义的结点每次都要后移。
代码实现:

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
		ListNode head = new ListNode(0);
		ListNode p = head;
		ListNode p1 = l1;
		ListNode p2 = l2;
		while (true) {
			if (p1 == null && p2 == null) {
				break;
			}
			if (p1 != null && p2 == null) {
				p.next = p1;
				break;
			} else if (p1 == null && p2 != null) {
				p.next = p2;
				break;
			} else if (p1.val <= p2.val) {
				p.next = p1;
				p1 = p1.next;
			} else {
				p.next=p2;
				p2=p2.next;
			}
			p = p.next;
		}
		return head.next;
	}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值