锁定老帖子 主题:看高手代码--从小case学大道理
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-05-31
前面定义了大量的HTTP常量: ... ... private static final String STATUS_305 = "Use Proxy"; private static final String STATUS_307 = "Temporary Redirect"; private static final String STATUS_400 = "Bad Request"; private static final String STATUS_401 = "Unauthorized"; private static final String STATUS_402 = "Payment Required"; private static final String STATUS_403 = "Forbidden"; private static final String STATUS_404 = "Not Found"; private static final String STATUS_405 = "Method Not Allowed"; private static final String STATUS_406 = "Not Acceptable"; private static final String STATUS_407 = "Proxy Authentication Required"; private static final String STATUS_408 = "Request Timeout"; ... ... 也可以趁机从这里查看HTTP返回值的意义^_^。然后定义了一个java.util.concurrent.ConcurrentHashMap的变量httpStatusCodeMappings,再往里面添加刚才定义的常量(这个操作放在了一个静态块里),如: static { httpStatusCodeMappings.put("sc.100", STATUS_100); httpStatusCodeMappings.put("sc.101", STATUS_101); httpStatusCodeMappings.put("sc.200", STATUS_200); httpStatusCodeMappings.put("sc.201", STATUS_201); httpStatusCodeMappings.put("sc.202", STATUS_202); httpStatusCodeMappings.put("sc.203", STATUS_203); ... ... 最重要的就是这个方法了,先看代码: public static String getMessage(int status) { // Return the status message for the most frequently used status // codes directly, without any lookup switch (status) { case 200: return STATUS_200; case 302: return STATUS_302; case 400: return STATUS_400; case 404: return STATUS_404; } return httpStatusCodeMappings.get("sc."+ status); } 这段代码的用途很简单,就是要返回状态码对应的Message,而这些这些消息都已经存放在httpStatusCodeMappings变量里了,为了提高访问常用的几个返回码的Message,它直接用了一个静态块,而不去lookup那个map了,这就是高手! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-05-31
...lookup 一下hashmap真的那么低效吗? 建议复习下数据结构哦,你这些总结是没错,可是很表面
|
|
返回顶楼 | |
发表时间:2010-05-31
case 200: return STATUS_200; case 302: return STATUS_302; case 400: return STATUS_400; case 404: return STATUS_404; 这在编译成class后这里都是常量了 不是什么静态块 |
|
返回顶楼 | |
发表时间:2010-05-31
sw1982 写道 ...lookup 一下hashmap真的那么低效吗? 建议复习下数据结构哦,你这些总结是没错,可是很表面
多谢教导!! 这里的hashmap是一个java.util.concurrent.ConcurrentHashMap,应该会慢一些吧? |
|
返回顶楼 | |
发表时间:2010-05-31
道行太浅,没明白啥意思
|
|
返回顶楼 | |
发表时间:2010-05-31
ConcurrentHashMap是分块治理的思路,插入的时候会差一点,因为设计到块的拷贝,查询效率还是O(1)
swanky_yao 写道 sw1982 写道 ...lookup 一下hashmap真的那么低效吗? 建议复习下数据结构哦,你这些总结是没错,可是很表面
多谢教导!! 这里的hashmap是一个java.util.concurrent.ConcurrentHashMap,应该会慢一些吧? |
|
返回顶楼 | |
发表时间:2010-05-31
这些我也经常用,很常见的技术
|
|
返回顶楼 | |
发表时间:2010-05-31
最后修改:2010-05-31
hashmap 效率再怎么O(1),也得调用hashCode,调用equals,进行 % 的运算,肯定不及将最常用的几个状态码作为条件判断语句来得快
考虑真实场景,大并发用户下,绝大多数是 200,如果这时候还hashmap 里查找,量大起来,效率肯定是有差距的,而这个节省效率的成本,也就是写几个 switch的case 而已,何乐不为 |
|
返回顶楼 | |
发表时间:2010-05-31
sw1982 写道 ...lookup 一下hashmap真的那么低效吗? 建议复习下数据结构哦,你这些总结是没错,可是很表面
典型的没有写过高并发程序的思维方式,明明可以节约的地方,仅仅几行代码就可以优化,偏偏不做。 hashmap再快,也比case 一个 整型满上1w倍。 性能,是一点一点挤牙膏挤出来的,哪能到处浪费啊。 |
|
返回顶楼 | |
发表时间:2010-05-31
switch (status) {
case 200: return STATUS_200; case 302: return STATUS_302; case 400: return STATUS_400; case 404: return STATUS_404; 正常情况下,一个正常工作的系统,返回状态码为上述几个的概率应该是99.99%以上,这个时候的节约就很可观的。 |
|
返回顶楼 | |