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語句進行一次語法校驗和編譯,所以效率要高。