com.alibaba.fastjson.JSONArray;
com.alibaba.fastjson.JSONObject;
alibaba的架包FastJson可以对json字符串进行快捷的类型转换:
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:用于标注数据访问组件,在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
当synchronized修饰一个static方法时,获取的是类锁(即Class本身,注意:不是实例);
当synchronized修饰一个非static方法时,获取的是对象锁(即类的实例对象)
jedis:
那jedis就是集成了redis的一些命令操作,封装了redis的java客户端。提供了连接池管理。
一般使用连接池的方式对Redis连接进行管理,所有Jedis对象先放在池子中每一次需要的时候连接Redis,只需要在池子中借,用完了再归还给池子。
Set<String> keys = jedis.keys("*"); //列出所有的key
Set<String> keys = jedis.keys("key"); //查找特定的key
线程睡眠到期自动苏醒,并返回到可运行状态(就绪),不是运行状态。
Thread.sleep()相当于暂停
一种新的去重思路
//手机号去重
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 元素可以用于动态包含需要更新的列,而舍去其它的。
- 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:在循环开始前添加前缀
close:在循环结束后添加后缀
separator:每次进行迭代之间的分隔符
item:参数调用名称,通过此属性来获取集合单项的值,
即集合中每一个元素进行迭代时的别名
路径的问题:
通过Junit4自动生成测试类以后,在类中@autowired注入后总是null值,后来发现是该测试类读取不到Spring的配置,因为在main包外。
在类上加上注解解决了问题
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring/spring.xml"})
classpath:在我所接触的项目中应该是值Resource目录下
单例模式
单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在。
单例模式能够避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间。
单元素的枚举类型已经成为实现Singleton的最佳方法:
public enum SomeThing {
INSTANCE;
public String get(){
return "hahahaha";}
}
instance可以看作是public static final 类型的
可以在用SomeThing.INSTANCE.get()方法获取
HashMap的插入原理
HashMap类中有一个非常重要的字段,就是 Node[] table,即哈希桶数组。
哈希桶数组需要在空间成本和时间成本之间权衡。那么通过什么方式来控制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
解决哈希冲突的方式:
系统总是将新添加的 Entry 对象放入 table 数组的 bucketIndex 索引处,如果 bucketIndex 索引处已经有了一个 Entry 对象,那新添加的 Entry 对象指向原有的 Entry 对象。
也就是说:新添加的Entry在链表中总是指向旧的Entry。
当链表长度太长(默认超过8)时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高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
线程池的作用:
显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力
减小线程的创建和销毁的开销,每个工作线程都可以被重复利用,可执行多个任务。
执行场景:高并发、任务执行时间短的业务
JAVA反射:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
反射的使用:
获取class的方式
方法1
Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
Class stuClass = stu1.getClass();//获取Class对象
方法2
Class stuClass2 = Student.class;
方法3
Class stuClass3 = Class.forName("路径");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
preparedStatement与Statement
编译与预编译:
当客户发送一条SQL语句给服务器后,服务器总是需要校验SQL语句的语法格式是否正确,然后把SQL语句编译成可执行的函数,最后才是执行SQL语句。其中校验语法,和编译所花的时间可能比执行SQL语句花的时间还要多。
如果我们需要执行多次insert语句,但只是每次插入的值不同,MySQL服务器也是需要每次都去校验SQL语句的语法格式,以及编译,这就浪费了太多的时间。如果使用预编译功能,那么只对SQL语句进行一次语法校验和编译,所以效率要高。