第一题:多线程执行下面代码会出现什么问题?要怎么解决?
public class SingletonExample1 {
// 私有构造函数
private SingletonExample1() {
}
// 单例对象
private static SingletonExample1 instance = null;
// 静态的工厂方法
public static SingletonExample1 getInstance() {
if (instance == null) {
instance = new SingletonExample1();
}
return instance;
}
}
答:会存在线程不安全的问题,当两个线程同一时刻访问getInstance()方法时,可能会获取到两个不同的实例。可以在getInstance方法前加上synchronized修饰。
第一题:遍历1到100000,如果该数能被3整除打印“中”,如果该数能被5整除打印“国”,如果该数能被7整除打印“人”,如果同时可以被多个数整除打印相应的多个字,例如15同时被3和5整除则打印“中国”,105同时被3、5、7整除则打印“中国人”。打印完一次就换行。
示例:
1
2
中
4
国
中
人
8
中
国
11
中
13
人
中国
16
17
...
答:当时没多想,直接写了
for(int i=1;i<=100000;i++){ if(i%3==0){ System.out.println("中"); } if(i%5==0){ System.out.println("国"); } if(i%7==0){ System.out.println("人"); } if(i%3==0&&i%5==0){ System.out.println("中国"); } if(i%3==0&&i%7==0){ System.out.println("中人"); } if(i%5==0&&i%7==0){ System.out.println("国人"); } if(i%3==0&&i%5==0&&i%7==0){ System.out.println("中国人"); } if(i%3!=0&&i%5!=0&&i%7!=0){ System.out.println(i); } }
不够简洁需要优化一下
for (int i = 1; i <= 100000; i++) { StringBuilder sb = new StringBuilder(); if (i % 3 == 0) { sb.append("中"); } if (i % 5 == 0) { sb.append("国"); } if (i % 7 == 0) { sb.append("人"); } if (sb.length() == 0) { System.out.println(i); } else { System.out.println(sb.toString()); } }
第三题:假如有一个List集合,里面只能存Integer或者List,写一个方法接收一个List按顺序返回List<Integer>。例如list={1,3,list1,8,9,list2},list1={2,4},list2={7,1},则返回的list={1,3,2,4,8,9,7,1}
答:
private static List<Integer> getListInt(List list){ List<Integer> listInt= new ArrayList<>(); for (int i = 0; i <list.size() ; i++) { if(List.class.isInstance(list.get(i))){ getListInt((List)list.get(i)); }else{ listInt.add((Integer) list.get(i)); } } return listInt; }
有点小问题..