中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

上海設(shè)計(jì)網(wǎng)站開發(fā)深圳網(wǎng)站關(guān)鍵詞優(yōu)化推廣

上海設(shè)計(jì)網(wǎng)站開發(fā),深圳網(wǎng)站關(guān)鍵詞優(yōu)化推廣,wordpress前臺(tái)插件,惠州做網(wǎng)站建設(shè)價(jià)格文章目錄 一、命名規(guī)約二、代碼格式三、集合篇1. 棧、隊(duì)列、雙端隊(duì)列2. List的升序倒序3. Map的升序降序4. 二維數(shù)組排序5. 集合之間的轉(zhuǎn)換6. Map鍵值對(duì)遍歷7. 重寫equal與hashCode8. ArrayList的subList9. keySet()/values()/ent…

文章目錄

  • 一、命名規(guī)約
  • 二、代碼格式
  • 三、集合篇
    • 1. 棧、隊(duì)列、雙端隊(duì)列
    • 2. List的升序倒序
    • 3. Map的升序降序
    • 4. 二維數(shù)組排序
    • 5. 集合之間的轉(zhuǎn)換
    • 6. Map鍵值對(duì)遍歷
    • 7. 重寫equal與hashCode
    • 8. ArrayList的subList
    • 9. keySet()/values()/entrySet()
    • 10. Collections.emptyList()
    • 11. Collections.singletonList(str)
    • 12. Collection接口的addAll()
    • 13. foreach與iterator()
    • 14. 使用Set去重
  • 四、并發(fā)篇
    • 1. 創(chuàng)建線程池
    • 2. ThreadLocal的使用
  • 五、時(shí)間篇
    • 1. LocalDateTime的使用
    • 2. String、Date、LocalDateTime轉(zhuǎn)換
  • 六、控制塊
    • 1. switch
    • 2. 三目運(yùn)算
    • 3. 循環(huán)體
    • 4. try-catch-finally-return
  • 七、其他
    • 1. 正則表達(dá)式
    • 2. BeanUtil的copy
    • 3. Integer的比較
    • 4. 浮點(diǎn)數(shù)的比較
    • 5. Object的clone方法

一、命名規(guī)約

A) 各類命名方法
類名:UserController、UserServiceUserMapper
模型名:User、UserDTO、UserVO
對(duì)象名:userController
常量名:USER_NAMEB) Service/DAO 層方法命名規(guī)約
1) 獲取單個(gè)對(duì)象的方法用 get 做前綴。
2) 獲取多個(gè)對(duì)象的方法用 list 做前綴,復(fù)數(shù)結(jié)尾,如:listObjects。
3) 獲取統(tǒng)計(jì)值的方法用 count 做前綴。
4) 插入的方法用 save/insert 做前綴。
5) 刪除的方法用 remove/delete 做前綴。
6) 修改的方法用 update 做前綴。注意:POJO 類中布爾類型的變量,都不要加 is 前綴,否則部分框架解析會(huì)引起序列化錯(cuò)誤。

二、代碼格式

1. if/for/while/switch/do 等保留字與括號(hào)之間都必須加空格
2. 任何二目、三目運(yùn)算符的左右兩邊都需要加一個(gè)空格,包括賦值運(yùn)算符=、邏輯運(yùn)算符&&、加減乘除符號(hào)等。
3. 注釋的雙斜線與注釋內(nèi)容之間有且僅有一個(gè)空格。
4. 在進(jìn)行類型強(qiáng)制轉(zhuǎn)換時(shí),右括號(hào)與強(qiáng)制轉(zhuǎn)換值之間不需要任何空格隔開。
5. 方法參數(shù)在定義和傳入時(shí),多個(gè)參數(shù)逗號(hào)后邊必須加空格。

三、集合篇

1. 棧、隊(duì)列、雙端隊(duì)列

        Stack<Integer> stack = new Stack<>();       // 棧stack.push(1);      // 壓入stack.pop();    // 彈出stack.peek();   // 獲取但不彈出Queue<Integer> queue = new ArrayDeque<>();  //隊(duì)列queue.offer(1);     //壓入queue.poll();   // 彈出queue.peek();   // 獲取但不彈出Deque<Integer> deque = new ArrayDeque<>();  // 雙端隊(duì)列deque.offerFirst(1);    // 壓入隊(duì)頭deque.offerLast(2);     // 壓入對(duì)尾deque.pollFirst();         // 彈出隊(duì)頭deque.pollLast();          // 彈出隊(duì)尾deque.peekFirst();         // 獲取隊(duì)頭但不彈出deque.peekLast();          // 獲取隊(duì)尾但不彈出

