自律与健康
自律给我自由 一直很喜欢Keep启动时splash上这句话,使用Keep这个软件也1年多了,想总结点东西。 其实最早用keep是2015年的8月,只不过那时候Keep还没有跑步的功能,而我也一直在用悦跑圈跑步,整个从2015年7月开始到2016年...
自律给我自由 一直很喜欢Keep启动时splash上这句话,使用Keep这个软件也1年多了,想总结点东西。 其实最早用keep是2015年的8月,只不过那时候Keep还没有跑步的功能,而我也一直在用悦跑圈跑步,整个从2015年7月开始到2016年...
拥有一台mac应该算是从学生时代的愿望,但是苦于囊中羞涩,工作了之后想买但是自己又下不去狠心去买,618期间本来想入手15款的macbook pro,跟女朋友一说这个事情,她说要买就买最新款的,不差那几个钱,所以昨天就和她一起去南京东路苹果直营店买下...
final在java中的用法有很多,可以修饰field,可以修饰Method,可以修饰Class,而且final在多线程环境中保证了对象状态的不变性,下面就系统的总结一下Java中final关键字的用法 修饰Variable/field 修饰primitive变量,变量一旦赋值就不再可变。 final修饰基本数据类型变量和String类型时,类似于C++的const 3种变量会被隐式的定义为final:3.1. 接口中的field是final的3.2. Java7中出现的try with resource语句中的变量是隐式的final类型,如下面的代码,inputStream虽然未被声明为final,但是如果试图在try块里面重新对inputStream赋值的话,就会产生编译异常,不能给final变量赋值 12345try (FileInputStream inputStream = new FileInputStream("text.txt")){inputStream = new FileInputStream("");} catch (Exception e) { e.printStackTrace();} 修饰引用实例类型变量,变量被赋值后,变量指向的引用的值可以变,但是不能重新指向新的引用,即final只关心引用本身,而不关心final引用的内容。 12345678public static void main(String[] args) { final User user = new User("xuan1",23); System.out.println(user.getAge()); //输出23 user.setAge(24); System.out.println(user.getAge()); //输出24 user = new User("xuan2",25); //编译错误,提示不能赋值给final变量 System.out.println(user.getAge());} 修饰实例成员变量时,必须在定义的时候初始化:直接赋值,构造器初始化,或代码块中初始化,或的意思是这三种方式只能选择一种,否则编译报错。 修饰静态成员变量时,必须在变量定义的时候初始化:直接赋值,静态代码块中赋值 Tips: 有一种特殊情况:System.in,System.out,System.err 是静态域但是没有在定义的时候或者静态代码块中初始化,而是使用了set方法来设置值。 JDK8以前内部类访问外部类的变量时要求变量为Final类型,JDK8之后,只要求外部类为事实不可变变量,不一定要加上final
java工程师平时工作中用到的工具挺多的,比如javap,jstack等,intellij idea 作为宇宙最强java ide idea一样可以帮我们实现这个功能,方法如下: ctrl+alt+s打开设置界面,找到Tool-> External Tools 点击 +来增加一个新的外部工具。
将嵌套List的Map转换为Json应该都没什么问题,使用Gson和Jackson都能实现,在Gson中使用new Gson().toJson()方法,在Jackson中使用new ObjectMapper().writeValueAsString()即可。将json转换为形如Map<String,List>的时候遇到了一点问题,虽然返回类型是Map<String,List<Long>>但是,Map的value的值却并不是List<Long>,而是Integer类型的,这里面显然是有问题的,查看Jackson的源码和Gson的源码发现将json反序列化为对象确实有两个方法,一种适用于泛型对象,一种适用于非泛型的一般对象。 使用Gson在gson中将json字符串转反序列化为对象有两个方法: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 /** * This method deserializes the specified Json into an object of the specified class. It is not * suitable to use if the specified class is a generic type since it will not have the generic * type information because of the Type Erasure feature of Java. Therefore, this method should not * be used if the desired type is a generic type. Note that this method works fine if the any of * the fields of the specified object are generics, just the object itself should not be a * generic type. For the cases when the object is of generic type, invoke * {@link #fromJson(String, Type)}. If you have the Json in a {@link Reader} instead of * a String, use {@link #fromJson(Reader, Class)} instead. * * @param <T> the type of the desired object * @param json the string from which the object is to be deserialized * @param classOfT the class of T * @return an object of type T from the string. Returns {@code null} if {@code json} is {@code null}. * @throws JsonSyntaxException if json is not a valid representation for an object of type * classOfT */public <T> T fromJson(String json, Class<T> classOfT) throws JsonSyntaxException { Object object = fromJson(json, (Type) classOfT); return Primitives.wrap(classOfT).cast(object); } /** * This method deserializes the specified Json into an object of the specified type. This method * is useful if the specified object is a generic type. For non-generic objects, use * {@link #fromJson(String, Class)} instead. If you have the Json in a {@link Reader} instead of * a String, use {@link #fromJson(Reader, Type)} instead. * * @param <T> the type of the desired object * @param json the string from which the object is to be deserialized * @param typeOfT The specific genericized type of src. You can obtain this type by using the * {@link com.google.gson.reflect.TypeToken} class. For example, to get the type for * {@code Collection<Foo>}, you should use: * <pre> * Type typeOfT = new TypeToken<Collection<Foo>>(){}.getType(); * </pre> * @return an object of type T from the string. Returns {@code null} if {@code json} is {@code null}. * @throws JsonParseException if json is not a valid representation for an object of type typeOfT * @throws JsonSyntaxException if json is not a valid representation for an object of type */ @SuppressWarnings("unchecked") public <T> T fromJson(String json, Type typeOfT) throws JsonSyntaxException { if (json == null) { return null; } StringReader reader = new StringReader(json); T target = (T) fromJson(reader, typeOfT); return target; }
总是等到过完农历的新年才会觉得新的一年才真正的开始,元旦仿佛没有什么卵用,回首过去的一年,有很多收获,同时也有不少遗憾,京东做活动的时候买的书还有好多没有读完,新的一年,新的开始,书要一步一步的读,代码要一字一字得码,希望2017年能够更上一层楼。下面的只是个大概的提纲,没有具体的每天读几页,多少天读完等很严格的规划,因为生活中有很多突发事件会影响自己,公司加班、生病发烧,聚餐啊,跳槽等等…无法预测,用尽一切时间去学:在地铁上看,在饭后看,睡觉前少看会儿手机多读一会儿书,让心流的时间加长,高效专注的完成之后再休息。 技术方面首先,肯定是要去库存,去年京东做活动买的没读完的书争取在上半年读完。No.1《Redis设计与实现》Redis不仅是一个缓存工具,而且还是一个nosql的实现,性能极其强大,目前No.2《编程珠玑》编程方面的属于元老级别的书吧,修炼自己的内功必备,想吃透这本书我觉得一年都不一定行。No.3《Spring实战》原本是买来给女朋友入门Spring的…我先撸一遍吧,里面的例子还是很清晰的,适合初学者,我更倾向于看《Spring揭密》。No.4《Linux命令行与shell脚本编程大全(第3版)》作为一个Java行业从业者,Linux自然是必不可少的,提高自己的Linux姿势水平势在必行。No.5《利用Python进行数据分析》去年读完了《Python基础教程》,还是应该投入实际的用途,学学用Python进行数据分析吧。No.6《高性能Mysql》这个板砖书,还是看电子版的好了,放在ipad里也极其方便,不一定全部看完,但是重要章节一定得看完,而且得熟练,互联网公司必备。No.7《敏捷软件开发原则、模式与实践》再重新读一遍此神书,了解如何编写优雅的代码。
1.环境配置kafka依赖zookeeper来调度,以及选举leader,因此需要先安装zookeeper 1.1 安装zookeeper点击下载zookeeper下载合适版本的zookeeper,当前最新的稳定版本是3.4.9创建好数据目录,命名为data,下一步配置用到 12$ cd opt/ && tar -zxf zookeeper-3.4.6.tar.gz && cd zookeeper-3.4.6$ mkdir data 1.2 配置zookeeper123456$ vi conf/zoo.cfgtickTime=2000dataDir=/path/to/zookeeper/dataclientPort=2181initLimit=5syncLimit=2 1.3 启动zookeeper1$ bin/zkServer.sh start 相应的停止zookeeper的命令为: 1$ bin/zkServer.sh stop 1.4 启动zookeeper CLI1$ bin/zkCli.sh
大学的时候读过的一本书,当年排行德国非小说类的第一名,现在又抽空读了一遍,感觉获益颇多,每一篇都很简短,用很小的生活中的例子来解释看似很平常的一些思维谬误,这本书有个很好玩的副标题你最好让别人去犯的52个思维错误,能感受到作者的诙谐和幽默。作者在前言里就说了,生活中的思维错误是不可能避免的,能够意识到并且尽量在生活中少犯就好了,让我说其实更像是程序的bug,是无法避免的,在编程(思考)的时候多加注意就好了。 一、幸存偏误幸存偏误指的是,在生活中更容易看到成功,看不到失败,所以会过高的估计自己成功的希望。最常见的例子 每个成功的人都很努力,所以努力的人都能成功。 这种就是典型的只看到了成功的人而忽视了那些失败的人。所以作者在文章中提醒我们要常常逛逛墓地,看看那些失败者的案例,能够让我们能加清醒的思考。 二、游泳运动员错觉
在JDK5之前,访问共享对象的时候使用的机制只有synchronized和volatile ,JDK5的并发包里提供了一种新的更加高级的机制:互斥锁ReentrantLock,显式锁是为了弥补内置锁的方法而开发的,两者是互补的关系,显式锁并不能代替内置锁。ReentrantLock实现了一种标准的互斥锁,亦即每次最多有一个线程能够持有ReentrantLock Lock接口&ReentrantLock简介concurrent包中的Lock类定义了一组抽象的加锁操作,如下代码所示,与synchronized不同的是,Lock提供了一种无条件、可轮询、定时、可中断的锁获取操作,所有的加锁和解锁操作都是显示的ReentrantLock实现了Lock接口,提供了与synchronized相同的互斥性以及内存可见性。与synchronized一样,ReentrantLock提供了可重入(即可以被单个线程多次获取)的加锁语义。 123456789public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition();} ReentrantLock的使用方法: 12345678Lock lock = new ReentrantLock();...lock.lock();try{} finally{ lock.unlock();} 在使用显示锁的时候一定要在finally块中释放锁,否则如果代码中一旦出现异常,那么可能这个锁永远都无法释放就会造成某个对象的状态不一致,如果是账户余额或者别的重要的信息可能就会出现很严重的事故。
有的时候在写程序的时候可能有些地方的日志没有照顾到,产生了bug,如果到了线上环境,有时候不得不停掉服务重新来加入日志来查看产生bug的地方,这个时候Btrace就派的上用场了,在VisualVM中可以很方便的调试目标程序,而对原有项目没有影响,当然也可以不用VisualVM而使用命令行来实现这个功能。Btrace是一个开源项目,项目托管在github上 使用VisualVM的Btrace插件最为方便,下面就写个小例子来熟悉一下 准备工作1.在visualvm官网下载visualVM可视化工具2.依次点击visualVM菜单栏的Tool->plugins打开插件窗口,选择 Btrace workBench 然后一路 next安装 目标程序 准备了一个简单的小程序:从键盘接收两个数字然后计算两个数字之和,主要目的是方便下一步用Btrace来调试打印出方法的参数的值,以及堆栈信息 12345678910111213141516171819202122232425package org.xuan.trace;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/** * Created by Xuan on 2016/9/10. */public class BTraceTest { public int add(int a ,int b){ return a+b; } public static void main(String[] args) throws IOException { BTraceTest traceTest= new BTraceTest(); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); for (int i = 0; i < 10; i++) { reader.readLine(); int a = (int)Math.round(Math.random()*1000); int b = (int)Math.round(Math.random()*1000); System.out.println(traceTest.add(a,b)); } }}