java-一切皆对象
java是一门面向对象语言,这个从一开始我们就明白了,可是真正使用过程中,往往我们是把它当做过程语言在使用,主要是没有大局观,代码欠考虑,导致我们一开始的思路就是功能性的东西,而不是对象性的东西,说起来简单,真正做的时候就不见的了。
java中的数据主要的存储是:堆栈、堆,也有少量的磁盘,堆栈中主要存放的是对象的引用,堆中则存放的是对象。
java中的基本类型是个特例,它是直接存储于堆栈中的,所以在必要的时候为了性能其实可以考虑直接使用基本类型,而非对象类型才定义数据,因为堆栈的速度远快于堆。说到效率问题,之前有看到过有人对于for循环的一点建议,不知道是否妥当,没有测试过,及在定义for循环的时候往往需要判断递增/递减量是否大于标准,有人建议如果是集合,先获取集合大小,然后在放入到for循环中作为判断条件,但是看过很多大神的代码,却鲜有发现这么写的,不知道原因何在。
鉴于上述原因也就存在如下状况:
Integer l = 180; Integer i =180; System.out.println(l==i);输出结果为false,当值在-128~127 时值是来自系统缓存,当然这只是指不是通过new的方式初始化变量的时候,这个时候输出为true,而一旦不在这个区间,则会执行相应的new操作
可以设置系统属性 java.lang.Integer.IntegerCache.high 修改缓冲区上限,默认为127。参数内容应为大于127的十进制数形式的字符串,否则将被忽略。取值范围为127-Long.MAX_VALUE,但是用时将强转为int。如果这里设置了那么上述的结果也会发生相应的变化,可以参考http://duzc2.iteye.com/blog/1542890
鉴于基本类型机器包装类存在数值精度问题,可以考虑使用BigInteger和BigDecimal这两个对象,他们可以表示任意大小的整数类型/浮点类型,通常考虑用来表示货币等高精度。
创建一个数组对象的时候实际上不只是创建了一个引用的数组,同时也是为每个引用自动初始化了一个特定的值,之所以说特定是因为如果数组是对象类型的,则都为null,若果为基本类型的,则基本为0表示,java的垃圾回收器回收的只是监视通过new方式创建的所有对象,也就是说基本类型可能不在考虑范围以内。
java的注释,这个很奇特,/*开始*/结尾的为段注释//为行注释,这种注释主要是用来给开发者自己来看的,而且个人的经验发现,这样的注释其实在实际应用中作用比较局限,为了偷懒我还是习惯于使用/**开头*/结尾的文档注释,这个兼具段注释和行注释的功能(当然不是优点),同时在多态等情况下可以很好的知道引用的方法的说明,而不用跳转到对应的类或者方法来查看,如果你有用eclipse等工具你就明白了,顺带说一下,对于接口和实现类,如果你使用接口作为变量定义,那么我建议如果你要写注释,至少至少要给接口类中的方法加上注释,否则在你当做实现类来用的时候基本看不到注释(好吧这个有点绕了,比如你定义了person的接口,同时定义了student的实现,当你在一个类中试图给person赋值student,同时想使用这个变量,那么至少给person中的方法加上文档注释,你会幸福的)
常用的标签就不说了,主要是我不常用的在这里mark一下
这里先插一点:
什么是独立文档标签(独立文档标签是以@开头,且要置于注释行的最前面(不算前导*)
什么是行内文档标签(可以出现在javadoc注释--记住是javadoc,不是普通注释的任意地方,他们是以@开头但要包含在花括号中)
@see 这个标签用来产生一个连接,文档中可以使用如下三种:
@see classname
@see fully-qualified-classname
@see fully-qualified-classname#method-name
javadoc不会检测提供的连接是否有效,只会在文档中增加一个See Also(参见)的条目
{@link package.class#member label}
该标签于@see标签相似,只是它被用于行内,并且用“label” 作为超链接文本(label相当于替换了最终生成的文档中的“See Also”)
{@inheritDoc}
这个就是强大的文档继承功能了,他能继承直接父类相关文档到当前文档