2. List的升序倒序

        List<Integer> list = Arrays.asList(10,1,6,4,8,7,9,3,2,5);System.out.println("原始數(shù)據(jù):");list.forEach(n ->{System.out.print(n+", ");});System.out.println("");System.out.println("升序排列:");Collections.sort(list); // 升序排列list.forEach(n ->{System.out.print(n+", ");});// 降序的話:需要先升序再倒序,才能有降序的結(jié)果System.out.println("");System.out.println("降序排列:");Collections.reverse(list); // 倒序排列list.forEach(n ->{System.out.print(n+", ");});

3. Map的升序降序

        Map<Integer, String> map = new HashMap<>();map.put(100, "I'am a");map.put(99, "I'am c");map.put(2, "I'am d");map.put(33, "I'am b");// 按照value進(jìn)行倒排,如果要根據(jù)key進(jìn)行排序的話使用Map.Entry.comparingByKey()map.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).forEach(System.out::println);// 根據(jù)value進(jìn)行正序排序,根據(jù)key進(jìn)行排序的話使用comparingByKey()map.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEach(System.out::println);// 如果要將排序的結(jié)果返回的話,我們可以使用下面的方法(注意:要使用LinkedHashMap進(jìn)行保存,linkedHashMap可以保存插入順序)Map<Integer, String> resultMap1 = map.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (s, s2) -> s,LinkedHashMap::new));// 下面的這種寫法同上面的寫法,只不過(guò)是將簡(jiǎn)寫展開了,這樣更易于理解Map<Integer, String> resultMap = map.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(new Function<Map.Entry<Integer, String>, Integer>() {@Overridepublic Integer apply(Map.Entry<Integer, String> integerStringEntry) {return integerStringEntry.getKey();}}, new Function<Map.Entry<Integer, String>, String>() {@Overridepublic String apply(Map.Entry<Integer, String> integerStringEntry) {return integerStringEntry.getValue();}}, new BinaryOperator<String>() {@Overridepublic String apply(String s, String s2) {return s;}}, new Supplier<Map<Integer, String>>() {@Overridepublic Map<Integer, String> get() {return new LinkedHashMap<>();}}));// 同樣如果需要將排序的將結(jié)果作為Map進(jìn)行返回我們還可以使用下面的方法,但是不推薦這種方式(effectivejava 178頁(yè)中說(shuō):foreach操作應(yīng)該只用于報(bào)告stream計(jì)算的結(jié)果,而不是執(zhí)行計(jì)算)Map<Integer, String> result2 = new LinkedHashMap<>();map.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEach(new Consumer<Map.Entry<Integer, String>>() {@Overridepublic void accept(Map.Entry<Integer, String> integerStringEntry) {result2.put(integerStringEntry.getKey(), integerStringEntry.getValue());}});

4. 二維數(shù)組排序

Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] interval1, int[] interval2) {return interval1[0] - interval2[0];}});

5. 集合之間的轉(zhuǎn)換

