Enumeration不扔ConcurrentModificationException,为什么?
见下面的代码.
public static void main(String[] args) {
Vector<String> v=new Vector<String>();
v.add("Amit");
v.add("Raj");
v.add("Pathak");
v.add("Sumit");
v.add("Aron");
v.add("Trek");
Enumeration<String> en=v.elements();
while(en.hasMoreElements())
{
String value=(String) en.nextElement();
System.out.println(value);
v.remove(value);
}
}
Run Code Online (Sandbox Code Playgroud)
它只打印:
Amit Pathak Aron
为什么会出现这种情况.我们可以说这Enumerator是线程安全的吗?
编辑:使用Iterator时,它会抛出ConcurrentModificationException单线程应用程序.
public static void main(String[] args) {
Vector<String> v=new Vector<String>();
v.add("Amit");
v.add("Raj");
v.add("Pathak");
v.add("Sumit");
v.add("Aron");
v.add("Trek");
Iterator<String> it=v.iterator();
while(it.hasNext())
{
String value=(String) it.next();
System.out.println(value);
v.remove(value);
}
}
Run Code Online (Sandbox Code Playgroud)
请检查.
我们如何将任何受保护方法的访问限制为仅在任何包中的子类而不是同一包中的类.
如果任何不是子类且在同一个包中的类也必须抛出类似"受保护的方法"的异常.
编辑:有没有办法检查调用类名实例,然后我们可以使用instanceof进行验证.
final public class ImmutableWithObject {
final Object obj;
final List myList;
ImmutableWithObject(Object obj1, List list)
{
this.obj = obj1;
this.myList = ((List) ((ArrayList) list).clone());
}
public Object getObj() {
return this.obj;
}
public List getMyList() {
return (List) ((ArrayList<String>) this.myList).clone();
}
public static void main(String[] args) {
ImmutableWithObject io = new ImmutableWithObject(new Date(), new ArrayList());
((Date) io.getObj()).setDate(22);
System.out.println((Date) io.getObj());
}
}
Run Code Online (Sandbox Code Playgroud)
o/p : Mon Aug 22 00:50:04 IST 2011
Run Code Online (Sandbox Code Playgroud)
哪个不对.
我正在寻找有关java main方法的 更多知识public static void main(String[] args).当JVM调用main方法时,它会创建Main线程,并且整个程序在此Main线程中执行,直到某个用户线程在其自己的堆栈中显式启动.
我的问题是,是否可以main从其他main方法启动线程?
如果有人能给我一些关于主线程的参考,那就更好了.
我正在使用Executors编写连接池.我的问题是,当数据库关闭时,池中的所有连接都将成为无效连接.
一种方法是定期刷新连接池,或检查连接的有效性.处理此类问题的最佳方法是什么?
任何人都可以解释为什么下面的代码正在处理私有成员变量?
public class Person implements Comparable<Person> {
private String firstName;
public Person(String firstName) {
this.firstName = firstName;
}
@Override
public int compareTo(Person o) {
return firstName.compareToIgnoreCase(o.firstName); // why does it work? } }
}
}
Run Code Online (Sandbox Code Playgroud)
编辑为什么o.firstName要编译?其中firstName是private可变的.
当我尝试克隆一个通用对象时,我得到编译时错误.为什么?
Object obj=new Object();
obj.clone(); // Here compile time error "The method clone() from the type Object is not visible"
Run Code Online (Sandbox Code Playgroud)
每个类都扩展了Object类,而clone方法在Object类中受到保护.
protected方法可以在同一个包中访问,也可以在subclasses所有类中使用java.lang.Object.
我们都知道迭代排序的Set(除了他们的这种实现)doesn't guarantee.所以我试着通过下面的示例代码确保这一点.
public static void main(String[] args) throws InterruptedException {
Map<String,String> lMap=new HashMap<String, String>();
lMap.put("A", "A");
lMap.put("B", "B");
lMap.put("C", "C");
lMap.put("D", "D");
lMap.put("E", "E");
lMap.put("F", "F");
lMap.put("G", "G");
lMap.put("H", "H");
lMap.put("I", "I");
lMap.put("J", "J");
lMap.put("K", "K");
lMap.put("L", "L");
for(int i=0;i<10000;i++){
Thread.sleep(100);
Set<Entry<String, String>> entrYset=lMap.entrySet();
for(Map.Entry<String, String> e:entrYset){
System.out.println(e.getKey()+" , "+e.getValue());
}
System.out.println("******************************************************");
}
}
Run Code Online (Sandbox Code Playgroud)
我多次执行上面的代码,发现它按顺序打印记录.
我的问题是,如果java声称HashMap是无序的,那么为什么这些记录按顺序打印.如果有人可以给我一些理由,那将是很好的.
public class StaticTest {
private static StaticTest stObj=new StaticTest();
private static int VAR1=10;
private static final int VAR2=20;
public StaticTest() {
System.out.println("Var1 : "+VAR1);
System.out.println("Var2 : "+VAR2);
}
public static void main(String[] args) {
System.out.println("VAR1 after constrution : "+StaticTest.VAR1);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Var1:0 Var2:构造后20 VAR1:10
为什么VAR1和VAR2有这种不同的行为?
我知道this代表调用方法的对象和static方法没有绑定到任何对象,但我的问题仍然是你可以在类对象上调用静态方法.
为什么java使这个东西可用而不是this?