java里面的"指针"——索引

本文探讨了Java中类似于指针的概念——索引,并通过实例解释了对象引用、集合元素引用及循环中索引的使用,揭示了不当使用索引可能导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    一般学习编程语言都是从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跟数组元素没任何关系。


  在实际工作中,一定要弄清楚索引的概念,不然代码不会想咱们想的那样执行下去。

### Java 中获取当前索引的方法 在 Java 编程中,可以通过多种方式来获取当前索引。以下是几种常见的场景及其对应的解决方案。 #### 使用 `for` 循环遍历数组 当通过传统的 `for` 循环遍历数组时,循环变量即代表当前索引的位置。以下是一个简单的例子: ```java public class ArrayIndexExample { public static void main(String[] args) { int[] numbers = {10, 20, 30, 40, 50}; for (int i = 0; i < numbers.length; i++) { System.out.println("Current index: " + i + ", Value: " + numbers[i]); } } } ``` 上述代码展示了如何利用 `i` 来表示当前索引[^1]。 #### 使用增强型 `for` 循环配合 `List.indexOf()` 方法 如果使用的是集合框架中的 `List` 类型数据结构,则可以借助 `indexOf()` 方法找到某个特定元素的索引位置。需要注意的是,这种方法适用于已知目标值的情况。 ```java import java.util.ArrayList; import java.util.List; public class ListIndexOfExample { public static void main(String[] args) { List<String> fruits = new ArrayList<>(); fruits.add("Apple"); fruits.add("Banana"); fruits.add("Cherry"); String targetFruit = "Banana"; int indexOfTarget = fruits.indexOf(targetFruit); if(indexOfTarget != -1){ System.out.println("The fruit '" + targetFruit + "' is at index: " + indexOfTarget); }else{ System.out.println("Element not found!"); } } } ``` 此片段说明了如何结合 `indexOf()` 函数定位列表内的项目[^5]。 #### 利用迭代器访问容器元素的同时跟踪索引 对于更复杂的需求,比如需要向前或者向后移动指针的时候,我们可以采用 `ListIterator` 接口所提供的功能——它允许我们既读取又修改序列中的项,并且提供了两个专门用于查询当前位置前后的索引值的方法:`previousIndex()` `nextIndex()`。 ```java import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class IteratorIndexExample { public static void main(String[] args) { List<Integer> nums = new ArrayList<>(); nums.add(1); nums.add(2); nums.add(3); ListIterator<Integer> iterator = nums.listIterator(); while(iterator.hasNext()){ Integer num = iterator.next(); System.out.println("Next Index:" + iterator.nextIndex()+", Element:"+num); } while(iterator.hasPrevious()){ Integer prevNum = iterator.previous(); System.out.println("Prev Index:"+(iterator.previousIndex()-1)+", Element:"+prevNum); } } } ``` 这段程序演示了如何操作双向链表样式的游标以及打印相应的上下文信息[^3]。 #### 正则表达式匹配过程中的组号映射到实际字符偏移量 最后,在涉及模式识别的任务,经常需要用到正则引擎返回的结果集的额外元数据字段之一就是捕获子串在整个源字符串上的起始结束坐标点位;这正是由 `Matcher` 对象负责管理维护的部分属性成员函数所暴露出来的公开 API 调用入口点。 ```java import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatchIndexes { public static void main(String[] args) { Pattern pattern = Pattern.compile("\\bword\\b"); Matcher matcher = pattern.matcher("A sentence with the word and another word."); while(matcher.find()) { System.out.printf("Found '%s' starting at index %d ending at index %d%n", matcher.group(), matcher.start(), matcher.end()); } } } ``` 以上脚本阐释了有关于检索关键字所在区域边界的知识要点[^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值