// Object轉(zhuǎn)基本元素
List<String> tableNames=list.stream().map(User::getMessage).collect(Collectors.toList());// Object轉(zhuǎn)Map
Map<String, Account> map = accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2));// Object轉(zhuǎn)Map
/** * 1. 避免key重復(fù)* 在使用 java.util.stream.Collectors 類的 toMap()方法轉(zhuǎn)為 Map 集合時(shí),一定要使* 用含有參數(shù)類型為 BinaryOperator,參數(shù)名為 mergeFunction 的方法,否則當(dāng)出現(xiàn)相同 key* 值時(shí)會(huì)拋出 IllegalStateException 異常。* 說(shuō)明:參數(shù) mergeFunction 的作用是當(dāng)出現(xiàn) key 重復(fù)時(shí),自定義對(duì) value 的處理策略* 2. 避免值為null* 在使用 java.util.stream.Collectors 類的 toMap()方法轉(zhuǎn)為 Map 集合時(shí),一定要注*	意當(dāng) value 為 null 時(shí)會(huì)拋 NPE 異常。
**/
Map<Long, String> getIdNameMap = accounts.stream().collect(Collectors.toMap(Account::getId, Account::getUsernamee, (v1, v2) -> v2));// String轉(zhuǎn)Long
List<Long>=stringList.stream().map(Long::valueOf).collect(Collectors.toList());// Long轉(zhuǎn)String
List<String>=longList.stream().map(String::valueOf).collect(Collectors.toList());// Integer轉(zhuǎn)Long
List<Long> listLong = JSONArray.parseArray(listInt.toString(),Long.class);// Long 轉(zhuǎn)Integer
List<Integer> integerList = JSONArray.parseArray(LongList.toString(), Integer.class);
// 或者
List<Integer> integerList = longList.stream().map(x -> Integer.valueOf(String.valueOf(x))).collect(Collectors.toList());// JSONArray轉(zhuǎn)List
JSONArray jsonArray = updateApplicationSchemaDTO.getJSONArray("configTrophyDTOList");
configTrophyDTOList = jsonArray.toJavaList(ConfigTrophyDTO.class);// List轉(zhuǎn)數(shù)組
// 使用集合轉(zhuǎn)數(shù)組的方法,必須使用集合的 toArray(T[] array)
String[] array = list.toArray(new String[0]);// 數(shù)組轉(zhuǎn)List
/**
1. 使用工具類 Arrays.asList()把數(shù)組轉(zhuǎn)換成集合時(shí),不能使用其修改集合相關(guān)的方法,
它的 add/remove/clear 方法會(huì)拋出 UnsupportedOperationException 異常。
2. asList 的返回對(duì)象是一個(gè) Arrays 內(nèi)部類,并沒(méi)有實(shí)現(xiàn)集合的修改方法。Arrays.asList 體現(xiàn)的是適配器模式,只是轉(zhuǎn)換接口,后臺(tái)的數(shù)據(jù)仍是數(shù)組。
**/
List list = Arrays.asList(strArray);

6. Map鍵值對(duì)遍歷

不推薦使用ketSet()獲取鍵集合,再遍歷value,這樣的性能較低。keySet 其實(shí)是遍歷了 2 次,一次是轉(zhuǎn)為 Iterator 對(duì)象,另一次是從 hashMap 中取出 key 所對(duì)應(yīng)的value。而 entrySet 只是遍歷了一次就把 key 和 value 都放到了 entry 中,效率更高。如果是 JDK8,使用
Map.forEach 方法。

System.out.println("====4、通過(guò)entrySet()獲得key-value值——使用迭代器遍歷====");
Set set1 = hashMap.entrySet();
Iterator iterator1 = set1.iterator();
while(iterator1.hasNext()){Object itset = iterator1.next();Map.Entry entry = (Map.Entry) itset;System.out.println(entry.getKey()+"-"+entry.getValue());
}

7. 重寫equal與hashCode

package jianlejun.study;public class Student {private String name;// 姓名private String sex;// 性別private String age;// 年齡private float weight;// 體重private String addr;// 地址// 重寫hashcode方法@Overridepublic int hashCode() {int result = name.hashCode();result = 17 * result + sex.hashCode();result = 17 * result + age.hashCode();return result;}// 重寫equals方法@Overridepublic boolean equals(Object obj) {if(!(obj instanceof Student)) {// instanceof 已經(jīng)處理了obj = null的情況return false;}Student stuObj = (Student) obj;// 地址相等if (this == stuObj) {return true;}// 如果兩個(gè)對(duì)象姓名、年齡、性別相等,我們認(rèn)為兩個(gè)對(duì)象相等if (stuObj.name.equals(this.name) && stuObj.sex.equals(this.sex) && stuObj.age.equals(this.age)) {return true;} else {return false;}} 
}

8. ArrayList的subList

  • ArrayList 的 subList 結(jié)果不可強(qiáng)轉(zhuǎn)成 ArrayList,否則會(huì)拋出 ClassCastException 異
    常:java.util.RandomAccessSubList cannot be cast to java.util.ArrayList。因?yàn)閟ubList 返回的是 ArrayList 的內(nèi)部類 SubList。此外subList()返回原來(lái)list的從[fromIndex, toIndex)之間這一部分的視圖,之所以說(shuō)是視圖,是因?yàn)閷?shí)際上,返回的list是靠原來(lái)的list支持的。
  • 在 subList 場(chǎng)景中,高度注意對(duì)父集合元素的增加或刪除,均會(huì)導(dǎo)致子列表的遍歷、
    增加、刪除產(chǎn)生 ConcurrentModificationException 異常。
// 左閉右開
List<String> list = arrayList.subList(1,3);// 如果想防止原list被改變可以這樣操作
List<Integer> sub = new ArrayList<Integer>(test.subList(1, 3));

9. keySet()/values()/entrySet()

