java中值与引用问题的简单笔记

java中传值与传引用的问题由来已久,今天上网无意中又发现了这个问题的讨论,于是自己也复习了一下,想想还是整理一下思路,记下来供概念还有些模糊的童鞋参考参考。

关于值与引用的问题,最直观的可以用一段代码来表示:

public class Test {
    public static void main(String[] args) {
        String a = new String("hello");
        String b = new String("hello");
        if(a==b) System.out.println("true");
        else System.out.println("false");
    }
}

这段代码返回的是“flase”,显然可以看出来:比较(==)两个String数据的时候,并不是比较的两个数据的“值”,而是比较两个数据的“引用”是否指向同一个对象

PS.进行“比较”,也就是“==”的时候,
如果比较的是两个基本数据类型(char,byte,short,int,long,float,double,boolean),则是判断它们的值是否相等。
如果比较的不是两个基本数据类型,而是两个对象变量,则是判断它们的引用是否指向同一个对象,也就是看引用地址是否一致。

引申一下:java的基本数据类型都是传“值”的,其他的则是传“引用” (“引用”指的是内存里保存这个“值”的地址标识,本质上还是一个“值”)

所谓的“值”指的是内存里的数据值,这里是“hello”;而“引用”指的是内存里这个数据值的地址。这段代码里a与b是分别实例化的,在内存里的地址显然是不同,所以比较的结果就是“false”。

========================

这边偏一下题:创建String对象除了new,常用还有通过引号来创建,比如

public class Test {
    public static void main(String[] args) {
        String a = "hello";
        String b = "hello";
        if(a==b) System.out.println("true");
        else System.out.println("false");
    }
}

这中情况下返回的是“true”!这个就与JAVA虚拟机(JVM)中的字符串池有关系了。字符串池里的String对象是可以被共享使用的,因此它提高了效率。并且由于String类是final的,它的值一经创建就不可改变,因此不会因为String对象共享而带来程序的混乱。

当执行String a = "hello";的时候,JVM首先在字符串池中查找是否已经存在了值为"hello"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果字符串池中已经存在,则不再创建新的对象,直接返回已存在对象的引用;如果不存在,则先创建这个值为“hello”的对象,再把这个对象加入到字符串池中,最后将这个对象的引用返回。

因此,在这段程序中,执行String a= "hello";的时候,由于字符串池中不存在“hello”,程序创建了一个新的对象“hello”,保存到池里,并把这个对象的引用地址返回;当执行String b = "hello";的时候,由于字符串池中已经存在了刚刚创建的“hello”对象,所以直接获得了这个hello对象的引用地址,并赋值给了b。

所以这个时候,a跟b进行比较的时候,a跟b的引用地址是一样的(都是执行String a= "hello";的时候返回的那个引用地址),所以最终的比较结果是“true”。

========================

回到正题:再来看一段简单的代码

阅读剩余部分 -

12306,买票买出中彩的感觉

今天帮人抢票,果断没抢到……话说明明排队还有票,排完尼玛就提示没票了是搞哪样……

后来随便查询查询,刷新刷新……突然有提示有了2张票,果断下手,哇哈哈,感谢那两位退票的哥们……

感觉就跟中了彩票一样……

12306.png

playframework2.0控制页面时间显示格式

这两天被play的时间显示搞的欲仙欲死,直接在页面上

@person.addDate

显示出来的时间格式是

Sat Jan 05 08:00:23 CST 2013

显然太坑爹,太不友好了嘛。于是google之,希望找到时间格式转换显示的方法,找不到啊找不到……
后来想起play不是自带几个例子嘛,翻了翻……果然找到了……

<time datetime="@person.addDate">@person.addDate.format("MMM dd yyyy")</time>

坑啊~~只要在页面上需要显示时间的地方这么写就可以转换格式显示了,至于什么格式,那就随便自己定义了……

这个显示出来的就是

一月 05 2013

看来官方文档和例子才是王道啊~~google浪费好多时间,下次记得直接翻官方例子……

一个简单有效的去除电信不断给你推送弹出广告的方法--投诉

电信这几天疯狂地给我推送广告,具体表现就是平均每打开5-10个网页就会在右下角弹出富有电信特色的蓝框小广告,偶尔还会来个大的弹窗。

