實習(xí) 4.0

com.alibaba.fastjson.JSONArray;
com.alibaba.fastjson.JSONObject;

alibaba的架包FastJson可以對json字符串進行快捷的類型轉(zhuǎn)換:

Maven依賴:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.32</version>
</dependency>
Map<String, String> resultMap = new HashMap<>();
JSONObject.toJSONString(resultMap)
String phones = [ "Google", "Runoob", "Taobao" ];
List<String> phoneList = JSONArray.parseArray(phones, String.class);

@Repository:用于標(biāo)注數(shù)據(jù)訪問組件,在DAO層使用

@Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Person person = (Person) o;
        return Objects.equal(name, person.name) &&
                Objects.equal(age, person.age) &&
                Objects.equal(id, person.id);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(name, age, id);
    }

覆蓋equals時總要覆蓋hashCode

當(dāng)synchronized修飾一個static方法時,獲取的是類鎖(即Class本身,注意:不是實例);
當(dāng)synchronized修飾一個非static方法時,獲取的是對象鎖(即類的實例對象)

jedis:
那jedis就是集成了redis的一些命令操作,封裝了redis的java客戶端。提供了連接池管理。

一般使用連接池的方式對Redis連接進行管理,所有Jedis對象先放在池子中每一次需要的時候連接Redis,只需要在池子中借,用完了再歸還給池子。

Set<String> keys = jedis.keys("*"); //列出所有的key
Set<String> keys = jedis.keys("key"); //查找特定的key

線程睡眠到期自動蘇醒,并返回到可運行狀態(tài)(就緒),不是運行狀態(tài)。
Thread.sleep()相當(dāng)于暫停

一種新的去重思路

//手機號去重
 phoneList = ListUtils.removeDuplicate(phoneList);

//removeDuplicate()方法
    public static <E> List<E>  removeDuplicate(List<E> list) {
        if (CollectionUtils.isEmpty(list)){
            return new ArrayList<>();
        }
        return new ArrayList<>(new HashSet<>(list));
    }

SQL

DISTINCT 用于返回唯一不同的值
IBM、W3School、Apple、W3School
用Distinct查找后:IBM、W3School、Apple

Mybatis的一些用法:

  • 條件查詢語句:
<choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>

choose 為 switch,when 為 case,otherwise 則為 default

  • <where>
<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  <where> 
    <if test="state != null">
         state = #{state}
    </if> 
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

where 元素只會在至少有一個子元素的條件返回 SQL 子句的情況下才去插入“WHERE”子句。

  • <set>
<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>

set 元素可以用于動態(tài)包含需要更新的列,而舍去其它的。

  • foreach
<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

collection:屬性 list、map、array等
open:在循環(huán)開始前添加前綴
close:在循環(huán)結(jié)束后添加后綴
separator:每次進行迭代之間的分隔符
item:參數(shù)調(diào)用名稱,通過此屬性來獲取集合單項的值,
即集合中每一個元素進行迭代時的別名

路徑的問題:
通過Junit4自動生成測試類以后,在類中@autowired注入后總是null值,后來發(fā)現(xiàn)是該測試類讀取不到Spring的配置,因為在main包外。
在類上加上注解解決了問題

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring/spring.xml"})

classpath:在我所接觸的項目中應(yīng)該是值Resource目錄下


單例模式
單例模式的主要作用是保證在Java程序中,某個類只有一個實例存在。
單例模式能夠避免實例對象的重復(fù)創(chuàng)建,不僅可以減少每次創(chuàng)建對象的時間開銷,還可以節(jié)約內(nèi)存空間。
單元素的枚舉類型已經(jīng)成為實現(xiàn)Singleton的最佳方法:

public enum SomeThing {
    INSTANCE;
   public String get(){
     return "hahahaha";} 
}

instance可以看作是public static final 類型的
可以在用SomeThing.INSTANCE.get()方法獲取


HashMap的插入原理


HashMap類中有一個非常重要的字段,就是 Node[] table,即哈希桶數(shù)組。
哈希桶數(shù)組需要在空間成本和時間成本之間權(quán)衡。那么通過什么方式來控制map使得Hash碰撞的概率又小,Node[] table占用空間又少呢:Hash算法和擴容機制

