William的小星球 
  • 首页
  • 归档
  • 分类
  • 标签
  • 关于
  •     

常量

注意一个坑:定义常量的时候绝对不能在末尾加上; //直接这样定义就可以了 #define FREEZING_PT 32.0 #define SCALE_FACTOR (5.0/9.0)如果加上了分号;,会有意想不到的傻逼错误。
 2018-01-06   C   

格式控制符

格式控制符:%d:用来输出int,d表示decimal,整数%hd:用来输出short,short integer。%ld:用来输出long%s:用来输出String字符串%c:用来输出char字符%f:用来输出float浮点型 short int long unsigned short unsigned int unsigned long 八进制 – – – %ho %o %lo 十进制 %hd %d %ld %hu %u %lu 十六进制 – – – %hx 或者 %hX %x 或者 %X %lx 或者 %lX — 二进制,八进制,十六进制: //
 2018-01-06   C   

查看基本数据类型所占的字节

public class MainTest { public static void main(String args[]) throws Exception { System.out.println("int占的字节:"+Integer.BYTES); System.out.println("long占的字节:"+Long.BYTES); System.out.println("short占的字节:"+Short.BYTES); System.out.print
 2018-01-06   Java   

MediaMetadataRetriever获取mp3文件信息

转发:http://blog.csdn.net/xiao5678yun/article/details/53838362 MediaMetadataRetriever mmr = new MediaMetadataRetriever(); String str = getExternalStorageDirectory() + "1.mp3"; Log.d(TAG, "str:" + str); try { mmr.setDataSource(str); String title = mmr.extractMetad
 2018-01-05   Android   

通过Annotation为按钮设置监听(ButterKnife的原理)

通过注解来为按钮设置监听,类似于黄油匕首(butterknife)。 ###步骤: ① @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) //注意这里两个元注解,RUNTIME保证运行时,保证可以被反射,FIELD表示目标是成员变量 public @interface ListenerFor { Class<?extends ActionListener> listener(); }② public class ActionListenerInstaller { public static
 2017-12-28   Java   

通过反射查看泛型信息

#####通过泛型和反射避免强制类型转换:下面这个代码是没问题的。 Class clazz=Class.forName("java.util.Date"); Date date= (Date) clazz.newInstance();但是这样也没问题,编译器不会报错,但是run肯定会报错。 String string= (String) clazz.newInstance();结合泛型反射可以避免强制类型转换,让编译器帮我们检查: @SuppressWarnings(value = "unchecked") public class MainTest {
 2017-12-27   Java   

Proxy和Invocation动态代理和AOP代理

Proxy创建动态代理的两个方法: //方法一 static Class<?> getProxyClass(ClassLoader loader, Class<?>...interfaces); //方法二 static Object newProxyInstance(ClassLoader loader, Class<?> interfaces, InvocationHander hander);方法一:创建一个动态代理类所对应的Class对象,该代理类将实现interfaces数组所指定的多个接口。第一个ClassLoader参数指定生成动态代理类的类加
 2017-12-27   Java   

泛型类型转换的问题

String[] strings = new String[5]; Object[] objects=strings; String a=new String(); Object obj=a;这两段代码说明的是:如果A是B的子类,那么A可以直接转换成B类型,A类数组也可以直接转换成B类数组。 List<String> list=new ArrayList<>(); List<Object> objectList=list;但是这段代码是错误的,不同的泛型对象,就算A是B的子类,A泛型的类也不能转换成B泛型的相同的类。编译器在编译阶段就可以报错: 总结:如果
 2017-12-23   Java   

volatile关键字

弄懂volatile之前首先确保弄懂了java内存模型,可参考我的整理Java内存模型 volatile的作用如下: 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 禁止进行指令重排序。(涉及volatile变量的代码的前面和后面的代码不会进行重排序)。 注意: volatile不保证被修饰的变量的操作的原子性(要保证操作的原子性建议使用同步:synchronized和Lock)。 使用场景: 标记状态量:volatile boolean flag = false; while(!flag){ doSomethi
 2017-12-13   java并发   

Java内存模型

参考:海子的博客Java并发编程:volatile关键字解析 三个重点: 原子性 可见性 有序性 讨论这三点之前先说一下计算机的内存模型: CPU对程序的指令的执行速度远远大于从内存中读写数据的速度所以如果让CPU直接访问内存来读数据再写结果去内存,就会效率非常低下。因此就有了高速缓存——Cache这个东西。 举个例子看看他们怎么工作的:i=0;单线程运行代码:i=i+1;步骤是:Cache从主存读取i=0, CPU从Cache读取i,CPU运算i=i+1, 将结果i=1写入Cache,Cache再将结果i=1写入主存。 单线程没问题,但是多线程中*,比如开启两个线程分别执行i=i+
 2017-12-13   java并发   
1…161718192021

搜索

Hexo Fluid