2.在一个单链表中,p、q分别指向表中两个相邻的结点,且q所指结点是p所指结点的直接后继,现要删除q所指结点,可用的语句是( )。
解析:假设p->next= s,q->next= t,根据题意还有s->next= t,如果想删除t节点,那么p->next= s,q->next= s,也就是p->next=q->next
8.一棵满二叉树同时又是一棵平衡树。这种说法()
解析:平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1。常见的符合平衡树的有,B树(多路平衡搜索树)、AVL树(二叉平衡搜索树)等。
16.在 C/C++ 中,有字符数组 a[80] 和 b[80],则正确的输出语句是()
解析:printf(“格式控制字符串”, 输出列表); 如:printf("%s", string);
putchar(字符数据); 如:char a_c=‘h’;putchar(a_c);
puts(字符串); 如:puts(“hello girl”);
20.下面代码运行结果是?
解析:Value方法中的i初始值为15,从main方法向下走,每次new一次,对象名称在栈中,栈中有一个指针指向队中new开辟出来的内存空间,堆中包含方法和属性,传过去一个对象 然后在另一个方法里面把这个参数的属性改变了,改变的是堆中的内容;main方法中调用了first方法,first方法,v.i=25,此时Value中的i由15变为25,继续调用second方法,v.i=20,把堆传过去了原本方法的变量和参数变量都指向同一个堆所以first中的v.i就不是25了,就变成20了,此时new了Value,所以v = val = 15 ,所以最后输出就是 15 0 2021.将下列哪个代码(A、B、C、D)放入程序中标注的【代码】处将导致编译错误?
解析:B类继承自A类,A类中存在一个getNum()方法,问下列哪个会出错。
也就是说,问,下列哪个重写A的getNum()方法出错。
重写要满足的条件:(好比父亲给儿子100块钱让儿子去花)
1.参数列表要完全相同——(你拿的就是100块钱,变不成别的,怎么花随你,但是钱数、参数列表不变)
2.返回类型是父类方法的返回类型的子类型——(返回值,可以说是你花100得到的是价值小于等于100的东西,你能买回来的一定在100之内)
3.访问权限不能大于父类方法权限——(就是访问修饰符要比父类的小于等于)
这里访问权限都相同,返回类型都是基本类型,只看相不相同就可以
A.返回值类型相同,参数名参数列表相同,满足方法重写,是正确的
B.返回值类型不同,参数名参数列表相同,是重写但不满足重写条件,错误
C.返回值类型不同,参数名参数列表不同,不是重写,只是一个重名方法
D.返回值类型不同,参数名参数列表不同,不是重写,只是一个重名方法
所以选B
22.
解析:选C
方法区:主要存储结构信息的地方,比如方法体,同时也是存储静态变量,以及静态代码块的区域,构造函数,常量池,接口初始化等等
方法区物理上还是在堆中,是在堆的持久代里面。堆有年轻代 (由一个Eden区和俩个survivor区组成),老年代,持久代。新创建的对象都在年轻代的Eden区,经过一次JC收集后,存活下来的会被复制到survivor区(一个满了,就全部移动到另外一个大的中,但要保证其中一个survivor为空),经过多次JC后,还存活的对象就被移到老年代了。
持久代就是经常说的方法区里面存放类信息,常量池,方法等
static String str0=“0123456789”;
static String str1=“0123456789”;是放在方法区里。也就是持久代,题目中已经说了,不包含持久代,所以剩余空间为5+5+5=15.
23.
解析:非静态成员只能被类的实例化对象引用,因此这里在静态方法中访问x会造成编译出错
26.广义表即我们通常所说的列表(lists)。它放松了对表元素的原子性限制,允许他们有自身结构。那么广义表E((a,(a,b),((a,b),c)))的长度和深度分别为:
解析:
广义表长度=属于最外层括号的逗号数加一。本题逗号为0 所以长度为1
广义表深度=删除几层括号后可成为一个序列。
27.以下代码段执行后的输出结果为
解析:答案是 编译错误。
这题编译错误在于这一句: i = ++(i++);
++( ) 括号里面必须是一个变量,而 i ++ 是一个字面量。
28.下列有关java构造函数叙述正确的是()
解析:1)A构造函数无返回值,错误;
(2)B中多个类时构造函数不一定与公共类同名,因为每个类都可以有构造函数,函数名同所属类,错误;
(3)C构造器可以有任意个参数,对的;
(4)D每个类都默认有一个构造函数,选项中“一个以上”的描述,让人误解至少要两个,所以错误。
所以答案对错不重要,理解就好。
30.关于Java中的ClassLoader下面的哪些描述是错误的:( )
解析:
从java虚拟机的角度讲,只有两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用的是c++实现的,是虚拟机的一部分,另一类是就是所有其他类加载器,这些类加载器都由java语言实现,独立于虚拟机外部,并且全都继承自抽象类。
从开发人员的角度看,类加载器还可以划分为3种系统类加载器,启动类加载器(Bootstrap ClassLoader),负责加载存放在<JAVA_HOME>/lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符的类库即使放在lib目录中也不会被加载)类库加载到虚拟机中内存中。启动类加载器无法被java程序直接引用,用户在编写自定义类加载器是,如果需要把加载请求委派给引导类加载器,那直接使用null代替即可。
扩展类加载器(Extension ClassLoader):这个类加载器有sun.misc.Launcher
E
x
t
C
l
a
s
s
L
o
a
d
e
r
实
现
,
负
责
加
载
<
J
A
V
A
H
O
M
E
>
/
l
i
b
/
e
x
t
目
录
中
的
,
或
者
被
j
a
v
a
.
e
x
t
.
d
i
r
s
系
统
变
量
所
指
定
的
路
径
中
的
所
有
类
库
,
开
发
者
可
以
直
接
使
用
扩
展
类
加
载
器
。
应
用
类
加
载
器
(
A
p
p
l
i
c
a
t
i
o
n
C
l
a
s
s
L
o
a
d
e
r
)
:
这
个
类
加
载
器
由
s
u
n
.
m
i
s
c
.
L
a
u
n
c
h
e
r
ExtClassLoader实现,负责加载<JAVA_HOME>/lib/ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。 应用类加载器(Application ClassLoader):这个类加载器由sun.misc.Launcher
ExtClassLoader实现,负责加载<JAVAHOME>/lib/ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。应用类加载器(ApplicationClassLoader):这个类加载器由sun.misc.LauncherAppClassLoader实现。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,所以也称它为系统类加载器(System ClassLoader)。他负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。对此,如果有必要开发者可以加入自己定义的类加载器。
一般对于我们java程序员来说,类的加载使用的是双亲委派模型,即当一个类需要加载时,会将类传给Application ClassLoader,但是Application ClassLoader并不会加载,不管它是否能加载,而是传给它的"父类" Extension ClassLoader,Extension ClassLoader同样不会加载,同样传给 Bootstrap ClassLoader(注意不是我们常说的那种父类,但是可以这样理解),这时Bootstrap ClassLoader会判断它是否能加载,能加载就直接加载了,不能加载就传给Extension ClassLoader,Extension ClassLoader同样的判断是否能加载,能加载就直接加载,不能加载就传给Application ClassLoader,然后Application ClassLoader也判断能否加载,如果还是不能加载应该就是报ClassNotFoundException了。这就是双亲委托模型的简单理解了。
对于上面的"父类"为什么要打引号,因为它们并不是真的像java中继承的关系,而是组合的关系,即在"子类"中存在一个成员变量指向"父类"的引用。
所以AE对DF错了。
对于C,很容易理解,因为我们知道一个类只需要加载一次就够了,所以要保证线程安全。
难点就在B了,其实也好理解,就是体现双亲委托模型的优势的时候了,之所以使用双亲委托机制是为了保证java程序的稳定运作,比如当你使用的不是双亲委托模型的时候,然后刚好开发者又定义了一个类,一个java.lang.String这样一个类,如果不使用双亲委托模型,当类加载的时候就有可能会加载开发者定义的String类,这导致了java代码的一片混乱,可读性极差。(PS:但这并不意味着类加载器只要双亲委托模型就行了,没有完美的模型,只有最合适的模型,有不同的需求使用不同的模型。比如破坏双亲委派模型,有兴趣的牛友可以自行了解),所以可以这么说,不同的类加载器加载出来的类是不一样的,不同的类加载器加载同一个类会在方法区产生两个不同的类,彼此不可见,并且在堆中生成不同的Class实例。对于接口,其实就是一个特殊的类,和类一样,在堆中产生不同的class对象。
习题整理1.6
最新推荐文章于 2023-12-21 00:15:00 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)