下列关于一个类的静态成员的描述中, 不正确的是
答案及解析:D
类的静态成员与类直接相关,与对象无关,在一个类的所有实例之间共享同一个静态成员,A正确 静态成员函数中不能调用非静态成员,C正确 非静态成员函数中可以调用静态成员,B正确 常量成员才不能修改,静态成员变量必须初始化,但可以修改(例如我们常利用静态成员变量统计某个函数的调用次数),D错误答案及解析:A
本题考查两个知识点: 1.局部变量名字会屏蔽点外作用域同名字变量 2.函数的参数传递 classValue{ publicinti=15; } publicclassTest{ publicstaticvoidmain(String argv[]){ Test t=newTest( ); t.first( ); } publicvoidfirst( ){ inti=5;//注意这个i是局部变量 Value v=newValue( ); v.i=25;//创建了一个Value对象,并把此对象的属性i赋值25(默认值为15) second(v,i);//v (v中的属性i值为25) 和 局部变量i 传进函数second System.out.println(v.i);//v的属性i在second函数中被改为了20 } publicvoidsecond(Value v,inti){ i = 0;//second函数中的局部变量,和之前的i没关系 v.i = 20;//将传进的V的属性i改为20 Value val = newValue( ); v = val;//新创建的Value对象val,属性i值为15,并将v指向val对象,v已经和之前传进来的对象没关系了 System.out.println(v.i+" "+i);//此时v的属性i为15,先输出 15(v.i) 0(i) } }Java中的集合包括ArrayList,LinkedList,HashMap等,下列关于集合类描述正确的是?()
答案及解析:A B D
A、HashMap实现了Map接口的,它的Key和Value都可以是null,但是Hashtable种,Key和Value都不能是null。 B、ArrayList与LinkedList都实现了List接口,继承了AbstractList类。 C、ArrayList底层是动态数组是实现,随机位置添加和删除,都需要移动数组的数据,而LinkedList底层是双向链表,只需要修改Node节点的引用。 D、随机访问数组要比链表块。 数据结构线程安全查询增&删扩容ArrayList动态数组不安全快慢默认10&1.5倍扩容LinkedList双向链表不安全慢快关于运行时常量池,下列哪个说法是正确的?
答案及解析:B C D
在JDK1.8之前运行时常量池被放在方法区,属于线程共享,JDK1.8之后,元空间取代了方法区,运行时常量池被也被放在元空间中, 运行时常池 主要存放, class文件元信息描述,编译后的代码,引用类型数据,类文件常量池。所谓的运行时常量池其实就是将 编译后的类信息放入运行时的一个区域中,用来动态获取类信息。运行时常量池是在类加载完成之后,将每个class常量池中的 符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用, 与全局常量池中的引用值保持一致。 运行时常量池是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有常量池信息(用于存放 编译期生成的各种字面量和符号引用)下列哪些方法是线程安全的(所谓的方法都存在)?
答案及解析:A C D
public class MyServlet implements Servlet { public void service (ServletRequest req, ServletResponse resp) { BigInteger I = extractFromRequest(req); encodeIntoResponse(resp,factors); } } public class MyServlet implements Servlet { private long count =0; public long getCount() { return count; } public void service (ServletRequest req, ServletResponse resp) { BigInteger I = extractFromRequest(req); BigInteger[] factors = factor(i); count ++; encodeIntoResponse(resp,factors); } } public class MyClass { private int value; public synchronized int get() { return value; } public synchronized void set (int value) { this.value = value; } } public class Factorizer implements Servlet { private volatile MyCache cache = new MyCache(null,null); public void service(ServletRequest req, ServletResponse resp) { BigInteger i = extractFromRequest(req); BigInteger[] factors = cache.getFactors(i); if (factors == null) { factors = factor(i); cache = new MyCache(i,factors); } encodeIntoResponse(resp,factors); } 这几个类都没有类属性,不存在共享资源.为了满足题目的意思.应该是多线程情况下使用同一个对象.以达到使成员成为共享 资源的目的; A:没有成员(没有共享资源),线程安全; B:假设存在线程1和线程2,count初始值为0,当线程1执行count++中count+1(此时未写回最终计算值),这时线程2执行 count++中读取count,发生数据错误,导致线程1线程2的结果都为1,而不是线程1的结果为1,线程2的结果为2,线程不安全; C:成员私有,对成员的set get方法都加重量级锁,线程安全; D:volatile有两个作用:可见性(volatile变量的改变能使其他线程立即可见,但它不是线程安全的,参考B)和禁止重排序; 这里是可见性的应用,类中方法对volatile修饰的变量只有赋值,线程安全; 欢迎指正。你的朋友正在使用键盘输入他的名字name,偶尔,在键入字符c时,按键可能会被长按,而字符可能会被输入1次或多次。你将会检查键盘输入的字符typed,如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回true。
示例1:
输入:name = "alex", typed = "aaleex" 输出:true 解释:'alex' 中的 'a' 和 'e' 被长按。示例2:
输入:name = "saeed", typed = "ssaaedd" 输出:false 解释:'e' 一定需要被键入两次,但在 typed 的输出中不是这样。示例3:
输入:name = "leelee", typed = "lleeelee" 输出:true示例4:
输入:name = "laiden", typed = "laiden" 输出:true 解释:长按名字中的字符并不是必要的。提示:
1.name.length<=1000
2.typed.length<=1000
3.name和typed的字符都是小写字母
class Solution { public boolean isLongPressedName(String name, String typed) { int i=0,j=0; while(j<typed.length()){ if(i<name.length()&&name.charAt(i)==typed.charAt(j)){ i++; j++; }else if(j>0&&typed.charAt(j)==typed.charAt(j-1)){ j++; }else{ return false; } } return i==name.length(); } }