Java堆和栈的区别

On February 22, 2010, in J2SE/J2EE, by bruceleey

一篇老文章,写的很好所以转来了。原文:http://www.blogjava.net/beansoft/archive/2007/09/08/143551.html

栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
Java的堆是一个运 行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要 程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存 的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要 快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
int a = 3;
int b = 3;
编 译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。
这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。
要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。
String是一个特殊的包装类数据。可以用:
String str = new String(“abc”);
String str = “abc”;
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放”abc”,如果没有,则将”abc”存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。
String str1 = “abc”;
String str2 = “abc”;
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。
String str1 =new String (“abc”);
String str2 =new String (“abc”);
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一次生成一个。
因 此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String(“abc”);的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
另 一方面, 要注意: 我们在使用诸如String str = “abc”;的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。
由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。

Tagged with:  

程序员应该掌握的英语词汇

On February 21, 2010, in 杂谈, by bruceleey

卷首语:“英语”不需要专业,因为它只是工具 ……

有时候如果应聘到了一个有外资背景的公司或者这个公司的很多人都有海外或外资工作背景时,你也许还会用到一些日常工作交流时候的词汇。

比 如我们看一下某主管开会时的发言: 小王,请你尽快“Push”一下这件事,按照前期咱们定下来的“Plan”来“follow”这个“case”,每一个“Milestone”都要 “Share”出来,你负责的这块工作要充分的“Open”,明天最好和客户做一个“Conference”能够“Face to face”的交流一下。 小李,你的那个“Project”最近有些“Delay”了,这么多“Resource”都分配给你了,还分配给你了那么多“Part time”,作为一个“PM”你应该知道目前这个“Cost”恐怕“Cover”不住这个项目了,你要尽快完成。 最近“Marketing”那边对我们“Team”的要求比较紧,“Sales”他们的业绩也上来了,咱们作为技术部门要坚决做好“Product”的后 盾。

请注意,这并不是一个笑话,而是在某些公司每天都在发生的一个最最普通的一个部门会议。如果你对这些词汇不明白,恐怕这个会议开下来都不知道领导说的是什么。

翻译一下: 小王,请你尽快“推动”一下这件事,按照前期咱们定下来的“计划”来“跟踪”这个“事情”,每一个“里程碑”都要“共享”出来,你负责的这块工作要充分的“开放给大家”,明天最好和客户做一个“讨论会”能够“面对面”的交流一下。 小李,你的那个“项目”最近有些“延迟了”了,这么多“资源”都分配给你了,还分配给你了那么多“临时员工”,作为一个“项目经理”你应该知道目前这个“成本”恐怕“包”不住这个项目了,你要尽快完成。 最近“市场部门”那边对我们“团队”的要求比较紧,“销售人员”他们的业绩也上来了,咱们作为技术部门要坚决做好“产品开发”的后盾。

很有意思吧,经常能在公司中看到喜欢中英文混说的领导。要么本身这个企业就是外企,要么这个领导曾经在外企工作,或者本身就觉得这样说话很酷,但不管是因为什么原因令其进行中英文混说,我们作为程序员,在开会的时候也不能“大眼瞪小眼”吧! 因此,我们应该尽可能熟悉这些英语词汇,以备不时之需。我们下面就总结一下,在公司中经常会用到的一些单词都是什么意思,以及何时能够用得上。

13.1.3.1 几个开会的时候最容易出现的单词