其实这种推送广告从入网至今一直没有间断,或多或少基本每天都有。上个月被广告烦了好几天之后,实在受不了了,打电话到10000(一万号)找客服投诉,客服不知道是不了解这个推送广告呢还是揣着明白装糊涂,跟我一通扯皮,硬说我说的问题是电信的114导航问题(应该不少人都发现网页输错网址什么的都会跳到114导航网站),说可以帮我把114导航关了,然后发来一个网址,我一上,根据提示信息看应该是不再往我机子上写cookie……

扯皮无果,想想也解决了一个额外的问题,算了,忍忍吧……(后来实际证明那个114导航压根没禁掉,输错网址什么的情况下依旧跳过去了)

一个月过去了,恰逢iPhone5上市跟淘宝1212,电信广告弹的那叫一个欢快,忍无可忍,只好动用终极手段了“工信部投诉”

忍无可忍,无需再忍,直接进入http://www.chinatcc.gov.cn:8080/cmsadmin/shouli/shensu.jsp,填写投诉表格。

最后提交发现提交没反应,正纠结呢,突然看到顶部有行红色滚动信息,说是表单无法提交的可以通过邮件投诉。于是直接复制了下表单内容,一封邮件发了过去。

真心赞一下工信部的效率,我长这么大第一次遇到这么高效的政府部门……

第一天晚上发的投诉邮件,第二天下午杭州当地电信就打电话过来了解问题,要了我的上网帐号;然后第三天早上又有个电话来说已经给我屏蔽了广告的推送;第四天的时候北京电信又打电话来(估计是总部了是工信部)说投诉已经受理解决……

OK,至此问题圆满解决,再配合Chrome的AdBlock插件……上网清净了……

PS.吐槽下北京电信总部的电话客服服务态度:语速极快,吐字不清,态度就跟你欠了她1000块钱一样(好吧,投诉好像不比被欠钱让人愉快,我表示理解),很不耐烦的说完一通形式性的东西,大意就是投诉已处理完毕,这个投诉以后不会再处理了……看在问题解决的份上,我忍住了要她的工号再投诉她的冲动,直接把电话给挂了……

我查了下电话号码,原来是工信部的,不是电信的客服,看来错怪电信客服了,抱歉抱歉,以后一定时刻记得“没有调查就没有发言权”这句话,恩……尤其是吐槽的时候……至少杭州这边的电信客服都很有礼貌很有耐心的。唉,对工信部的好印象大打折扣……还是那句话,看在确实解决了问题的情况下,无视吧

PPS.如果你也被运营商劫持DNS,强制弹广告,直接投诉吧,高效不扯皮!!还能体验一下被消费者权益保护法保护的感觉!!!

playframework2.0的简单配置

这两天试用了下playframework2.0的框架,感觉良好,把简单的配置过程记下来,聊做备忘。
其实play框架的主页上有基本的配置,我就简单的照本宣科,整合一下

1.配置PATH

官方地址:传送门

对于mac来说,修改.bash_profile文件,增加一个定义就可以了

$ nano .bash_profile
增加
# Setting PATH for Play framework
PATH="/Users/eric/study/java/play-2.0.4:${PATH}"
export PATH

后保存(注意换成自己的路径)

这样就可以直接在终端输入“play”来进行相关操作
play1.png



阅读剩余部分 -

mac截图快捷键

我会告诉你在这之前我都是先打开“预览”,然后再通过点击来选择截图功能的?

1. Command-Shift-3: 将整个屏幕拍下并保存到桌面。

2. Command-Shift-Control-3:将整个屏幕拍下并保存到剪贴板(Clipboard),然后Command+V直接粘贴到如Photoshop,ppt等软件中编辑。

3. Command-Shift-4:将屏幕的一部分拍下并保存到桌面。按下这个组合键后,光标会变为一个十字,你可以拖拉来选取拍摄区域。

4. Command-Shift-Control-4:将屏幕的一部分拍下并保存到剪贴板。

5. Command-Shift-4再按空格键:这时光标会变为一个照相机图标,点击可拍下当前窗口或菜单或Dock以及图标等,只要将照相机图标移动到不同区域(有效区域会显示为浅蓝色)点击。

6. Command-Shift-Control-4再按空格键:将选取的窗口或其他区域的快照保存到剪贴板。

阅读剩余部分 -

简单的IE css hacker备忘

