编程中的小技巧,持续更新
来源:互联网 发布:开淘宝店 编辑:程序博客网 时间:2024/05/16 15:40
下面是是读开源项目源码,JDK源码,Android系统源码小技巧
使用do{ } while(0)
int foo(){ somestruct* ptr = malloc(...); do{ dosomething...; if(error) { break; } dosomething...; if(error) { break; } dosomething...; }while(0); free(ptr); return 0;}
1.替代{},实现局部作用域.在一些C的实现里也可以用.
2,避免使用goto对程序流进行统一的控制:
有些函数中,在函数return之前我们经常会进行一些收尾的工作,比如free掉一块函数开始malloc的内存,用break做跳出.
3,当你执行一段代码到一半,想跳过剩下的一半的时候,如果你正处于do while循环中,则能用break达到这个目的
4,定义一个单独的函数块来实现复杂的操作:
当你的功能很复杂,变量很多你又不愿意增加一个函数的时候,使用do{}while(0);,
将你的代码写在里面,里面可以定义变量而不用考虑变量名会同函数之前或者之后的重复。
连续连接n次直至成功(例如socket重连):
private static void writeLmkd(ByteBuffer buf) { //当socket打开失败会尝试3次 for (int i = 0; i < 3; i++) { if (sLmkdSocket == null) { if (openLmkdSocket() == false) { try { Thread.sleep(1000); } catch (InterruptedException ie) { } continue; } } try { //将buf信息写入lmkd socket sLmkdOutputStream.write(buf.array(), 0, buf.position()); return; } catch (IOException ex) { try { sLmkdSocket.close(); } catch (IOException ex2) { } sLmkdSocket = null; } }}
文件按序命名(下载文件名称按序号命名):
/* * This number is used to generate partially randomized filenames to avoid * collisions. * It starts at 1. * The next 9 iterations increment it by 1 at a time (up to 10). * The next 9 iterations increment it by 1 to 10 (random) at a time. * The next 9 iterations increment it by 1 to 100 (random) at a time. * ... Up to the point where it increases by 100000000 at a time. * (the maximum value that can be reached is 1000000000) * As soon as a number is reached that generates a filename that doesn't exist, * that filename is used. * If the filename coming in is [base].[ext], the generated filenames are * [base]-[sequence].[ext]. */ int sequence = 1; for (int magnitude = 1; magnitude < 1000000000; magnitude *= 10) { for (int iteration = 0; iteration < 9; ++iteration) { fullFilename = filename + sequence + extension; if (!new File(fullFilename).exists()) { return fullFilename; } Log.v(LOG, "file with sequence number " + sequence + " exists"); sequence += sRandom.nextInt(magnitude) + 1; } }
交换两个List元素
public static void swap(List<?> list, int i, int j) { final List l = list; l.set(i, l.set(j, l.get(i))); }
时间换空间,交换2个数
Int a,b
a=a+b;b=a-b;a=a-b;
数组避免越界处理
table[hash&(table.length-1)]
<pre name="code" class="java">public void clear() { int h = head; int t = tail; if (h != t) { // clear all cells head = tail = 0; int i = h; int mask = elements.length - 1; do { elements[i] = null; i = (i + 1) & mask; } while (i != t); } }
数学运算
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2,左移n位就相当于乘以2的n次方
右移一位相当于除2,右移n位相当于除以2的n次方。
int low = fromIndex;
int high = toIndex - 1;
int mid = (low + high) >>> 1;
移位时,移出的位数全部丢弃,移出的空位补入的数与左移还是右移有关。如果是左移,则规定补入的数全部是0;
如果是右移,还与被移位的数据是否带符号有关。若是不带符号数,则补入的数全部为0;
若是带符号数,则补入的数全部等于原数的最左端位上的原数(即原符号位)。
Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C或C++没有的。
不断更新中。。。
1 0
- 编程中的小技巧,持续更新
- ACM编程中的小技巧总结 (持续更新)
- 编程小技巧(持续更新中)
- 程序竞赛中的小技巧[持续更新]
- 一些VC编程中的技巧[持续更新]
- 小技巧(持续更新)
- JNI编程小技巧集合(持续更新)
- Cocos2d-JS开发中的一些小技巧(持续更新)
- JavaScript中的小技巧 持续更新记录(2017/5/25)
- CSS 小技巧(持续更新)
- LINUX小技巧!持续更新......
- js小技巧(持续更新)
- java编程中的一些技巧(持续更新中)
- 编程技巧集--持续更新
- 一些小技巧,持续更新[C#]
- 小技巧 ASP.NET 持续更新中
- 一句话的小技巧(持续更新ing~)
- C/C++代码小技巧【持续更新】
- 代码重构的艺术
- 文件上传功能web
- DB-Mysql-日志文件
- 堆和栈的区别和C内存
- 《多线程编程》学习之一:使用多线程及线程安全
- 编程中的小技巧,持续更新
- CodeBlock快捷键
- 【Codeforces Round #376 (Div. 2)】 Codeforces 731C Socks
- Python Paramiko模块安装和使用
- 64位Ubuntu kylin 16.04搭建nfs网络文件系统
- Java集合对象排序测试
- GitHub意外情况1-warning: push.default is unset
- 网络抓包工具: 提供界面,可抓取网络数据包并显示
- Spring的三种实例化Bean的方式