20201025:算法+错题

错题一

  • 对抽象类的描述正确的是()
    答案及解析:D
A:抽象类可以有非抽象的方法,而接口中的方法都是抽象类
B:Java中类只能单继承,可以继承多个接口,一个类只能继承一个类,但可以继承多个接口
C:抽象类必须有构造方法,接口一定没有构造方法,类都有构造方法,但是不能new
D:实例化一把指new一个对象,所以抽象类不能实例化

错题二

  • 假设num已经被创建为一个ArrayList对象,并且最初包含以下整数值:[0,0,4,2,5,0,3,0]。执行下面的方法numQuest(),最终的输出结果是什么?
    答案及解析:D

错题三

  • Java如何返回request范围内存在的对象?
    答案及解析:B
request.getParamter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据
request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部,在具有转发关系的Web组件之间共享。
request.getAttribute()方法返回request范围内存在的对象

错题四

  • 以下代码段执行后的输出结果为()
    public class Test {
    	public static void main(String[] args) {
    		System.out.println(test());
    
    	}
    	private static int test() {
    		int temp = 1;
    		try {
    			System.out.println(temp);
    			return ++temp;
    		} catch (Exception e) {
    			System.out.println(temp);
    			return ++temp;
    		} finally {
    			++temp;
    			System.out.println(temp);
    		}
    	}
    }
    ```![](https://img-blog.csdnimg.cn/img_convert/9148ee06d781f611363472857a7b49a6.png)
    

答案及解析:D

1.若try代码块内含有return,同时存在finally代码块(代码块内无return值)时,先执行finally函数的值。
2.若try代码块内含有return,同时存在finally代码块且代码块内含有return值时,此时finally代码块内的return值将直接
返回(或覆盖掉try代码块中的return值)。
public class Test {
	public static void main(String[] args) {
		System.out.println(test()); //第三个输出,输出try的返回值
	}
	private static int test() {
	int temp = 1;
		try {
		System.out.println(temp);//第一个输出
		return ++temp;//此时返回的temp值为++temp的值,即为2
		}
	// catch (Exception e) {
	// //System.out.println(temp);
	// return temp;
	//
	// }
		finally {
		System.out.println("测试:"+temp);//测试用
		++temp;
		System.out.println(temp);//第二个输出
		}
	}
}

错题五

  • 关于OutOfMemoryError,下面说法正确的是()
    答案及解析:A B C
A:属于运行时常量池导致的溢出,设置-XX:MaxPermSize可以解决这个问题
B:属于堆空间不足导致的错误,问题比较少见,解决方式和C相同。
C:属于java堆内存问题,一般的手段是通过内存映像分析工具,对Dump出来的堆转储存快照进行分析,重点是确认内存中的
对象是否是有必要的,也就是要判断是出现了内存泄漏,还是出现了内存溢出,如果是内存列楼,通过工具检查泄露对象打
GC Roots的引用链信息,可以准确的确定出泄露代码的位置,不存在泄露,就应该检查虚拟机的堆参数,如果可以继续调大,
可以设置-Xmx解决问题
D:java.lang.OutOfMemoryError: nativeGetNewTLA指当虚拟机不能分配新的线程本地空间(Thread Local Area)的时候
错误信息,此错误是线程申请一个新的TLA时产生的,这个异常一般只会发生在jRockit虚拟机,只有过于绝对。

错误六

  • 线程安全的map在JDK1.5及其更高版本环境,有哪几种方法可以实现?

    答案及解析:C D
HashMap,TreeMap 未进行同步考虑,是线程不安全的。
HashTable 和 ConcurrentHashMap 都是线程安全的。区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,
而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。
Collections 类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合。

List  list = Collections.synchronizedList(new ArrayList());
Set  set = Collections.synchronizedSet(new HashSet());

错题七

  • 关于Java中的ClassLoader下面的哪些描述是错误的()
    答案及解析:B D F
A:Java系统提供3种类加载器:启动类加载器(Bootstrap ClassLoader)  扩展类加载器(Extension ClassLoader) 
应用程序类加载器(Application ClassLoader)。A正确
B:对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有
一个独立的类名称空间。这句话可以表达得更通俗一些:比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的
前提下才有意义,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那么这
两个类必定不相等。接口类是一种特殊类,因此对于同一接口不同的类装载器装载所获得的类是不相同的。B错误
C:类只需加载一次就行,因此要保证类加载过程线程安全,防止类加载多次。C正确
D:Java程序的类加载器采用双亲委派模型,实现双亲委派的代码集中在java.lang.ClassLoader的loadClass()方法中,此方法
实现的大致逻辑是:先检查是否已经被加载,若没有加载则调用父类加载器的loadClass()方法,若父类加载器为空则默认使用
启动类加载器作为父类加载器。如果父类加载失败,抛出ClassNotFoundException异常。D错误
E:双亲委派模型的工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求
委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,
只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。E正确
F:应用程序类加载器(Application ClassLoader)负责加载用户类路径(ClassPath)上所指定的类库,不是所有的ClassLoader
都加载此路径。

错题八

  • 有关finally语句块说法正确的是()
    答案及解析:A B C
(1)不管有木有出现异常,finally块中代码都会执行;
(2)当try和catch中有return时,finally仍然会执行;
(3)finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally
中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
(4)finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

结论:

情况1:try{} catch(){}finally{} return;
显然程序按顺序执行。

情况2:try{ return; }catch(){} finally{} return;
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,最后执行try中return;
finally块之后的语句return,因为程序在try中已经return所以不再执行。


情况3:try{ } catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块,
有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,
最后执行catch块中return. finally之后也就是4处的代码不再执行。
无异常:执行完try再finally再return.


情况4:try{ return; }catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。


情况5:try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。


情况6:try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
则再执行finally块,因为finally块中有return所以提前退出。
无异常:则再执行finally块,因为finally块中有return所以提前退出。

最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,
编译器把finally中的return实现为一个warning。

错题九

  • 什么操作会使得当前线程停止()
    答案及解析:A B E
A:一个InterruptedException 异常被捕获  大家都知道的嘛 (一般通过interrupt方法 中断线程)  如果抓到一个线程  
都会关紧catch里面 然后中断当前操作,A正确。
B:线程执行了wait()方法。   线程使用了wait方法,会强行打断当前操作,(暂停状态,不会中断线程) 进入阻塞(暂停)状态,
然后需要notify方法或notifyAll方法才能进入就绪状态。 B 正确。
C:当前线程创建了一个新的线程。   新创建的线程不会抢占时间片,只有等当前线程把时间片用完,其他线程才有资格拿到
时间片去执行。
D:一个高优先级别的线程就绪。  如C相同,你优先级别再高 也待等我现在弄完才会给你。(就像我们玩游戏,会员虽然有
排队优先权,但是还是要等正在登陆的用户进去游戏之后才能抢到他原来那个位置,不能说我在过关卡的过程中你一脚把我踢开,
然后霸占我的位置吧,我原来的那些数据咋办!!!)
E:线程在MediaTracker上执行了waitforID()调用。  
这个应该大家也不太熟悉。这个类是awt里面的,我查API才知道。
然后他的功能是加载图像,直到完成之前,该方法一直等待!这个方法是必须要抛出A选项的InterruptedException 异常的  
说明这玩意会让其他线程 wait他完成!   所以会暂停当前线程

错题十

  • 对Map的用法,正确的是()
    答案及解析:C D
A选项Map属于接口类型,不可以new的方式创建对象。所以A错误。
B选项SortedMap属于接口类型,不可以new的方式创建对象。所以B错误。
C选项HashMap基于哈希表实现Map接口的类,并允许null的值和null键。
D选项TreeMap通过红黑树实现Map接口的类,key不可以为null,会报NullPointerException异常,value可以为null。

算法一

  • 我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:

    B.length >= 3
    存在 0 < i < B.length - 1使得 B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1]
    (注意:B 可以是 A 的任意子数组,包括整个数组 A。)

    给出一个整数数组 A,返回最长 “山脉” 的长度。

    如果不含有 “山脉” 则返回 0

    示例一:

    输入:[2,1,4,7,3,2,5]
    输出:5
    解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。
    

    示例二:

    输入:[2,2,2]
    输出:0
    解释:不含 “山脉”。
    
    class Solution {
        public int longestMountain(int[] A) {
            int res = 0, up = 0, down = 0;
            for (int i = 1; i < A.length; ++i) {//[2,1,4,7,3,2,5]
                if (down > 0 && A[i - 1] < A[i] || A[i - 1] == A[i])
                    up = down = 0;
                if (A[i - 1] < A[i])
                    up++;
                if (A[i - 1] > A[i])
                    down++;
                if (up > 0 && down > 0 && up + down + 1 > res)
                    res = up + down + 1;
            }
            return res;
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值