IE的css hacker是个老问题了,网上方案也很多,从IE6-9都有专门的识别标识,不过主要用的还是这么几个(*星号,_下划线,!important标志),简单记录下,等有时候概念模糊了随时复习……

表中 √ 表示浏览器能识别; × 表示浏览器不能识别;

  IE6 IE7 Chrome,FF
* ×
_ × ×
!important ×


此外,写css的时候把高级浏览器的样式写在前面,IE的写后面(“后来居上”原则)
比如说

width:100px;*width:80px;_width:60px;

java将doc文件转换为pdf文件的三种方法

项目要用到doc转pdf的功能,一番google之后总结出了三种方法(免费方案),于是一一试了一下,做个总结记录,下次要用直接查,省的忘了……

方法1.poi读取doc + itext生成pdf (实现最方便,效果最差,跨平台)

方法2.jodconverter + openOffice (一般格式实现效果还行,复杂格式容易有错位,跨平台)

方法3.jacob + msOfficeWord + SaveAsPDFandXPS (完美保持原doc格式,效率最慢,只能在windows环境下进行)

方法1:使用jdoctopdf来实现,这是一个封装好的包,可以把doc转换成pdf,html,xml等格式,调用很方便
地址:http://www.maxstocker.com/jdoctopdf/downloads.php(项目不维护了,官网也没了)
需要自己导入poi包与itext包,需要注意的是itext要导入itext-2.1.5版本,新版本由于包名不同,会出错
也可以自己根据网上的其他教程根据需要自己写方法来实现。
用jdoctopdf的实现方法如下:





阅读剩余部分 -

20条数据库最佳设计实践

  1. 使用明确、统一的标明和列名,例如 School, SchoolCourse, CourceID。
  2. 数据表名使用单数而不是复数,例如 StudentCourse,而不是StudentCourses。
  3. 数据表名不要使用空格。
  4. 数据表名不要使用不必要的前缀或者后缀,例如使用School,而不是TblSchool,或者SchoolTable等等。
  5. 数据库中的密码要加密,到应用中再解密。 (其实就是散列存储、单向加密)
  6. 使用整数作为ID字段,也许现在没有这个必要,但是将来需要,例如关联表,索引等等。
  7. 使用整数字段做索引,否则会带来很大的性能问题 。
  8. 使用 bit 作为布尔字段,使用整数或者varcha是浪费。同时,这类字段应该以“Is”开头。
  9. 要经过认证才能访问数据库,不要给每一个用户管理员权限。
  10. 尽量避免使用“select *”,而使用“select [required_column_list]”以获得更好的性能。
  11. 假如程序代码比较复杂,使用ORM框架,例如hibernate,iBatis。ORM框架的性能问题可以通过详细的配置去解决。
  12. 分割不常使用的数据表到不同的物理存储以获得更好的性能。
  13. 对于关键数据库,使用安全备份系统,例如集群,同步等等。
  14. 使用外键,非空等限制来保证数据的完整性,不要把所有的东西都扔给程序。
  15. 缺乏数据库文档是致命的。你应该为你的数据库设计写文档,包括触发器、存储过程和其他脚本。
  16. 对于经常使用的查询和大型数据表,要使用索引。数据分析工具可以帮助你决定如何建立索引。
  17. 数据库服务器和网页服务器应该放在不同的机器上。这回提高安全性,并减轻CPU压力。
  18. Image和blob字段不应该定义在常用的数据表中,否则会影响性能。
  19. 范式(Normalization)要按照要求使用以提高性能。Normalization做的不够会导致数据冗余,而过度Normalization 会导致太多的join和数据表,这两种情况都会影响性能。
  20. 多花点时间在数据库设计上,否则你将来会付出加倍的时间来偿还。

转自:howe.im

谈谈数据库中MyISAM与InnoDB区别

MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具。MyISAM表格可以被压缩,而且它们支持全文搜索。它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量的SELECT,MyISAM是更好的选择。

MyIASM是IASM表的新版本,有如下扩展:

  • 二进制层次的可移植性。
  • NULL列索引。
  • 对变长行比ISAM表有更少的碎片。
  • 支持大文件。
  • 更好的索引压缩。
  • 更好的键吗统计分布。
  • 更好和更快的auto_increment处理。

阅读剩余部分 -

热评文章

最新文章

最近回复

归档

其它