Conference:讨论会,碰头会议的意思
例如,有时候领导会说“咱们Call一个Conference吧”,这个的意思应该是一个电话会议,或者视频会议。
Follow:跟踪
例如,一般会说那个Case你follow一下吧,这就是说让你跟踪一下这个事情。
Team:
是团队的意思,团队的主管一般叫Team Leader,一个Team可以大也可以小,一个项目小组可以叫一个Team,一个部门也可以叫做一个Team,有时候一个公司的高层领导团队也可以叫做是一个Team。
Policy:政策或者是策略
很多东西都可以制定Policy,销售的Policy,价格的Policy,网络的Policy都可以。
Open:打开的、开放的
有时候当成一种状态来说,比如你的项目是不是Open的呢?这个的意思是说,你是不是非常听不进去别人的意见闭门造车呢?
Share:共享
例如,把你的文档Share一下吧,有时候也说把你的想法Share一下吧。
Plan:计划、规划
例如,你有什么Plan告诉我一下,或者说,你在这件事请开始前是否已经制订了详细的Plan?Plan是每一件事的行动方案和地图。
Milestone:里程碑、阶段
例如,请你把每一个Milestone共享出来,就是说让每一个人都知道你项目的进度状况。Milestone就是每一个进展阶段的结束。
Product:产品
产品就是一个公司的用于销售而生产的物品,Product有时候也可以代表一个部门,比如“产品部”。
Project:项目
一般项目是需要在公司立项的,如果没有立项一般都不能称作一个正式的项目,在立项以后每一个项目都会任命一个项目经理作为这个项目的总负责人,项目经理的英文简称是PM。
Boss:老板
我们有时候一提到Boss总是想到的是这个公司的实际控股人,也就是公司里最大的那个领导,其实不尽然,这里面所说的老板并不是整个公司的老板,而指得是你的上级,一般将你的上级也叫做Boss。
Close:关闭
Close有时候描述某些事情的状态,比如说,“这个事情已经Close了”,意思是说这件事情已经了结了,这个和“finish”的意思是不一样的,finish是完成了,而Close是关闭了。
Manager:经理
到了工作单位以后,你会发现在一个公司中有无数的Manager,几乎每一个人都可以叫做Manager,大大小小的Manager有很多,但却都不是领 导,比如,负责采购的原来叫采购员,现在叫采购经理,负责销售的原来叫销售员,现在叫销售经理,客户服务的原来叫客户服务人员,现在叫客户经理,等等。
Delay:延迟了
Delay也是一种状态,这个状态一定是和一个Plan相比较的,在Plan中设定了每一个Milestone的时间点,而在相应的时间点上没有完成那个Milestone的目标,那么说明这个项目Delay了。
Schedule:时间表
有时候在规范每一个人在项目中在不同时间段应该完成的事情,可以编制一个Schedule的Excel文件,发给每一个参与项目的人员
Update:更新一下
Push:推动
比如,你Push这一下这件事,就是推动一下。
Solution:解决方案
有时候说,给用户提供一个Total solution的意思是,全面的解决方案。
Announce:宣布
比如,有时候说,把你们的想法通过Email Announce出来,这就是说发一个群发邮件,让所有人都知道你所要表达的某些计划等等。
Interview:原意是接见会见的意思,但是现在面试也是这个。
Resource:资源
Review:检查一下或者回顾一下

13.1.3.2 几个和软件开发相关的单词

API:Application Programming Interface 应用编程接口
比如,两个本来互相没有联系的系统需要数据共享,就需要开发API作为接口。
Coding:编码工作
有时候将正式开始编码工作称作“Coding”,听起来似乎怪怪的,但实际上就是敲代码。
Document:文档
WebBase:Web应用程序
“WebBase”从单词字面上看就是以Web为基础的意思,其实就是所谓的“B/S”结构的程序,有时候如果你和不懂技术的人交流说“B/S”他们不懂,你就说“WebBase”他们一定懂。
Face to face:面对面
Hand by hand:手把手
Step by Step:一步一步的
Quality:质量
“Quality”可以说产品的质量,也可以说是网络通信的“Quality”等。
On-line:在线的
有时候所谓的“On-line的客户”并不是说他们现在就在线上连接着网络或者服务器,而有时候是指这些客户是我们的正式客户。
Handbook:手册
License:许可证
经常听到“购买几个License”这样的话,“License”意思就是授权许可,有时候即使这个软件可以正常安装使用也是非法的,因为没有购买 “License”,只有购买了“License”才可以合法使用,也就是所谓的“正版”。对于软件而言,有时候“License”并没有加密措施,完全 是一种自觉行为。对于网络版软件而言,每一个客户端的使用都需要购买相应的“License”。
On-site:现场服务
现场服务我们称作“On-site”服务,需要派工程师到用户的现场实施服务。
Report:报告
很多情况下人们把“Report”翻译成“报表”,其实“Report”本身即是名词又是动词,作为动词用到的地方也很多,比如,在一个公司中有人问“你report给谁?”,这句话的意思是说“你的上级主管是谁”。
Version:版本

