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

阅读剩余部分 -

热评文章

最新文章

最近回复

归档

其它