java里面的"指针"——索引
2014-05-02 14:10
155 查看
一般学习编程语言都是从c语言开始,c语言里面有个东东叫"指针",都知道c语言里面指针用的不好会带来不安全性,学习java的时候都知道java里面没有指针。在我看来,java里面还是有类似指针的地方,java里面叫做索引。索引指向的是对象在jvm里面分配的内存地址,由于中间隔了一层jvm,所以安全性有保障。
我们来看下面的代码截图:
如果是对象当作参数,方法中对对象的属性进行改动,那么出了这个方法对象还是被改动了(Stu的无参构造方法是默认的)。可以理解为方法参数实际上是对象的索引,方法外和方法内都持有共同的索引,方法内和方法外都对索引指向的内存单元进行操作。
再来看一段代码截图:
如果给方法传了一个对象索引,在方法里面更改索引地址,是不会影响原来的数据,要想影响,只能是把新索引地址返回方法调用处。
再来看看一个集合的错误用法:
错误的现象从打印的结果可以看出来,集合里的元素都是一样的,原因是集合里面存的是对象的索引,而不是对象本身的内容。由于s对象是在for外面定义的,for循环中依次对索引指向的内存进行修改,同时依次将这个索引添加到集合中,最后列出集合的元素时又通过对象索引去查找,由于索引相同所以集合元素也是相同的(set的元素唯一性就不说了)。从此可以看出解决的方法是只需将s对象声明在for循环内,生成多个索引。
再来看看for循环和for each碰上索引会发生什么:
这个其实是从我犯的错误中提取出来的,项目业务流程需要将对象为null的属性赋值成控制符串,这样的话使用MessageFormat就不会将null显示出来,因为对象出现null的属性是不确定的,所以我就想用for循环遍历赋值,IDE生成foreach代码块更方便,于是就用了foreach,后面出错了才反应过来,foreach是直接把数组里面的元素的索引赋值给object对象,再把新的元素索引赋值给object跟数组元素没任何关系。
在实际工作中,一定要弄清楚索引的概念,不然代码不会想咱们想的那样执行下去。
我们来看下面的代码截图:
如果是对象当作参数,方法中对对象的属性进行改动,那么出了这个方法对象还是被改动了(Stu的无参构造方法是默认的)。可以理解为方法参数实际上是对象的索引,方法外和方法内都持有共同的索引,方法内和方法外都对索引指向的内存单元进行操作。
再来看一段代码截图:
如果给方法传了一个对象索引,在方法里面更改索引地址,是不会影响原来的数据,要想影响,只能是把新索引地址返回方法调用处。
再来看看一个集合的错误用法:
错误的现象从打印的结果可以看出来,集合里的元素都是一样的,原因是集合里面存的是对象的索引,而不是对象本身的内容。由于s对象是在for外面定义的,for循环中依次对索引指向的内存进行修改,同时依次将这个索引添加到集合中,最后列出集合的元素时又通过对象索引去查找,由于索引相同所以集合元素也是相同的(set的元素唯一性就不说了)。从此可以看出解决的方法是只需将s对象声明在for循环内,生成多个索引。
再来看看for循环和for each碰上索引会发生什么:
这个其实是从我犯的错误中提取出来的,项目业务流程需要将对象为null的属性赋值成控制符串,这样的话使用MessageFormat就不会将null显示出来,因为对象出现null的属性是不确定的,所以我就想用for循环遍历赋值,IDE生成foreach代码块更方便,于是就用了foreach,后面出错了才反应过来,foreach是直接把数组里面的元素的索引赋值给object对象,再把新的元素索引赋值给object跟数组元素没任何关系。
在实际工作中,一定要弄清楚索引的概念,不然代码不会想咱们想的那样执行下去。
相关文章推荐
- "空指针错误 java.lang.NullPointerException "
- 2.5在Eclipse里面编译samples/Cpp/里面的几个例子,会出错 "Unable to execute dex: java.nio.BufferOverflowException"
- 对象数组报错“空指针”:Exception in thread "main" java.lang.NullPointerException
- Java使用"指针"快速比较字节
- 解决"java.lang.UnsatisfiedLinkError: Native Library xxx.dll already loaded in another classloader"问题
- 安装oralce后在cmd模式下运行java命令出错:Exception in thread "main" java.lang.UnsupportedClassVersionError: org/getopt/luke/Luke (Unsupported
- Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 解决方案
- 【Java Web】The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- Exception in thread "main" java.lang.NoClassDefFoundError
- 如何开始 java "core java"
- Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
- Exception in thread "main" java.lang.NoSuchMethodError: org.apache.poi.poifs.filesystem.POIFSFileSys
- Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
- java Class.forName("") .newInstance();
- Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
- An internal error occurred during: "Add Deployment". java.lang.NullPointException 问题解决
- 问题"Caused by: java.lang.ClassNotFoundException:..."
- java.sql.SQLException: ORA-01555: snapshot too old: rollback segment number 8 with name "_SYSSMU8$" too small :回滚段太小
- java中split()特殊符号"." "|" "*" "\" "]"
- IDEA 14.1.3-import之前的scala项目报错:Exception in thread "main" java.lang.ClassNotFoundException: kmust.hj