HashMap的Put會返回原來位置的Value的值,這里的Value是int
Integer put = map.put("Tom", 123);
Integer put1 = map.put("Tom", 12345);
Integer put2 = map.put("Jack", 0);

put = null
put1 = 123
put2 = null

解決哈希沖突的方式:
系統(tǒng)總是將新添加的 Entry 對象放入 table 數(shù)組的 bucketIndex 索引處,如果 bucketIndex 索引處已經(jīng)有了一個 Entry 對象,那新添加的 Entry 對象指向原有的 Entry 對象。
也就是說:新添加的Entry在鏈表中總是指向舊的Entry。

當(dāng)鏈表長度太長(默認超過8)時,鏈表就轉(zhuǎn)換為紅黑樹,利用紅黑樹快速增刪改查的特點提高HashMap的性能。

  • Entry
class Entry {
    Entry next;
    Class key;
    Object value;
}
  • 遍歷HashMap的方式
//用Key來遍歷
for(String key:map.keySet()) {        }

//用迭代器來遍歷
Iterator map1it=map.entrySet().iterator();
        while(map1it.hasNext())
        {        }

//推薦
for(Map.Entry<String, String> entry: map.entrySet()){}

ResourceBundle

Mybatis ResultMap

線程池的作用:
顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力
減小線程的創(chuàng)建和銷毀的開銷,每個工作線程都可以被重復(fù)利用,可執(zhí)行多個任務(wù)。

執(zhí)行場景:高并發(fā)、任務(wù)執(zhí)行時間短的業(yè)務(wù)

JAVA反射:

JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。

反射就是把java類中的各種成分映射成一個個的Java對象
例如:一個類有:成員變量、方法、構(gòu)造方法、包等等信息,利用反射技術(shù)可以對一個類進行解剖,把個個組成部分映射成一個個對象。

反射的使用:
獲取class的方式

方法1
Student stu1 = new Student();//這一new 產(chǎn)生一個Student對象,一個Class對象。
Class stuClass = stu1.getClass();//獲取Class對象

方法2
Class stuClass2 = Student.class;

方法3
Class stuClass3 = Class.forName("路徑");//注意此字符串必須是真實路徑,就是帶包名的類路徑,包名.類名

preparedStatement與Statement
編譯與預(yù)編譯:
當(dāng)客戶發(fā)送一條SQL語句給服務(wù)器后,服務(wù)器總是需要校驗SQL語句的語法格式是否正確,然后把SQL語句編譯成可執(zhí)行的函數(shù),最后才是執(zhí)行SQL語句。其中校驗語法,和編譯所花的時間可能比執(zhí)行SQL語句花的時間還要多。
如果我們需要執(zhí)行多次insert語句,但只是每次插入的值不同,MySQL服務(wù)器也是需要每次都去校驗SQL語句的語法格式,以及編譯,這就浪費了太多的時間。如果使用預(yù)編譯功能,那么只對SQL語句進行一次語法校驗和編譯,所以效率要高。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天買的Python專業(yè)書到了,把前幾天在網(wǎng)上學(xué)到的內(nèi)容在書上又從新看了一遍,就當(dāng)做是復(fù)習(xí)吧
    db4b746e1cea閱讀 157評論 0 2
  • 劉時安死后進入了一個未知域界,等待下一步指引。在失去了時間參照的狀況里,一切都是盲目的,身體卻沒有因此受到損耗,饑...
    陸自然閱讀 850評論 0 1
  • 我想做條小魚兒,在大海里不停地游啊游,都知道魚兒只有七秒鐘記憶,我想,魚兒是幸福的,可以忘掉前幾秒的痛苦。 “相呴...
    子棘閱讀 383評論 7 3
  • 1. my.ini 配置文件格式需要是ANSI格式,否則之后會報錯誤: error: Found option ...
    楓葉落盡閱讀 762評論 0 0

友情鏈接更多精彩內(nèi)容