13.1.3.3 几个常用的设备名称的单词

Voice gateway:语音网关
Router:路由器
HUB:有时候已经把小的桌面级的集线器和交换机都叫HUB
Switch:交换机

13.1.3.4 几个常用和商务相关的单词

Order:订单
Price:价格
List price:官方报价,往往厂家会给一个折扣价,实际采购设备的价格并不是“List price”,“List price”仅仅是官方报价。
Customer:客户
Partner:合作伙伴
Billing:计费
Marketing:市场,有时候也代表市场部门

13.1.3.5 几种职位名称的称呼

CEO:Chief Executive Officer的简称,首席执行官
COO:Chief Operating Officer的简称,运营总裁
CTO:Chief Technology Officer的简称,首席技术官
Director:总监
HR:Human resource的简称,人力资源部
CS:Customer service的简称,客户服务部门
MIS:公司办公网络和办公设备管理人员
Teamleader:团队领导
PM:Project Manager的简称,项目经理
Sales:销售的,有时候代表销售人员
Engineer :工程师
Parttime:临时员工,或者叫兼职工作人员

Tagged with:  

Linux对用户操作

On February 20, 2010, in Linux, by bruceleey

添加一个xxx用户:

代码:
useradd xxx

添加一个xxx用户,指定家目录为/home/xxx :
代码:
useradd -m -d /home/xxx xxx

添加一个xxx用户,指定家目录为/home/xxx ,并指定用bash :
代码:
useradd -m -d /home/xxx -s /bin/bash xxx

添加一个xxx用户,指定家目录为/home/xxx ,并指定用bash,同时加入yyy和zzz组(默认的xxx组也是保留的) :
代码:
useradd -m -d /home/xxx -s /bin/bash -G yyy,zzz xxx

查看有xxx用户参与的组:
代码:
id xxx

将xxx用户加入yyy组和zzz组:
代码:
usermod -G yyy,zzz xxx

将xxx用户的默认shell改为dash:
代码:
usermod -s /bin/dash xxx

删除xxx用户:
代码:
userdel xxx

删除xxx用户,连同家目录一起删除:
代码:
userdel -r xxx

以上命令除 id xxx 外都需要root权限.

Tagged with:  

2010-2-4

On February 4, 2010, in 杂谈, by bruceleey

上周礼拜天感冒发烧一直到现在还没完全好,眼看着周六马上就要到了,自己身体不好不要紧,可不能增加政府的负担啊,万一在火车上有个三长两短的,那真对不起人民对不起党,决定去趟医院。

下午4点叫的车,到医院后在门诊部只看见几个挂号的在数钱,一打听说下班了,北京时间4:30刚过。

趁自己还能走的动,马上再叫车去另外一所医院,司机把我带到据说这里最大的医院,毫无疑问也下班了。

我烧的晕头晕脑,过去问服务部的接待员。我说,我发高烧要打针。

她说,对不起,今天已经下班了,只能明天来。

我说,我烧了几天了,再不打针我怕我受不了了。

她说,……

我看着外面说,有没有办法帮我弄到急诊部?

……

实在没有办法,去药店再买点药,这些天药吃的比饭多,身体对药物好像没什么反应了。

在上海,请多注意身体。

我身体一直不太好,为了我的健康或者说为了我生病能够很快的得到医治,我得存点钱到二线城市或农村去。