使用 Map 的方法 keySet()/values()/entrySet()返回集合對(duì)象時(shí),不可以對(duì)其進(jìn)行添
加元素操作,否則會(huì)拋出 UnsupportedOperationException 異常。

10. Collections.emptyList()

  • Collections.emptyList()返回一個(gè)空的List(list != null,size == 0),這是因?yàn)閚ew ArrayList()創(chuàng)建時(shí)有初始大小,占用內(nèi)存,emptyList()不用創(chuàng)建一個(gè)新的對(duì)象,可以減少內(nèi)存開銷;但是所以返回的List不能進(jìn)行增加刪除元素操作。
private static List<String> getList(String str) {if (StringUtils.isBlank(str)) {// 使用時(shí)不會(huì)報(bào)空指針return Collections.emptyList(); }List<String> list = new ArrayList<String>();list.add(str);return list;}

11. Collections.singletonList(str)

  • 在實(shí)際的開發(fā)中,如果有特殊要求只需要List存放一個(gè)的元素,就可以使用Collections.singletonList作為數(shù)據(jù)結(jié)構(gòu)來(lái)存放數(shù)據(jù)啦。
List<String> myList = Collections.singletonList(str);

12. Collection接口的addAll()

  • 在使用 Collection 接口任何實(shí)現(xiàn)類的 addAll()方法時(shí),都要對(duì)輸入的集合參數(shù)進(jìn)行
    NPE 判斷。
		//1. addAll()測(cè)試//1.1 初始化多種情形的集合List<String> addList = null;List<String> addList1 = new ArrayList<String>();List<String> addList2 = new ArrayList<String>(Arrays.asList("epsilon", "zeta", "eta"));List<String> addList3 = new ArrayList<String>(Arrays.asList(null, "epsilon", "zeta", "eta"));//1.2 測(cè)試list.addAll(addList);//addList為null,報(bào)空指針list.addAll(addList1);//addList1為[],不報(bào)錯(cuò)list.addAll(addList2);//addList2無(wú)null,不報(bào)錯(cuò)list.addAll(addList3);//addList3有null,不報(bào)錯(cuò)

13. foreach與iterator()

不要在 foreach 循環(huán)里進(jìn)行元素的 remove/add 操作。remove 元素請(qǐng)使用 Iterator
方式

// 正例:
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {String item = iterator.next();if (刪除元素的條件) {iterator.remove();}
}
// 反例:
for (String item : list) {if ("1".equals(item)) {list.remove(item);}
}

14. 使用Set去重

利用 Set 元素唯一的特性,可以快速對(duì)一個(gè)集合進(jìn)行去重操作,避免使用 List 的
contains()進(jìn)行遍歷去重或者判斷包含操作。

    // Set集合去重,保持原來(lái)順序public static void ridRepeat2(List<String> list) {System.out.println("list = [" + list + "]");List<String> listNew = new ArrayList<String>();Set set = new HashSet();for (String str : list) {if (set.add(str)) {listNew.add(str);}}System.out.println("listNew = [" + listNew + "]");}// Set去重     由于Set(HashSet)的無(wú)序性,不會(huì)保持原來(lái)順序public static void ridRepeat3(List<String> list) {System.out.println("list = [" + list + "]");Set set = new HashSet();List<String> listNew = new ArrayList<String>();set.addAll(list);listNew.addAll(set);System.out.println("listNew = [" + listNew + "]");}// Set通過(guò)HashSet去重(將ridRepeat3方法縮減為一行) 無(wú)序public static void ridRepeat4(List<String> list) {System.out.println("list = [" + list + "]");List<String> listNew = new ArrayList<String>(new HashSet(list));System.out.println("listNew = [" + listNew + "]");}// Set通過(guò)TreeSet去重   會(huì)按字典順序重排序public static void ridRepeat5(List<String> list) {System.out.println("list = [" + list + "]");List<String> listNew = new ArrayList<String>(new TreeSet<String>(list));System.out.println("listNew = [" + listNew + "]");}// Set通過(guò)LinkedHashSet去重  保持原來(lái)順序public static void ridRepeat6(List<String> list) {System.out.println("list = [" + list + "]");List<String> listNew = new ArrayList<String>(new LinkedHashSet<String>(list));System.out.println("listNew = [" + listNew + "]");}

四、并發(fā)篇

1. 創(chuàng)建線程池

ThreadPoolExecutor 參數(shù)介紹

 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {}

參數(shù) 1:corePoolSize
核心線程數(shù),線程池中始終存活的線程數(shù)。

參數(shù) 2:maximumPoolSize
最大線程數(shù),線程池中允許的最大線程數(shù),當(dāng)線程池的任務(wù)隊(duì)列滿了之后可以創(chuàng)建的最大線程數(shù)。

參數(shù) 3:keepAliveTime
最大線程數(shù)可以存活的時(shí)間,當(dāng)線程中沒(méi)有任務(wù)執(zhí)行時(shí),最大線程就會(huì)銷毀一部分,最終保持核心線程數(shù)量的線程。

參數(shù) 4:unit:
單位是和參數(shù) 3 存活時(shí)間配合使用的,合在一起用于設(shè)定線程的存活時(shí)間 ,參數(shù) keepAliveTime 的時(shí)間單位有以下 7 種可選:

TimeUnit.DAYS:天
TimeUnit.HOURS:小時(shí)
TimeUnit.MINUTES:分
TimeUnit.SECONDS:秒
TimeUnit.MILLISECONDS:毫秒
TimeUnit.MICROSECONDS:微妙
TimeUnit.NANOSECONDS:納秒

參數(shù) 5:workQueue
一個(gè)阻塞隊(duì)列,用來(lái)存儲(chǔ)線程池等待執(zhí)行的任務(wù),均為線程安全,它包含以下 7 種類型:較常用的是 LinkedBlockingQueue 和 Synchronous,線程池的排隊(duì)策略與 BlockingQueue 有關(guān)。

ArrayBlockingQueue:一個(gè)由數(shù)組結(jié)構(gòu)組成的有界阻塞隊(duì)列。
LinkedBlockingQueue:一個(gè)由鏈表結(jié)構(gòu)組成的有界阻塞隊(duì)列。
SynchronousQueue:一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列,即直接提交給線程不保持它們。
PriorityBlockingQueue:一個(gè)支持優(yōu)先級(jí)排序的無(wú)界阻塞隊(duì)列。
DelayQueue:一個(gè)使用優(yōu)先級(jí)隊(duì)列實(shí)現(xiàn)的無(wú)界阻塞隊(duì)列,只有在延遲期滿時(shí)才能從中提取元素。
LinkedTransferQueue:一個(gè)由鏈表結(jié)構(gòu)組成的無(wú)界阻塞隊(duì)列。與SynchronousQueue類似,還含有非阻塞方法。
LinkedBlockingDeque:一個(gè)由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列。

參數(shù) 6:threadFactory
線程工廠,主要用來(lái)創(chuàng)建線程,默認(rèn)為正常優(yōu)先級(jí)、非守護(hù)線程。

參數(shù) 7:handler
拒絕策略,拒絕處理任務(wù)時(shí)的策略,系統(tǒng)提供了 4 種可選:默認(rèn)策略為 AbortPolicy。

AbortPolicy:拒絕并拋出異常。
CallerRunsPolicy:使用當(dāng)前調(diào)用的線程來(lái)執(zhí)行此任務(wù)。
DiscardOldestPolicy:拋棄隊(duì)列頭部(最舊)的一個(gè)任務(wù),并執(zhí)行當(dāng)前任務(wù)。
DiscardPolicy:忽略并拋棄當(dāng)前任務(wù)。

ThreadPoolExecutor執(zhí)行流程
ThreadPoolExecutor 關(guān)鍵節(jié)點(diǎn)的執(zhí)行流程如下:

  • 當(dāng)線程數(shù)小于核心線程數(shù)時(shí),創(chuàng)建線程。
  • 當(dāng)線程數(shù)大于等于核心線程數(shù),且任務(wù)隊(duì)列未滿時(shí),將任務(wù)放入任務(wù)隊(duì)列。
  • 當(dāng)線程數(shù)大于等于核心線程數(shù),且任務(wù)隊(duì)列已滿:若線程數(shù)小于最大線程數(shù),創(chuàng)建線程;若線程數(shù)等于最大線程數(shù),拋出異常,拒絕任務(wù)。
    在這里插入圖片描述

ThreadPoolExecutor自定義拒絕策略

public static void main(String[] args) {// 任務(wù)的具體方法Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("當(dāng)前任務(wù)被執(zhí)行,執(zhí)行時(shí)間:" + new Date() +" 執(zhí)行線程:" + Thread.currentThread().getName());try {// 等待 1sTimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}};// 創(chuàng)建線程,線程的任務(wù)隊(duì)列的長(zhǎng)度為 1ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1,100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1),new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 執(zhí)行自定義拒絕策略的相關(guān)操作System.out.println("我是自定義拒絕策略~");}});// 添加并執(zhí)行 4 個(gè)任務(wù)threadPool.execute(runnable);threadPool.execute(runnable);threadPool.execute(runnable);threadPool.execute(runnable);
}

在這里插入圖片描述

2. ThreadLocal的使用

/**
ThreadLocal的api很簡(jiǎn)單,就4個(gè)* get——獲取threadlocal局部變量* set——設(shè)置threadlocal局部變量* initialvalue——設(shè)置局部變量的初始值* remove——?jiǎng)h除該局部變量
**/
public class SequenceNumber {  // ThreadLocal 對(duì)象使用 static 修飾,ThreadLocal 無(wú)法解決共享對(duì)象的更新問(wèn)題。private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){  public Integer initialValue(){  return 0;  }  };  public int getNextNum() {  seqNum.set(seqNum.get() + 1);  return seqNum.get();  }  public static void main(String[] args) {  SequenceNumber sn = new SequenceNumber();  TestClient t1  = new TestClient(sn);  TestClient t2  = new TestClient(sn);  TestClient t3  = new TestClient(sn);  t1.start();  t2.start();  t3.start();  t1.print();  t2.print();  t3.print();   }  
}private static class TestClient extends Thread {  private SequenceNumber sn;  public TestClient(SequenceNumber sn ) {  this.sn = sn;  }  public void run() {  for(int i=0; i< 3; i++) {  System.out.println( Thread.currentThread().getName()  + " --> " + sn.getNextNum());  }  }  public void print() {  for(int i=0; i< 3; i++) {  System.out.println( Thread.currentThread().getName()  + " --> " + sn.getNextNum());  }  }  
}  
Thread-2 --> 1  
Thread-2 --> 2  
Thread-2 --> 3  
Thread-0 --> 1  
Thread-0 --> 2  
Thread-0 --> 3  
Thread-1 --> 1  
Thread-1 --> 2  
Thread-1 --> 3  
main --> 1  
main --> 2  
main --> 3  
main --> 4  
main --> 5  
main --> 6  
main --> 7  
main --> 8  
main --> 9  

結(jié)論:可以發(fā)現(xiàn),static的ThreadLocal變量是一個(gè)與線程相關(guān)的靜態(tài)變量,即一個(gè)線程內(nèi),static變量是被各個(gè)實(shí)例共同引用的,但是不同線程內(nèi),static變量是隔開的。

五、時(shí)間篇

1. LocalDateTime的使用

// 獲取當(dāng)前時(shí)間
LocalDateTime now = LocalDateTime.now();// 獲取指定時(shí)間
LocalDateTime localDateTime = LocalDateTime.of(2021, 6, 16, 16, 37, 20, 814 * 1000 * 1000);
LocalDateTime ldt = LocalDateTime.now().withYear(2021).withMonth(6).withDayOfMonth(16).withHour(10).withMinute(10).withSecond(59).withNano(999 * 1000 * 1000);// 獲取指定時(shí)區(qū)時(shí)間
LocalDateTime datetime = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
LocalDateTime datetime2 = LocalDateTime.now(ZoneId.of("+8"));// 獲取年月日信息
LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int dayOfYear = now.getDayOfYear();
int dayOfMonth = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int nano = now.getNano();// 日期計(jì)算
LocalDateTime now = LocalDateTime.now();
LocalDateTime tomorrow = now.plusDays(1L);
tomorrow = tomorrow.plusHours(2L);
tomorrow = tomorrow.plusMinutes(10L);LocalDateTime yesterday = now.minus(Duration.ofDays(1));
yesterday = yesterday.plusHours(2L);
yesterday = yesterday.plusMinutes(10L);// 時(shí)間格式化,DateTimeFormatter是線程安全的類。
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = LocalDateTime.now().format(df);

2. String、Date、LocalDateTime轉(zhuǎn)換

// LocalDateTime轉(zhuǎn)Date
public static Date localDateTime2Date(LocalDateTime localDateTime) {return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}// LocalDateTime轉(zhuǎn)String
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static String localDateTime2String(LocalDateTime localDateTime) {return localDateTime.format(DATE_TIME_FORMATTER);
}// String 轉(zhuǎn) LocalDateTime,DateTimeFormatter是線程安全的類,可以將此類放到常量中。
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static LocalDateTime string2LocalDateTime(String str) {return LocalDateTime.parse(str, DATE_TIME_FORMATTER);
}// String 轉(zhuǎn) Date,SimpleDateFormat是非線程安全的類,在多線程操作時(shí)會(huì)報(bào)錯(cuò)。
public static Date string2Date(String str) throws ParseException {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return simpleDateFormat.parse(str);
}// Date 轉(zhuǎn) LocalDateTime
public static LocalDateTime date2LocalDateTime(Date date) {return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}// Date 轉(zhuǎn) String
public static String date2String(Date date) {SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return formatter.format(date);
}

六、控制塊

1. switch

public class SwitchString {public static void main(String[] args) {method("sth");}public static void method(String param) {// 1. 當(dāng) switch 括號(hào)內(nèi)的變量類型為 String 并且為外部參數(shù)時(shí),必須先進(jìn)行 null判斷。if(StringUtils.isEmpty(param)){return;}switch(param){case"sth": System.out.printin("it's sth"); break;case"sb": System.out.println("it's sb"); break;// 2. 在一個(gè) switch 塊內(nèi),都必須包含一個(gè) default語(yǔ)句并且放在最后default: System.out.println("default"); break;}}
}

2. 三目運(yùn)算

三目運(yùn)算符 condition? 表達(dá)式 1 : 表達(dá)式 2 中,高度注意表達(dá)式 1 和 2 在類型對(duì)齊 時(shí),可能拋出因自動(dòng)拆箱導(dǎo)致的 NPE 異常。

// 反例
Integer a = 1;
Integer b = 2;
Integer c = null;
Boolean flag = false;
// a*b 的結(jié)果是 int 類型,那么 c 會(huì)強(qiáng)制拆箱成 int 類型,拋出 NPE 異常
Integer result=(flag? a*b : c);

3. 循環(huán)體

1. 循環(huán)體中的語(yǔ)句要考量性能,以下操作盡量移至循環(huán)體外處理,如定義對(duì)象、變量、 獲取數(shù)據(jù)庫(kù)連接,進(jìn)行不必要的 try-catch 操作(這個(gè) try-catch 是否可以移至循環(huán)體外)

4. try-catch-finally-return

  • return的執(zhí)行優(yōu)先級(jí)高于finally的執(zhí)行優(yōu)先級(jí),但是return語(yǔ)句執(zhí)行完畢之后并不會(huì)馬上結(jié)束函數(shù),而是將結(jié)果保存到棧幀中的局部變量表中,然后繼續(xù)執(zhí)行finally塊中的語(yǔ)句;
  • 如果finally塊中包含return語(yǔ)句,則不會(huì)對(duì)try塊中要返回的值進(jìn)行保護(hù),而是直接跳到finally語(yǔ)句中執(zhí)行,并最后在finally語(yǔ)句中返回,返回值是在finally塊中改變之后的值
// return 1
public static int test1() {int x = 1;try {return x;} finally {x = 2;}
}// return 2
public static int test2() {int x = 1;try {return x;} finally {x = 2;return x;}
}

七、其他

1. 正則表達(dá)式

在使用正則表達(dá)式時(shí),利用好其預(yù)編譯功能,可以有效加快正則匹配速度。

// 反例
public void addSyncConfigToCache(String configName, ESSyncConfig config) {Pattern pattern = Pattern.compile(".*:(.*)://.*/(.*)\\?.*$");Matcher matcher = pattern.matcher(dataSource.getUrl());
}// 正例
private static final Pattern pattern = Pattern.compile(regexRule);
public void addSyncConfigToCache(String configName, ESSyncConfig config) {Matcher matcher = pattern.matcher(dataSource.getUrl());
}

2. BeanUtil的copy

Apache BeanUtils 性能較差,可以使用其他方案比如 Spring BeanUtils, Cglib BeanCopier,注意
均是淺拷貝。

Person source = Person("Alice", 25);
Person destination = new Person();
BeanUtils.copyProperties(destination, source);

3. Integer的比較

所有整型包裝類對(duì)象之間值的比較,全部使用 equals 方法比較

Integer a = 123;
Integer b = 321;
a.equal(b); // false

4. 浮點(diǎn)數(shù)的比較

基本數(shù)據(jù)類型使用Math.abs(),包裝類使用BigDecimal;

// 基本數(shù)據(jù)類型
float a = 1.0f - 0.9f;
float b = 0.9f - 0.8f;
float diff = 1e-6f;
if (Math.abs(a - b) < diff) {System.out.println("true");
}// 包裝類
//禁止使用構(gòu)造方法 BigDecimal(double)的方式把 double 值轉(zhuǎn)化為 BigDecimal 對(duì)象。
BigDecimal a = new BigDecimal("1.0".toString());
BigDecimal b = BigDecimal.value(0.9f);
BigDecimal c = new BigDecimal("0.8".toString());
if (a.equals(b)) {System.out.println("false");
}

5. Object的clone方法

對(duì)象 clone 方法默認(rèn)是淺拷貝,若想實(shí)現(xiàn)深拷貝需覆寫 clone 方法實(shí)現(xiàn)域?qū)ο蟮纳疃缺闅v式拷貝。

public class Person implements Cloneable {private String name;private Integer age;private String sex;public Person() {super();}public Person(String name, Integer age, String sex) {super();this.name = name;this.age = age;this.sex = sex;}public void setName(String name) {this.name = name;}public void setAge(Integer age) {this.age = age;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";}public Person clone() throws CloneNotSupportedException {return (Person) super.clone();}public static void main(String[] args) {Person person = new Person("Jachen", 23, "boy");System.out.println("person:" + person);try {Person person2 = person.clone();System.out.println("person2:" + person2);System.out.println("person.equals(person2):"+ person2.equals(person));person2.setName("Anna");person2.setSex("girl");person2.setAge(22);System.out.println(person2.getClass() == person.getClass());} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}
http://www.risenshineclean.com/news/2238.html

相關(guān)文章:

  • 自己做視頻網(wǎng)站 在優(yōu)酷推廣競(jìng)價(jià)推廣運(yùn)營(yíng)
  • 上海做網(wǎng)站 公司qq推廣官網(wǎng)
  • 江蘇外貿(mào)型網(wǎng)站制作搜索引擎原理
  • 大連做網(wǎng)站哪家服務(wù)好seo課程培訓(xùn)中心
  • 曲靖網(wǎng)站制作今日新聞?wù)?/a>
  • 地方門戶網(wǎng)站制作蘇州網(wǎng)站制作推廣
  • 北京建網(wǎng)站公司價(jià)格關(guān)鍵字排名查詢
  • 建設(shè)工程施工包括哪些工程深圳純手工seo
  • 松江微網(wǎng)站建設(shè)重慶seo技術(shù)分享
  • .tel域名不可以做網(wǎng)站域名嗎?業(yè)務(wù)網(wǎng)站制作
  • 團(tuán)購(gòu)做的好的網(wǎng)站有哪些互聯(lián)網(wǎng)去哪里學(xué)
  • 網(wǎng)頁(yè)設(shè)計(jì)教程誰(shuí)的好西安市seo排名按天優(yōu)化
  • 現(xiàn)在網(wǎng)站建設(shè)怎么收費(fèi)嘉興seo外包平臺(tái)
  • 成品網(wǎng)站源碼1688體驗(yàn)區(qū)免費(fèi)網(wǎng)絡(luò)推廣平臺(tái)有哪些
  • 聚合廣告聯(lián)盟公司網(wǎng)站優(yōu)化
  • 做電商網(wǎng)站有什么用推廣信息怎么寫
  • django 網(wǎng)站開發(fā)教程財(cái)經(jīng)新聞最新消息
  • 做網(wǎng)站需要資質(zhì)嗎免費(fèi)推廣平臺(tái)排行
  • 福州整站優(yōu)化免費(fèi)網(wǎng)站推廣網(wǎng)站破解版
  • 做水果的網(wǎng)站有哪些整站優(yōu)化多少錢
  • 網(wǎng)頁(yè)設(shè)計(jì)1000字心得推廣優(yōu)化排名
  • 企業(yè)網(wǎng)站做seo的優(yōu)勢(shì)上海培訓(xùn)機(jī)構(gòu)排名榜
  • 網(wǎng)站做快照怎么做百度站長(zhǎng)工具app
  • 哪個(gè)網(wǎng)站能把圖片拼湊起來(lái)做gif的重慶seo多少錢
  • 做國(guó)際網(wǎng)站有補(bǔ)貼嗎企業(yè)的網(wǎng)絡(luò)推廣
  • wordpress建好本地站怎么上傳聚合搜索引擎入口
  • visio做網(wǎng)站效果百度百家官網(wǎng)入口
  • 福州自助建站網(wǎng)站軟文內(nèi)容
  • 信譽(yù)好的龍崗網(wǎng)站制作黃岡網(wǎng)站推廣廠家
  • 淮南服裝網(wǎng)站建設(shè)費(fèi)用城市更新論壇破圈