1.Java.util.HashMap.putAll()是[HashMap]類的內(nèi)置方法衫樊,用于復制操作咬扇。該方法將所有元素(即映射)從一個映射復制到另一個映射喉童。
句法:
new_hash_map.putAll(exist_hash_map)
把exist_hash_map的內(nèi)容復制到new_hash_map中
2.線程池的最大線程數(shù)有什么用甜刻?
用來緩沖,比如突然有很多的請求打了進來礁芦,就能增加一些線程進行處理蜻韭。
3.iterator和 iterable區(qū)別和聯(lián)系
最近寫一個小院查詢的需求,發(fā)現(xiàn)寫的代碼看不太懂
public class GetAllSchoolInfosServiceImpl implements BaseService {
private static Log log = LogFactory.getLog(GetAllSchoolInfosServiceImpl.class);
private volatile List<SchoolNode> schoolNodes;//學校信息的緩存
@Autowired
private DeliveryBigAiService deliveryBigAiService;
@Autowired
private StudentIndexInfoService studentIndexInfoService;
interface SchoolInfo extends Iterable<SchoolInfo.Entry> {
boolean isValid();
String error();
interface Entry {
String getProvince();
String getCity();
String getName();
boolean isValid();
}
}
static class MarketSchoolInfo implements SchoolInfo {
private BaseEntity<List<SchoolVo>> result;
MarketSchoolInfo(BaseEntity<List<SchoolVo>> result) {
this.result = result;
}
public boolean isValid() {
return result != null && result.getResultCode() == 1;
}
public String error() {
return "調(diào)用商城校園錯誤:" + (result == null ? "null" : result.getMessage());
}
public Iterator<Entry> iterator() {
return new Iterator<Entry>() {
private int i = 0;
private List<SchoolVo> schoolInfos = result.getData();
@Override
public boolean hasNext() {
return i < schoolInfos.size();
}
@Override
public Entry next() {
final SchoolVo schoolInfo = schoolInfos.get(i++);
return new Entry() {
@Override
public String getProvince() {
return schoolInfo.getProvince();
}
@Override
public String getCity() {
String city = schoolInfo.getCity();
return city.endsWith("市")? city.substring(0, city.length() - 1): city;
}
@Override
public String getName() {
return schoolInfo.getSchoolName();
}
@Override
public boolean isValid() {
return !Strings.isNullOrEmpty(schoolInfo.getProvince()) &&
!Strings.isNullOrEmpty(schoolInfo.getCity()) &&
!Strings.isNullOrEmpty(schoolInfo.getSchoolName());
}
};
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
}
public String execute(Map<String, Object> map, Map<String, Object> resultMap) {
if (schoolNodes == null) {
synchronized (GetAllSchoolInfosServiceImpl.class) {
if (schoolNodes == null) {
StudentVerifyInfoRequest request = new StudentVerifyInfoRequest();
request.setUserPin("");
request.setId(1003L);
request.setSecretKey("6835f7ed6dc144cf9ab63db5ed154e84");
BaseEntity<List<SchoolVo>> result = studentIndexInfoService.schoolList(request);
SchoolInfo schoolInfo = new MarketSchoolInfo(result);
if (schoolInfo.isValid()) {
List<SchoolNode> root = Lists.newArrayList();
for (SchoolInfo.Entry entry : schoolInfo) {
if (!entry.isValid()) {
continue;
}
List<SchoolNode> tmp = root;
SchoolNode province = new SchoolNode(entry.getProvince(), entry.getProvince(), Lists.<SchoolNode>newArrayList());
int i = tmp.indexOf(province);
if (i < 0) {
tmp.add(province);
i = tmp.size() - 1;
}
tmp = tmp.get(i).children;
SchoolNode city = new SchoolNode(entry.getCity(), entry.getCity(), Lists.<SchoolNode>newArrayList());
i = tmp.indexOf(city);
if (i < 0) {
tmp.add(city);
i = tmp.size() - 1;
}
tmp = tmp.get(i).children;
SchoolNode school = new SchoolNode(entry.getName(), entry.getName(), null);
tmp.add(school);
}
schoolNodes = root;
} else {
resultMap.put(ActivityConstants.SUBCODE_FIELD, ActivityConstants.SUBCODE_FAIL);
log.error(schoolInfo.error());
return schoolInfo.error();
}
}
}
}
resultMap.put("schoolInfos", schoolNodes);
resultMap.put(ActivityConstants.SUBCODE_FIELD, ActivityConstants.SUBCODE_SUCCESS);
return "success";
}
public static class SchoolNode {
public String value;
public String label;
public List<SchoolNode> children;
public SchoolNode(String value, String label, List<SchoolNode> children) {
this.value = value;
this.label = label;
this.children = children;
}
@Override
public boolean equals(Object a) {
return a instanceof SchoolNode && ((SchoolNode)a).value.equals(this.value);
}
@Override
public int hashCode() {
return value.hashCode();
}
}
}
其中就使用了增強for循環(huán)來遍歷一個類柿扣。當時理解不了肖方,認為只有容器collection才能for循環(huán),但是是自己沒有去深入了解collection未状。collection就繼承了iterable接口蕉汪,iterable接口中有iterator接口疯汁。
iterable:
// 返回一個內(nèi)部元素為T類型的迭代器(JDK1.5只有這個接口)
Iterator<T> iterator();
// 遍歷內(nèi)部元素枕扫,action意思為動作丧荐,指可以對每個元素進行操作(JDK1.8添加)
default void forEach(Consumer<? super T> action) {}
// 創(chuàng)建并返回一個可分割迭代器(JDK1.8添加),分割的迭代器主要是提供可以并行遍歷元素的迭代器翻伺,可以適應現(xiàn)在cpu多核的能力材泄,加快速度。
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
iterator:
public interface Iterator<E> {
boolean hasNext();
E next();
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
為什么一定要去實現(xiàn)Iterable這個接口呢吨岭?為什么不直接實現(xiàn)Iterator接口呢拉宗?
看一下JDK中的集合類,比如List一族或者Set一族辣辫,都是實現(xiàn)了Iterable接口旦事,但并不直接實現(xiàn)Iterator接口。 仔細想一下這么做是有道理的急灭。
因為Iterator接口的核心方法next()或者hasNext() 是依賴于迭代器的當前迭代位置的姐浮。 如果Collection直接實現(xiàn)Iterator接口,勢必導致集合對象中包含當前迭代位置的數(shù)據(jù)(指針)葬馋。 當集合在不同方法間被傳遞時卖鲤,由于當前迭代位置不可預置,那么next()方法的結(jié)果會變成不可預知畴嘶。 除非再為Iterator接口添加一個reset()方法蛋逾,用來重置當前迭代位置。 但即時這樣窗悯,Collection也只能同時存在一個當前迭代位置区匣。 而Iterable則不然,每次調(diào)用都會返回一個從頭開始計數(shù)的迭代器蒋院。 多個迭代器是互不干擾的亏钩。
直接繼承Iterator,從Iterator接口可以看出需要子類實現(xiàn)next(),hasNext()方法悦污,假設(shè)都交給List去實現(xiàn)铸屉,那么獲取list的Iterator()時就會出現(xiàn)上面解釋那樣,而繼承Iterable接口切端,則需要每次List返回一個新的Iterator對象(見ArrayList的new Itr())彻坛,因此可以避免上述說到的原因。