\17为什么是一个字符 青云志不是7月17\1和7

为什么有符号整型最小为1后面15个0而不是15个1,而字符型最小为1后面7个1_百度知道一波传奇巨星相继退役,科比、邓肯的离去,让如今的NBA赛场少了一份当年的滋味,当另...
科技界如今的趋势是朝着网络化服务化发展,然而那么些年过去了,苹果的云服务却依然没...
Apple在iOS生态上面临的主要问题是:大部分开发者无法持续性赚钱。
你应该没有想到,有一些和你同样用 iPhone 7 的人,他们并不能好好地享受新设备能给他...
这也难怪,很多在美国地区举行的发布会,看上去都是一片MacBook。
国庆假期收尾,大伙马上又要投入到忙碌的工作学习中,此时怎能少一款休闲好玩的游戏来...
新开箱的iPhone 7“激活锁”功能被曝存在一个古怪的漏洞:部分用户发现自己的新iPhone...
在这五年时间里,相信库克所做的一切可以令泉下的乔布斯满意。
《动物方层树》这样的游戏名字一下子让人丈二和尚摸不着头脑,小编和不少玩家一样,根...
游戏在画面上虽然没有采用像素风格的设计,但是整体给人感觉还是非常复古的,颇有一种...
在上周四的App Store国服照例更新当中,网易上架了旗下全新的二次元动作手游《异次元...
《点点邪恶帝国》是一款非常典型的点击放置类游戏,简单的玩法和轻松的画风是它的闪光...
《那兔之大国梦》是《那年那兔那些事儿》改编的第二款手游,在经历第一款手游的“失败...
《小轮车冒险》(Pumped BMX)是独立游戏开发团队 Yeah Us! 手中的金字招牌,目前已经...
弹幕射击类游戏在出现之后获得了不少玩家的喜爱,这些年来也一直人气不减。
现在我们需要关心的是取消3.5毫米耳机接口之后,苹果如何创建新的用户体验。
看了这亮黑三件套之后,你是否也有为其它苹果产品染上亮黑色的冲动呢?
不过从价格上来看,似乎有点性价比略低,而且目前可供选择的配件少得可怜~
因为 iPhone 7 只有一个 Lightning 接口,因此充电线缆和 EarPods 很难同时使用。
看过用了 W1 芯片的 Beats Solo 评测之后更加期待 AirPods 了!
苹果在新款 iPhone 7 系列手机中取消了传统的 3.5mm 耳机插孔,但是仍有不少苹果粉丝...
虽然 iPhone 本身也可以通过应用进行录音,但是很多需要录音的时刻并不会等着我们打开...
相信随着智能家居渐渐走入更多人的家庭里,肯定会有更多设备支持HomeKit。
146021阅读
8月27日最终版:iOS7.1.1-2微软雅黑第④版,64731超全字符手写笔画无压力,保持原机粗细比例
注册时间 最后登录
在线时间278 小时 UID
帖子 精华4
主题帖子人气
白苹果, 积分 1376, 距离下一级还需 124 积分
本帖最后由 【心雨】 于
12:25 编辑
附件删除了,抱歉,看不懂威锋里面这些天天发没营养的东西的版主,天天看着广告不管,来删我帖子,呵呵。谢谢版主@下乡人 提醒,论坛不让猜猜猜,第一次发这样的帖子不清楚这里面的潜规则:
在8月4日最终版基础上,27日简单修改了一下日文字体的打包方式和日文字体的字体命名处理,介绍如下:
1.合计64731个字符,解决了网上99%分享的字体不能打开4字节字体的问题;
2.自带键盘的手写、笔画测试了1个小时,没有问题,如下图,这么复杂的字也不会闪退(我手写出来的这个字,90%网上分享的字体都显示不了,自带字体可以显示):
IMG_3308.PNG (92.21 KB, 下载次数: 0)
20:42 上传
论坛里有人说字符全不全,打jun然后拉到下面会不会闪退就知道了,我这上下拉了四五趟也没事:
IMG_3339副本.png (104.17 KB, 下载次数: 0)
13:31 上传
3.所有字体保持原机粗细比例,中英文都是的,英文部分还调整了部分原机倾斜的地方,保持原机一致,所有英文、键盘字体都是TTC解包后修改单个TTF,这样比找一个英文字体打包好多了,所有解包后的TTF打包前都按照原机字体的大小、粗细和间距、倾斜度做了修改,而不是网上95%都是用AiFont打包完事,如下图:
IMG_3321.PNG (76.12 KB, 下载次数: 0)
20:42 上传
IMG_3322.PNG (181.8 KB, 下载次数: 0)
20:42 上传
IMG_3323.PNG (111.66 KB, 下载次数: 0)
20:42 上传
IMG_3324.PNG (112.62 KB, 下载次数: 0)
20:42 上传
IMG_3335.PNG (84.11 KB, 下载次数: 0)
20:42 上传
4.一些个性化的小修改,把锁屏时间和录像的字体换成了液晶字体,锁屏时间的液晶字体同时还会在桌面日历、计算器、秒表、天气温度中显示,这是个人爱好,不喜勿喷,,:
IMG_3319.PNG (369.19 KB, 下载次数: 0)
20:42 上传
IMG_3320.PNG (334.68 KB, 下载次数: 0)
20:42 上传
IMG_3334.PNG (200.95 KB, 下载次数: 0)
20:42 上传
5.修改了所有地方的键盘字体,很多分享的字体在iFile和Cydia里面调用的还是原来的键盘,我之前的字体在原机键盘上面的1和状态栏的1也显示原机字体,这次修复好了:
IMG_3327.PNG (130.35 KB, 下载次数: 0)
20:42 上传
IMG_3328.PNG (75.44 KB, 下载次数: 0)
20:42 上传
6.修改了日文字体,少数软件调用的是日文字体里面的中文,搞的手机很不和谐,比如iClean Pro这个软件,原机字体也不和谐,修改后如下:
IMG_3325.PNG (146.4 KB, 下载次数: 0)
20:42 上传
IMG_3326.PNG (95.28 KB, 下载次数: 0)
20:42 上传
7.增加了大量你用得到的和用不到的符号,这个网上99%的字体都不全,看看我这个:
IMG_3329.PNG (105.61 KB, 下载次数: 0)
20:42 上传
IMG_3330.PNG (135.04 KB, 下载次数: 0)
20:42 上传
IMG_3331.PNG (136.5 KB, 下载次数: 0)
20:42 上传
IMG_3332.PNG (139.83 KB, 下载次数: 0)
20:42 上传
有兴趣的可以自己下载这个文本测试你的字符全不全:
(12.85 KB, 下载次数: 906)
15:16 上传
点击文件名下载附件
8.字体适用范围:所有iOS7.1.1-7.1.2设备,包括手机和平板;
中文字体是雅黑和方正兰亭黑结合,繁体是微软正黑,日文符号提取自Meiryo,韩文是Malgun,这些字体都是Win8系统在各国家默认的字体;
英文数字字体是Neutraface:
IMG_3333.PNG (101.4 KB, 下载次数: 0)
20:42 上传
9.分享我补全的字库给喜欢自己做字体的朋友,所有你喜欢的字体,用fontforge合并到我这个上面之后,都不会闪退了,都是字符超全了,已经按照原机字体大小和间距做了修改,粗细、倾斜等自己调整:
(8.14 MB, 下载次数: 1294)
21:08 上传
点击文件名下载附件
10.字体下载,下载后解包直接复制/System/Library/Fonts/Cache文件夹里面,覆盖原机字体:
(16 MB, 下载次数: 8969)
16:28 上传
点击文件名下载附件
8月27日更新
(16 MB, 下载次数: 5747)
16:28 上传
点击文件名下载附件
8月27日更新
(16 MB, 下载次数: 7981)
16:28 上传
点击文件名下载附件
8月27日更新
(5.47 MB, 下载次数: 5624)
16:28 上传
点击文件名下载附件
8月27日更新
友情提示:覆盖之后记得清空一下手机缓存,然后重启手机,以防有些地方还缓存了原机字体样式,手机连接电脑打开/var/mobile/Library/Caches,删除这里面所有的文件夹,然后重启即可。
做字体只要细心就可以了,2楼分享了部分自己做字体的经验。
, , , , , , , , , , , , , , , , , , , , , , , , , , ,
<p id="rate_5748" onmouseover="showTip(this)" tip="看了楼主的贴,有自己做字体的冲动了。&人气 + 5
" class="mtn mbn">
<p id="rate_12334" onmouseover="showTip(this)" tip="感谢分享^_^&人气 + 3
" class="mtn mbn">
<p id="rate_91258" onmouseover="showTip(this)" tip="加油&人气 + 1
" class="mtn mbn">
<p id="rate_60832" onmouseover="showTip(this)" tip="威锋有你更精彩:)&人气 + 3
" class="mtn mbn">
<p id="rate_68111" onmouseover="showTip(this)" tip="感谢分享^_^&人气 + 1
" class="mtn mbn">
<p id="rate_87426" onmouseover="showTip(this)" tip="感谢分享^_^&人气 + 3
" class="mtn mbn">
<p id="rate_16089" onmouseover="showTip(this)" tip="原创内容^_^&人气 + 5
" class="mtn mbn">
<p id="rate_1052" onmouseover="showTip(this)" tip="精品文章^_^&人气 + 1
" class="mtn mbn">
<p id="rate_78370" onmouseover="showTip(this)" tip="好久没给过人5分了!&人气 + 5
" class="mtn mbn">
<p id="rate_75016" onmouseover="showTip(this)" tip="威锋有你更精彩:)&人气 + 7
" class="mtn mbn">
<p id="rate_74678" onmouseover="showTip(this)" tip="楼主,把中文句号和逗号规范以下把。(句号靠左了,逗号居中了...).&人气 + 1
" class="mtn mbn">
<p id="rate_42703" onmouseover="showTip(this)" tip="威锋有你更精彩:)&人气 + 3
" class="mtn mbn">
<p id="rate_73045" onmouseover="showTip(this)" tip="感谢分享^_^&人气 + 7
" class="mtn mbn">
<p id="rate_48251" onmouseover="showTip(this)" tip="&a
href=&forum.php?mod=redirect&goto=findpost&ptid=7671656&pid=&fromuid=1&&&span &感谢分享^_^&/span&&/a&&人气 + 3
" class="mtn mbn">
<p id="rate_34734" onmouseover="showTip(this)" tip="请问支持8.1了吗谢谢&人气 + 1
" class="mtn mbn">
<p id="rate_78945" onmouseover="showTip(this)" tip="&a
href=&forum.php?mod=redirect&goto=findpost&ptid=7671656&pid=&fromuid=1&&&span &感谢分享^_^&/span&&/a&&人气 + 7
" class="mtn mbn">
评分次数174
看了楼主的贴,有自己做字体的冲动了。
感谢分享^_^
威锋有你更精彩:)
感谢分享^_^
感谢分享^_^
原创内容^_^
精品文章^_^
好久没给过人5分了!
威锋有你更精彩:)
楼主,把中文句号和逗号规范以下把。(句号靠左了,逗号居中了...).
威锋有你更精彩:)
感谢分享^_^
请问支持8.1了吗谢谢
威锋有你更精彩:)
IOS8.1 完全
字体确实是精品,堪称论坛里最好的了,只是标点不太美观,在一些应用里有错位,比如网.
威锋有你更精彩:)
威锋有你更精彩:)
请问锁屏有配套的数字文件吗?
能不能单独下符号文件?还有分享下你的输入法布局皮肤好吗?.
精品文章^_^
精品文章^_^
精品文章^_^
感谢分享^_^
原创内容^_^
威锋有你更精彩:)
好看,感谢楼主
楼主能不能直接做个锤子rom提取出来的字体用到ios712上面啊,感谢了!.
感谢分享^_^
原创内容^_^
感谢分享^_^
威锋有你更精彩:)
附件都删除了,不要说我小气,懂点技术的都有点个性,没必要对几个陌生人大度吧?
注册时间 最后登录
在线时间278 小时 UID
帖子 精华4
主题帖子人气
二楼分享一些修改苹果字体的小经验
本帖最后由 【心雨】 于
14:43 编辑
二楼分享一些修改苹果字体的小经验:
1.字库要全,大多数字体出问题,都是因为字库不全,可以说字体出问题闪退70%的原因是字库不全,字库可以用fontforge进行合并或者用FontCreator进行添加,用fontforge合并前记得要将两个需要合并的字库大小、度量调整一致;
2.所有字体打包前,要调整成苹果原机字体一样的大小和度量,这样就不会出现剃头等不和谐现象了;
3.所有字体打包前,记得用FontCreator删除一下字体不支持的地方,方法是用FontCreator打开,然后点击格式 - 表,然后把不支持的列表里面的都删除,这个是字体出问题剩下的30%的原因,比如有些地方如状态栏数字1还是原机字体样式,就是因为这里没删除,手写、笔画闪退跟这个也有关系;
4.大多数分享的字体都是一种粗细然后打包,这对于初学者来说比较简单,如果想要保持原机粗细比例,需要自己调整字体的粗细然后分类打包,尤其是英文字体,每个TTC里面的TTF粗细、倾斜度都不一样,需要挨个修改然后用TTCtools打包;
5.部分字体由于字体本来像素质量不高,调粗或者调细后就很难看,比如很多人喜欢的浪漫雅园,调整粗细后会变形,这是字体质量本来就不高,微软雅黑、方正字体、少女字体、MYuppy字体等质量较好的字体,可以保持调整粗细后不变形。
另外,不喜欢上面的锁屏液晶数字的,可以下载这个覆盖上面压缩包里面的同名文件,然后再复制到手机里面,这个用的同样是Neutraface数字:
(2.93 MB, 下载次数: 903)
14:29 上传
点击文件名下载附件
满足不喜欢液晶数字锁屏又不会自己修改的:
IMG_3343.PNG (781.63 KB, 下载次数: 0)
14:38 上传
相机录像界面的是数字在DINAlternate-bold.ttf里面,不想要的就不要替换这个文件,用原机的DINAlternate-bold.ttf就可以了。
<p id="rate_87267" onmouseover="showTip(this)" tip="终于找到楼主了,给力!&人气 + 5
" class="mtn mbn">
<p id="rate_78334" onmouseover="showTip(this)" tip="让更多人看到&人气 + 3
" class="mtn mbn">
<p id="rate_66570" onmouseover="showTip(this)" tip="感谢分享^_^&人气 + 2
" class="mtn mbn">
<p id="rate_6874" onmouseover="showTip(this)" tip="对楼主的执着,风险万分钦佩,献上微薄的分数,以表敬意&人气 + 3
" class="mtn mbn">
<p id="rate_09721" onmouseover="showTip(this)" tip="我很赞同^_^&人气 + 3
" class="mtn mbn">
<p id="rate_98415" onmouseover="showTip(this)" tip="想起来n86&人气 + 7
" class="mtn mbn">
<p id="rate_65575" onmouseover="showTip(this)" tip="&a
href=&forum.php?mod=redirect&goto=findpost&ptid=7671656&pid=&fromuid=1&&&span &楼主就是 以前塞班论坛的心雨,n86&/span&&/a&&人气 + 3
" class="mtn mbn">
<p id="rate_31933" onmouseover="showTip(this)" tip="威锋有你更精彩:)&we券 + 15
" class="mtn mbn">
<p id="rate_08698" onmouseover="showTip(this)" tip="&a
href=&forum.php?mod=redirect&goto=findpost&ptid=7671656&pid=&fromuid=1&&&span &特意过来加分的,也是我第一个关注的人!&/span&&/a&&人气 + 12
" class="mtn mbn">
<p id="rate_85367" onmouseover="showTip(this)" tip="&a
href=&forum.php?mod=redirect&goto=findpost&ptid=7671656&pid=&fromuid=1&&&span &个人一直偏爱雅黑,大赞!!&/span&&/a&&人气 + 1
" class="mtn mbn">
<p id="rate_27805" onmouseover="showTip(this)" tip="&a
href=&forum.php?mod=redirect&goto=findpost&ptid=7671656&pid=&fromuid=1&&&span &辛苦了,真的支持你了&/span&&/a&&人气 + 3
" class="mtn mbn">
<p id="rate_21575" onmouseover="showTip(this)" tip="的确,以前玩塞班的时候真的很疯狂&人气 + 1
" class="mtn mbn">
<p id="rate_60448" onmouseover="showTip(this)" tip="楼主的字体不但质量高,还热心分享制作经验,令人敬佩呀!.&人气 + 1
" class="mtn mbn">
<p id="rate_53087" onmouseover="showTip(this)" tip="&a
href=&forum.php?mod=redirect&goto=findpost&ptid=7671656&pid=&fromuid=1&&&span &精品文章^_^&/span&&/a&&人气 + 2
" class="mtn mbn">
评分次数14
终于找到楼主了,给力!
让更多人看到
感谢分享^_^
对楼主的执着,风险万分钦佩,献上微薄的分数,以表敬意
我很赞同^_^
威锋有你更精彩:)
的确,以前玩塞班的时候真的很疯狂
楼主的字体不但质量高,还热心分享制作经验,令人敬佩呀!.
附件都删除了,不要说我小气,懂点技术的都有点个性,没必要对几个陌生人大度吧?
注册时间 最后登录
在线时间4260 小时 UID
主题帖子人气
对【心雨】于 15:28:06在楼主发表的内容评分:人气:+10;
本帖最后由 【心雨】 于
15:41 编辑
前言:改字体加字符太累了,iOS7系统对字体要求真是严格,有一点点不全的地方就闪退,第一版(点此进入)同样的字库在原来的iOS5和iOS6上面都没有闪退,到了iOS7竟然会有闪退的地方。……给力,加分!
注册时间 最后登录
在线时间93 小时 UID
主题帖子人气
对【心雨】于 15:28:06在楼主发表的内容评分:人气:+3;
本帖最后由 【心雨】 于
15:41 编辑
前言:改字体加字符太累了,iOS7系统对字体要求真是严格,有一点点不全的地方就闪退,第一版(点此进入)同样的字库在原来的iOS5和iOS6上面都没有闪退,到了iOS7竟然会有闪退的地方。……shadowli0721小号,我是来加分的!
注册时间 最后登录
在线时间383 小时 UID
主题帖子人气
之前用了第一版的,微信 朋友圈闪退,现在更新了第二版,不闪退了,谢谢楼主的无私奉献,喜欢这雅黑。之前用了好多人的雅黑字体,都不是很满意,不是细就是粗,有些还是扁的,不好看,还是楼主的字体漂亮。
注册时间 最后登录
在线时间1067 小时 UID
主题帖子人气
对【心雨】于 15:28:06在楼主发表的内容评分:人气:+5;
本帖最后由 【心雨】 于
15:48 编辑
前言:改字体加字符太累了,iOS7系统对字体要求真是严格,有一点点不全的地方就闪退,第一版(点此进入)同样的字库在原来的iOS5和iOS6上面都没有闪退,到了iOS7竟然会有闪退的地方。……没人回帖子我特地来加分!~
注册时间 最后登录
在线时间177 小时 UID
主题帖子人气
还是很感觉你的努力的,我的微博闪退!!!
注册时间 最后登录
在线时间1260 小时 UID
主题帖子人气
对【心雨】于 15:28:06在楼主发表的内容评分:人气:+5;
本帖最后由 【心雨】 于
15:48 编辑
前言:改字体加字符太累了,iOS7系统对字体要求真是严格,有一点点不全的地方就闪退,第一版(点此进入)同样的字库在原来的iOS5和iOS6上面都没有闪退,到了iOS7竟然会有闪退的地方。……感谢楼主奉献,一直使用雅黑字体,大爱
注册时间 最后登录
在线时间628 小时 UID
主题帖子人气
留名备用哈哈哈
注册时间 最后登录
在线时间594 小时 UID
主题帖子人气
必须要顶的帖子!!!!!!!!!!
威锋旗下产品
Hi~我是威威!
沪公网安备 29号 | 沪ICP备号-1
新三板上市公司威锋科技(836555)
增值电信业务经营许可证:
Powered by Discuz!构造函数心得分享
&package com.ryze.struct. &
public class Struct { &
&&& public static int i = 0; &
&&& public static void main(String[] args) { &
&&&&&&& A a1 = new A(); &
&&&&&&& A a2 = new A(&瑞兹&,&啦啦啦德玛西亚&); &
&&&&&&& B b1 = new B(); &
&&&&&&& B b2 = new B(&法师&,&男&); &
class A{ &
&&& String userN &
&&& String passW &
&&& public A(){ &
&&&&&&& System.out.println(&A的无参构造函数第&+Struct.i+&次调用&+&\n&); &
&&&&&&& Struct.i++; &
&&& public A(String name,String pword){ &
&&&&&&& this.userName = &
&&&&&&& this.passWord = &
&&&&&&& System.out.println(&A的有参构造函数:\n&+&& &+&用户名:&+userName+&\n&+&&& &+&密码:& &+passWord+&\n&); &
class B extends A{ &
&&& public B(){ &
&&&&&&& System.out.println(&B的无参构造函数&+&\n&); &
&&& public B(String id,String sex){ &
&&&&&&& this.identity = &
&&&&&&& this.sex = &
&&&&&&& System.out.println(&B的有参构造函数:\n&+&&& &+&性别:&+sex+&\n&+&&& &+&身份:&+identity+&\n&); &
运行结果:
A的无参构造函数第0次调用 &
A的有参构造函数: &
& 用户名:瑞兹 &
&& 密码:& 啦啦啦德玛西亚 &
A的无参构造函数第1次调用 &
B的无参构造函数 &
A的无参构造函数第2次调用 &
B的有参构造函数: &
&& 性别:男 &
&& 身份:法师
&&&&&&& 说明了创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,因为找不到父类的默认构造函数,编译器将会报错,但如果在子类的构造函数中指定用父类的带参数的构造函数的时候,或者在父类中加一个无参数的构造函数,就不会报错。
&&&&&&& 详细说明:
&&&&&&& 1、如果程序员没有给类A提供构造函数,则编译器会自动提供一个默认的无参数的构造函数,如果用户提供了自己的构造函数,则编译器就不在提供默认的无参数构造函数。
&&&&&&& 2、子类B实例化时会自动调用父类A的默认构造函数,所以如果A的默认的无参数的构造函数为private,则编译器会报错,而如果A没有提供默认的无参数的构造函数,而提供了其他类型的构造函数,编译器同样会报错,因为B找不到A的默认无参数构造函数。所以,我们最好给父类A提供一个无参数的构造函数。
&&&&&&& 3、在B的构造函数中显示的调用父类A的有参构造函数super(parameter);
Maven开发跳过单元测试
最近做Maven项目,因为工程很庞大,每次单元测试会耗去很多时间,本着节省时间的原则,想要跳过单元测试部分,于是网上找了两种方案,分别是在 DOS环境下操作Maven和在eclipse中操作Maven。 Maven 提供了跳过单元测试的能力,只需要使用 Surefire 插件的 skip 参数。
DOS下,只要简单的给任何目标添加 maven.test.skip 属性就能跳过测试:
&&& $ mvn install -Dmaven.test.skip=true &
&&& [INFO] [compiler:testCompile] &
&&& [INFO] Not compiling test sources &
&&& [INFO] [surefire:test] &
&&& [INFO] Tests are skipped. &
当 Surefire 插件到达 test 目标的时候,如果
maven.test.skip 设置为 true ,它就会跳过单元测试。 另一种配置 Maven 跳过单元测试的方法是给你项目的 pom.xml 添加这个配置。 你需要为你的
build 添加 plugin 元素。
&project& &
& &build& &
&&& &plugins& &
&&&&& &plugin& &
&&&&&&& &groupId&org.apache.maven.plugins&/groupId& &
&&&&&&& &artifactId&maven-surefire-plugin&/artifactId& &
&&&&&&& &configuration& &
&&&&&&&&& &skip&true&/skip& &
&&&&&&& &/configuration& &
&&&&& &/plugin& &
&&& &/plugins& &
& &/build& &
&/project&
Maven打包资源配置
在pom.xml文件中配置如下:
&&& &configuration& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &outputDirectory&${staging.windows.dir}&/outputDirectory& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &resources& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &resource& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &directory&src/main/resources&/directory& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &includes& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &include&resourceName.dll&/include& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &/includes& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &/resource& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &resource& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &directory&.&/directory& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &includes& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &include&release_notes.txt&/include& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &include&configuration.md&/include& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &include&COPYING&/include& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &include&authors.txt&/include& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &/includes& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &/resource& &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &/resources& &
&&& &/configuration& &
将需要打包的文件配置在include标签中,需要打包的文件的所在目录配置在directory中。
然后配置projectName\src\main\izpack\windows\目录中的Install文件:
&&& &packs& &
&&&&& &pack name=&MultiBit& required=&yes&& &
&&&&&&& &description&MultiBit install files.&/description& &
&&&&&&& &file src=&configuration.md& targetdir=&$INSTALL_PATH&/& &
&&&&&&& &file src=&release_notes.txt& targetdir=&$INSTALL_PATH&/& &
&&&&&&& &file src=&COPYING& targetdir=&$INSTALL_PATH&/& &
&&&&&&& &file src=&authors.txt& targetdir=&$INSTALL_PATH&/& &
&&&&&&& &file src=&&span style=&font-family: Arial, Helvetica, sans-&&resourceName.dll&/span&& targetdir=&$INSTALL_PATH&/& &
&&&&& &/pack& &
&&& &/packs& &
然后配置好后生成的安装程序就会将所需打包的文件包含在内。
点击安装程序进行安装程序的时候,就会将资源重新copy进安装目录
修饰符final详解
最近又翻看了一遍Java的基础知识,发现当初自己关于修饰符final的理解就曾经迷茫过,为了帮助Java初学者更好度过迷茫期,特此献上此文(此文将重点讲解final修饰的变量,至于final修饰的类和方法,由于比较简单,就不再下面列出了)。
一、概述:
&&& final关键字可用于修饰类、变量和方法。final修饰变量时,表示该变量一旦获得了初始值就不可被改变(可以赋初值,但是不可以被改变),final既可以修饰成员变量(包括类变量和实例变量),也可以修饰局部变量、形参。
二、final成员变量:
1) 类变量:
final修饰类变量,要么在定义该类变量时指定初始值;要么在静态初始化块中指定初始值。
&&& /*正确代码演示*/ &
&&& public class FinalClassTest{ &
&&&&&&& final static int a=210;//在定义该类变量时指定初始值; &
&&&&&&& static{ &
&&&&&&&&&&& b=211;//在静态初始化块中指定初始值; &
&&&&&&& } &
&&& /*错误代码演示*/ &
&&& public class FinalClassErrorTest{ &
&&&&&&& final static int aa=110; &
&&&&&&& //系统不会为final成员变量(类变量和实例变量)进行隐形初始化;而此类变量既没有在定义时指定初始值,又没有在静态初始化块中指定初始值,所以非法。 &
&&&&&&& static{ &
&&&&&&&&&&& aa=111;//类变量已经定义了初始值,不能再次赋值,因此此语句非法; &
&&&&&&& } &
&&&&&&& public void finalClassChange(){ &
&&&&&&&&&&& bb=112;//在普通方法中为类变量赋值,因此此语句非法; &
&&&&&&& } &
2) 实例变量:
final修饰实例变量,要么在定义该实例变量时指定初始值;要么在普通初始化块中指定初始值;要么在构造器中指定初始值。
&&& /*正确代码演示*/ &
&&& public class FinalInstanceTest{ &
&&&&&&& final int c=310;//在定义该实例变量时指定初始值; &
&&&&&&& { &
&&&&&&&&&&& d=311;//在普通初始化块中指定初始值; &
&&&&&&& } &
&&&&&&&& &
&&&&&&& public FinalInstanceTest(){ &
&&&&&&&&&&& e=312;//在构造器中指定初始值; &
&&&&&&& } &
&&& /*错误代码演示*/ &
&&& public class FinalInstanceErrorTest{ &
&&&&&&& final int cc=410; &
&&& //系统不会为final成员变量(类变量和实例变量)进行隐形初始化;而此实例变量既没有在定义时指定初始值,又没有在普通初始化块中指定初始值,又没有在构造器中赋值,所以非法。 &
&&&&&&& { &
&&&&&&&&&&& cc=411;//实例变量已经定义了初始值,不能再次赋值,因此此语句非法; &
&&&&&&& } &
&&&&&&& public void finalInstanceChange(){ &
&&&&&&&&&&& dd=412;//在普通方法中为实例变量赋值,因此此语句非法; &
&&&&&&& } &
&&&&&&& public FinalInstanceErrorTest(){ &
&&&&&&& } &
三、final局部变量:
系统不会对局部变量进行隐形初始化,需要程序员显性初始化。
&&& public class FinalLocalTest{ &
&&&&&&& public void invokTest(final int f){ &
&&&&&&&&&&& f=510;//对final修饰的形参变量赋值,非法; &
&&&&&&&&&&& //该方法被调用时,由系统根据传入的参数来对形参完成初始化; &
&&&&&&& } &
&&&&&&& public void mainTest(){ &
&&&&&&&&&&& final int g=511;//定义final变量时指定初始值,合法; &
&&&&&&&&&&& &
&&&&&&&&&&& h=512;//第一次赋初始值,合法; &
&&&&&&& } &
四、final修饰基本类型变量和引用类型变量的区别:
final修饰基本类型变量时,不能对基本类型变量重新赋值;对于引用类型而言,它保存的只是一个引用,final只保证这个引用类型变量所引用的地址不变,即一直引用同一个对象,但是这个对象的成员可以改变;
&&& class Student{ &
&&&&&&& public Student(int age){ &
&&&&&&&&&&& this.age= &
&&&&&&& } &
&&&&&&& //此处省略age的setter和getter方法; &
&&& public class FinalReferenceTest{ &
&&&&&&& public static void main(String[]& args){ &
&&&&&&&&&&& //final修饰数组变量,iArray是一个引用变量; &
&&&&&&&&&&& final int[] iArray={5,6,7,8}; &
&&&&&&&&&&& Arrays.sort(iArray);//对数组元素进行排序,合法; &
&&&&&&&&&&& iArray[3]=9;//对数组元素赋值,合法; &
&&&&&&&&&&& iArray=//对iArray重新赋值,非法; &
&&&&&&&&&&& final Student st=new Student(21); &
&&&&&&&&&&& st.setAge(23);//改变Student对象的age实例变量,合法; &
&&&&&&&&&&& st=//对st重新赋值,非法; &
&&&&&&& } &
五、可执行&宏替换&的final变量:
对于一个final变量而言,不管是类变量、实例变量还是局部变量,只要该变量满足以下三条,则final变量就不再是一个变量,而是相当于是一个直接值:
1、使用final修饰符修饰;
2、在定义该final变量时指定了初始值;
3、该初始值可以在编译时就确定下来。
&&& public class MacroFinalTest{ &
&&&&&&& public static void main(String[] args){ &
&&&&&&&&&&& final String domainName=&&; &
&&&&&&&&&&& final String domain=&pplns&+&.com&; &
&&&&&&&&&&& System.out.println(domainName==domain);//返回值为 &
&&&&&&&&&&& final String domainPrefix=&pplns&; &
&&&&&&&&&&& final String domainSuffix=&.com&; &
&&&&&&&&&&& final String myDomain=domainPrefix+domainS &
&&&&&&&&&&& System.out.println(domainName==myDomain);//返回值为 &
&&&&&&& } &
&&& public class MacroTest{& &
&&&&&&& public static void main(String[] args){& &
&&&&&&&&&&& String domainName=&&;& &
&&&&&&&&&&& String domain=&pplns&+&.com&;& &
&&&&&&&&&&& System.out.println(domainName==domain);//返回值为 &
&&&&&&&&&&& String domainPrefix=&pplns&;& &
&&&&&&&&&&& String domainSuffix=&.com&;& &
&&&&&&&&&&& String myDomain=domainPrefix+domainS& &
&&&&&&&&&&& System.out.println(domainName==myDomain);//返回值为 &
&&&&&&& } &
以上特意用final修饰的变量和无final修饰的变量进行对比,从而发现不同之处。
Java通过一个常量池来管理曾经用过的字符串常量,例如执行String domain=&&;语句之后,常量池中就缓存了一个字符串&&;如果程序再执行String domainName=&&;,系统将会让domainName直接指向常量池中&pplns&字符串,因此domain==domainName将返回true;但是在上例MacroTest类中,myDomain是由两个变量拼接而成,而变量在编译期间是不会确定下来,只有在运行期间才会确定下来,所以domainName==myDomain返回的是而在上例MacroFinalTest类中,domainPrefix和domainSuffix是由final修饰的变量,所以这两个变量在编译期间就会当作&宏变量&,即常量来处理,所以myDomain在编译期间实际是由&pplns&和&.com&拼接而成,所以domainName==myDomain返回的是true。
Collection接口
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。JavaSDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的&子接口&如List和Set。
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
&&& Iterator it = collection.iterator(); // 获得一个迭代子&& &
&&& while(it.hasNext())&&& &
&&& Object obj = it.next(); // 得到下一个元素&& &
由Collection接口派生的两个接口是List和Set。
&&& Collection&& &
&&& ├List&& &
&&& │├LinkedList&& &
&&& │├ArrayList&& &
&&& │└Vector&& &
&&& │ └Stack&& &
&&& └Set& &
1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
&&&&&&& import java.util.ArrayL&& &
&&&&&&& import java.util.C&& &
&&&&&&& import java.util.L&& &
&&&&&&&&&& &
&&&&&&& public class TestCollections {&& &
&&&&&&&&&&&&&& &
&&&&&&&&&&& public static void main(String args[]) {&& &
&&&&&&&&&&&&&&&&&&&&&& //注意List是实现Collection接口的&& &
&&&&&&&&&&&&&&& List list = new ArrayList();&& &
&&&&&&&&&&&&&&& int array[] = { 6, 8, 23, 1, 7 };&& &
&&&&&&&&&&&&&&& for (int i = 0; i & array. i++) {&& &
&&&&&&&&&&&&&&&&&&& list.add(array[i]);&& &
&&&&&&&&&&&&&&& }&& &
&&&&&&&&&&&&&&& Collections.sort(list);&& &
&&&&&&&&&&&&&&& for (int i = 0; i & array. i++) {&& &
&&&&&&&&&&&&&&&&&&& System.out.println(list.get(i));&& &
&&&&&&&&&&&&&&& }&&& &
&&&&&&&&&&& }&& &
&&&&&&& }&& &
&&& 结果: &
LinkedList
Java.util.LinkedList是双向链表。
LinkedList的两个remove方法,remove(Object)和remove(int)的时间复杂度都是O(n),在链表元素很多 并且没有索引可用的情况下,LinkedList也并不适合做随机增删元素。在对性能特别敏感的场景下,还是需要自己实现专用的双向链表结构,真正实现 O(1)级别的随机增删。更进一步,jdk5引入的ConcurrentLinkedQueue是一个非阻塞的线程安全的双向队列实现。
理论上说,双向链表的删除的时间复杂度是O(1),你只需要将要删除的节点的前节点和后节点相连,然后将要删除的节点的前节点和后节点置为null即可:
&&& //伪代码 &
&&&&& node.prev.next=node. &
&&&&& node.next.prev=node. &
&&&&& node.prev=node.next= &
ArrayList和LinkedList的区 别之在什么场景下用:
大家都会说LinkedList随机增删多的场景比较合适,而ArrayList的随机访问多的场景比较合适。
byte与十六进制字符串之间互转
byte,字节类型,占用8bit空间,可用8位2进制数表示;十六进制,每位占有4bit空间,可用4位2进制数表示。
我们可以把每个byte类型转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果。
即byte用十六进制表示只占2位。
同理,相反的转换也是将两个16进制字符转换成一个byte。
根据以上原理,我们就可以将byte[] 数组转换为16进制字符串了,当然也可以将16进制字符串转换为byte[]数组了。
&&&& * Convert byte[] to hex string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。&&& &
&&&& * @param src byte[] data&&& &
&&&& * @return hex string&&& &
&&&& */&&&&&& &
&&& public static String bytesToHexString(byte[] src){&&& &
&&&&&&& StringBuilder stringBuilder = new StringBuilder(&&);&&& &
&&&&&&& if (src == null || src.length &= 0) {&&& &
&&&&&&&&&&&&&& &
&&&&&&& }&&& &
&&&&&&& for (int i = 0; i & src. i++) {&&& &
&&&&&&&&&&& int v = src[i] & 0xFF;&&& &
&&&&&&&&&&& String hv = Integer.toHexString(v);&&& &
&&&&&&&&&&& if (hv.length() & 2) {&&& &
&&&&&&&&&&&&&&& stringBuilder.append(0);&&& &
&&&&&&&&&&& }&&& &
&&&&&&&&&&& stringBuilder.append(hv);&&& &
&&&&&&& }&&& &
&&&&&&& return stringBuilder.toString();&&& &
&&& /**& &
&&&& * Convert hex string to byte[]& &
&&&& * @param hexString the hex string& &
&&&& * @return byte[]& &
&&&& */&& &
&&& public static byte[] hexStringToBytes(String hexString) {&&& &
&&&&&&& if (hexString == null || hexString.equals(&&)) {&&& &
&&&&&&&&&&&&&& &
&&&&&&& }&&& &
&&&&&&& hexString = hexString.toUpperCase();&&& &
&&&&&&& int length = hexString.length() / 2;&&& &
&&&&&&& char[] hexChars = hexString.toCharArray();&&& &
&&&&&&& byte[] d = new byte[length];&&& &
&&&&&&& for (int i = 0; i & i++) {&&& &
&&&&&&&&&&& int pos = i * 2;&&& &
&&&&&&&&&&& d[i] = (byte) (charToByte(hexChars[pos]) && 4 | charToByte(hexChars[pos + 1]));&&& &
&&&&&&& }&&& &
&&&&&&&&&& &
&&& /**& &
&&&& * Convert char to byte& &
&&&& * @param c char& &
&&&& * @return byte& &
&&&& */&& &
&&&& private byte charToByte(char c) {&&& &
&&&&&&& return (byte) &ABCDEF&.indexOf(c);&&& &
&&& //将指定byte数组以16进制的形式打印到控制台&&& &
&&& public static void printHexString( byte[] b) {&&&&& &
&&&&&& for (int i = 0; i & b. i++) {&&&& &
&&&&&&&& String hex = Integer.toHexString(b[i] & 0xFF);&&&& &
&&&&&&&& if (hex.length() == 1) {&&&& &
&&&&&&&&&& hex = &#39;0&#39; +&&&& &
&&&&&&&& }&&&& &
&&&&&&&& System.out.print(hex.toUpperCase() );&&&& &
&&&&&& }&&&& &
java中byte转换int时为何与0xff进行与运算
在剖析该问题前请看如下代码
&&& public static String bytes2HexString(byte[] b) {&&& &
&&&&& String ret = &&;&&& &
&&&&& for (int i = 0; i & b. i++) {&&& &
&&&&&& String hex = Integer.toHexString(b[ i ] & 0xFF);&&& &
&&&&&& if (hex.length() == 1) {&&& &
&&&&&&& hex = &#39;0&#39; +&&& &
&&&&&& }&&& &
&&&&&& ret += hex.toUpperCase();&&& &
&&&&& }&&& &
&&&&&&&& &
上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[ i ] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的。
其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式
在这里先温习下计算机基础理论:
byte是一个字节保存的,有8个位,即8个0、1。
8位的第一个位是符号位,
也就是说代表的是数字1
代表的就是-1
所以正数最大位,也就是数字127
负数最大为,也就是数字-128
上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码:
&&&&&&& 一个数如果是正,则它的反码与原码相同;
&&&&&&& 一个数如果是负,则符号位为1,其余各位是对原码取反;
2、补码:利用溢出,我们可以将减法变成加法
&&&&&& 对于十进制数,从9得到5可用减法:
&&&&&& 9-4=5&&& 因为4+6=10,我们可以将6作为4的补数
&&&&&& 改写为加法:
&&&&&& 9+6=15(去掉高位1,也就是减10)得到5.
&&&&&& 对于十六进制数,从c到5可用减法:
&&&&&& c-7=5&&& 因为7+9=16 将9作为7的补数
&&&&&& 改写为加法:
&&&&&& c+9=15(去掉高位1,也就是减16)得到5.
&&& 在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(),进位1被丢弃。
&&& ⑴一个数为正,则它的原码、反码、补码相同
&&& ⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1
- 1的原码为&&&&&&&&&&&&&&&
- 1的反码为&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& + 1
- 1的补码为&&&&&&&&&&&&&&&
0的原码为&&&&&&&&&&&&&&&&
0的反码为&&&&&&&&&&&&&&&& (正零和负零的反码相同)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& +1
0的补码为&&&&&&&&&&&&&& (舍掉打头的1,正零和负零的补码相同)
Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
例如补码的十进制数为-1转换为int时变为好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。
和0xff相与后,高24比特就会被清0了,结果就对了。
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。
而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。
Mysql中varchar类型总结
今天新做一个项目,需要自己进行数据库设计,发现自己对varchar的用法还不是很熟悉,所以查阅资料总结若下:
1.varchar类型的变化
MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,这样就能有效的减少数据库文 件的大小。
MySQL 数据库的varchar类型在4.1以下的版本中,nvarchar(存储的是Unicode数据类型的字符)不管是一个字符还是一个汉字,都存为2个字节 ,一般用作中文或者其他语言输入,这样不容易乱码 ;varchar: 汉字是2个字节,其他字符存为1个字节 ,varchar适合输入英文和数字。
4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 ;varchar(20)在Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同,具体有以下规则:
a) 存储限制
varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。
b) 编码长度限制
字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。
c) 行长度限制
导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示
ERROR ): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。
2.CHAR(M), VARCHAR(M)不同之处
CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。
VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么&+1&呢?这一个字节用于保存实际使用了多大的长度。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。
CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录字符串长度的字节(如果超过255则需要两个字节)。如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。
3. VARCHAR和TEXT、BlOB类型的区别
VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度 ,加上1个字节以记录字符串的长度。对于字符串&#39;abcd&#39;,L是4而存储要求是5个字节。
BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR需要定义大小,有65535字节的最大限制;TEXT则不需要。如果你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。
一个BLOB是一个能保存可变数量的数据的二进制的大对象。4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不同。
BLOB 可以储存图片,TEXT不行,TEXT只能储存纯文本文件。4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于4个BLOB类型,并且有同样的最大长度和存储需求。在BLOB和TEXT类型之间的唯一差别是对BLOB值的排序和比较以大小写敏感方式执行,而对TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB。
4.char,varchar,text区别
长度的区别,char范围是0~255,varchar最长是64k,但是注意这里的64k是整个row的长度,要考虑到其它的column,还有如果存在not null的时候也会占用一位,对不同的字符集,有效长度还不一样,比如utf8的,最多21845,还要除去别的column,但是varchar在一般情况下存储都够用了。如果遇到了大文本,考虑使用text,最大能到4G。
效率来说基本是char&varchar&text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替char
char和varchar可以有默认值,text不能指定默认值
数据库选择合适的数据类型存储还是很有必要的,对性能有一定影响。这里在零碎记录两笔,对于int类型的,如果不需要存取负值,最好加上unsigned;对于经常出现在where语句中的字段,考虑加索引,整形的尤其适合加索引。
5.varchar(10)和varchar(100)的区别
一般初学会认为,二者占用的空间是一样的。比如说我存储5个char,二者都是实际占用了5个char了【勘误:varchar在实际存储的时候会多一个byte用来存放长度】。
但是深入一下,设计数据库的时候,二者一样吗?
答案是否定的【至少varchar类型需要在数据之前利用一个或者两个字节来存储数据的长度】【二者在内存中的操作方式也是不同的,下面的例子中有体现】。
如现在用户需要存储一个地址信息。根据评估,只要使用100个字符就可以了。但是有些数据库管理员会认为,反正Varchar数据类型是根据实际的需要来分配长度的。还不如给其大一点的呢。为此他们可能会为这个字段一次性分配200个字符的存储空间。这VARCHAR(100)与VARCHAR(200)真的相同吗?结果是否定的。虽然他们用来存储90个字符的数据,其存储空间相同。但是对于内存的消耗是不同的。对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其时使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即200个字符空间。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。解释可以参见这里。所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配VARCHAR数据类型时仍然不能够太过于慷慨。还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际长度来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度。
6.char的利弊
1)、从碎片角度进行考虑,使用CHAR字符型时,由于存储空间都是一次性分配的。为此某个字段的内容,其都是存储在一起的。单从这个角度来讲,其不存在碎片的困扰。而可变长度的字符数据类型,其存储的长度是可变的。当其更改前后数据长度不一致时,就不可避免的会出现碎片的问题。故使用可变长度的字符型数据时,数据库管理员要时不时的对碎片进行整理。如执行数据库导出导入作业,来消除碎片。
2)、考虑其长度的是否相近,如果某个字段其长度虽然比较长,但是其长度总是近似的,如一般在90个到100个字符之间,甚至是相同的长度。此时比较适合采用CHAR字符类型。比较典型的应用就是MD5哈希值。当利用MD5哈希值来存储用户密码时,就非常使用采用CHAR字符类型。因为其长度是相同的。另外,像用来存储用户的身份证号码等等,一般也建议使用CHAR类型的数据。
另外请大家考虑一个问题,CHAR(1)与VARCHAR(1)两这个定义,会有什么区别呢?虽然这两个都只能够用来保存单个的字符,但是VARCHAR要比CHAR多占用一个存储位置。这主要是因为使用VARCHAR数据类型时,会多用1个字节用来存储长度信息。这个管理上的开销char字符类型是没有的。
3)、二者在磁盘上存储占的空间是一样的。区别有二。第一、一个变长一个固定长度。第二、在内存中的操作方式,varchar也是按照最长的方式在内存中进行操作的。比如说要进行排序的时候,varcahr(100)是按照100这个长度来进行的。
4)、mysql的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533(不允许非空字段的时候),当允许非空字段的时候只能到65532【在允许空的时候,varchar(65532) will be 2 bytes (length) + up to 65532 chars (latin1) + 1 null byte】
5)、请注意所有MySQL校对规则属于PADSPACE类。这说明在MySQL中的所有CHAR和VARCHAR值比较时不需要考虑任何尾部空格。请注意所有MySQL版本均如此,并且它不受SQL服务器模式的影响。如果在一个char或者varchar列上建立唯一索引之后,那么&#39;a&#39;和&#39;a &#39;,会引起duplicate-key error。
检测主机是否在线Ping
&&& 最近想写个程序,检测一下远程主机是否在线,于是在网上找到了很多前辈的方法,现在总结一下,分享给大家,希望能够抛砖引玉:
&&& 方法一:利用Java.net包中的类InetAddress中的getByAddress()方法:
&&& 函数原型: &
&&& public static InetAddress getByAddress(byte[] addr) throws UnknownHostException &
&&& public boolean isReachable(int timeout) throws IOException &
&& &注释:Test whether that address is reachable.
&&& 源码: &
&&& package com.ryze.ping. &
&&& import java.io.IOE &
&&& import java.net.InetA &
&&& import java.net.UnknownHostE &
&&& public class PingTest { &
&&&&&&& public static void main(String[] args) throws UnknownHostException, IOException { &
&&&&&&&&&&& InetA &
&&&&&&&&&&& inet = InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }); &
&&&&&&&&&&& System.out.println(&Sending Ping Request to & + inet); &
&&&&&&&&&&& System.out.println(inet.isReachable(5000) ? &Host is reachable& : &Host is NOT reachable&); &
&&&&&&&&&&& inet = InetAddress.getByAddress(new byte[] { (byte) 220, (byte) 181, 112, (byte)244 }); &
&&&&&&&&&&& System.out.println(&Sending Ping Request to & + inet); &
&&&&&&&&&&& System.out.println(inet.isReachable(5000) ? &Host is reachable& : &Host is NOT reachable&); &
&&&&&&& } &
&&& 运行结果: &
&&& Sending Ping Request to /127.0.0.1 &
&&& Host is reachable &
&&& Sending Ping Request to /220.181.112.244 &
&&& Host is NOT reachable &
&&& 方法二:利用java.net包中的类InetAddress中的getByName()方法:
&&& 函数原型: &
&&& public static InetAddress getByName(String host) throws UnknownHostException &
&&& 源码: &
&&& package com.ryze.ping. &
&&& import java.io.IOE &
&&& import java.net.InetA &
&&& import java.net.UnknownHostE &
&&& public class PingTest { &
&&&&&&& public static void main(String[] args) throws UnknownHostException, IOException { &
&&&&&&&&&&& String ipAddress = &127.0.0.1&; &
&&&&&&&&&&& InetAddress inet = InetAddress.getByName(ipAddress); &
&&&&&&&&&&& System.out.println(&Sending Ping Request to & + ipAddress); &
&&&&&&&&&&& System.out.println(inet.isReachable(5000) ? &Host is reachable& : &Host is NOT reachable&); &
&&&&&&&&&&& ipAddress = &220.181.112.244&; &
&&&&&&&&&&& inet = InetAddress.getByName(ipAddress); &
&&&&&&&&&&& System.out.println(&Sending Ping Request to & + ipAddress); &
&&&&&&&&&&& System.out.println(inet.isReachable(5000) ? &Host is reachable& : &Host is NOT reachable&); &
&&&&&&& } &
&&& 运行结果: &
&&& Sending Ping Request to 127.0.0.1 &
&&& Host is reachable &
&&& Sending Ping Request to 220.181.112.244 &
&&& Host is NOT reachable &
&&& 方法三:利用java.lang包中的类Runtime中的getRuntime()方法:
&&& 函数原型: &
&&& public static Runtime getRuntime() &
&& &注释:returns the runtime object associated with the current Java application.
&&& 函数原型: &
&&& public Process exec(String command)& throws IOException &
&& &注释:Executes the specified string command in a separate process.
&&& 函数原型: &
&&& public abstract int waitFor() throws InterruptedException &
&& &注释:the exit value of the subprocess represented by this Process object. By convention, the value 0 indicates normal termination.
&&& 源码: &
&&& package com.ryze.ping. &
&&& public class PingTest { &
&&&&&&& public static void main(String[] args) { &
&&&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&& boolean reachable = &
&&&&&&&&&&& P &
&&&&&&&&&&& try { &
&&&&&&&&&&&&&&& String ipAddress = &127.0.0.1&; &
&&&&&&&&&&&&&&& process = Runtime.getRuntime().exec(&ping & + ipAddress); &
&&&&&&&&&&&&&&& int returnVal = process.waitFor(); &
&&&&&&&&&&&&&&& reachable = returnVal == 0?true: &
&&&&&&&&&&&&&&& System.out.println(&Sending Ping Request to & + ipAddress); &
&&&&&&&&&&&&&&& System.out.println(reachable ? &Host is reachable& : &Host is NOT reachable&); &
&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&& ipAddress = &220.181.112.244&; &
&&&&&&&&&&&&&&& process = Runtime.getRuntime().exec(&ping & + ipAddress); &
&&&&&&&&&&&&&&& returnVal = process.waitFor(); &
&&&&&&&&&&&&&&& reachable = returnVal == 0?true: &
&&&&&&&&&&&&&&& System.out.println(&Sending Ping Request to & + ipAddress); &
&&&&&&&&&&&&&&& System.out.println(reachable ? &Host is reachable& : &Host is NOT reachable&); &
&&&&&&&&&&& } catch (Exception ex) { &
&&&&&&&&&&&&&&& ex.printStackTrace(); &
&&&&&&&&&&& } &
&&&&&&& } &
&&& 运行结果: &
&&& Sending Ping Request to 127.0.0.1 &
&&& Host is reachable &
&&& Sending Ping Request to 220.181.112.244 &
&&& Host is reachable &
&&& 小结:通过google搜索加上自己亲自实验,发现前两种方法只能ping通局域网内的Ip,对于外网的ip一般ping不通,第三种方法我的理解是相当于在本地DOS环境下进行ping,能ping通外网,但是每ping一次效率很低。
eclipse中JDK源码查看
用eclipse工具开发项目时,时常按住Ctrl+鼠标左键点击一个类,返回的却是无法追踪类的源码的提示:
步骤一:在Java代码中按住Ctrl + 鼠标左键追逐某个Java内部类,出现如图所示:
步骤二:单击Change Attached Source,选择JDK安装所在的目录下src.zip,如下图所示:
步骤三:再次追踪某个Java类,将会追踪进Java源码内部。
希望以上信息对学习Java的童鞋们有一定帮助!
The developer's favorite

我要回帖

更多关于 天 1 3 7 9 13 17 的文章

 

随机推荐