实习 4.0

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语句进行一次语法校验和编译,所以效率要高。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容