实习生做用户列表,写了个字符串数组存用户名,产品一加需求说还要头像和等级,整段代码全得推倒重写。字符串数组存一条信息还行,多字段就该用对象数组:数组管顺序,对象管每个条目的字段。
长什么样
以JS为例,一个元素就是一个对象。访问用方括号加下标取到对象,再点字段。下标越界拿到undefined,接着点字段直接报TypeError,循环之前先确认长度。Java里写法类似,只是类型要提前声明,Person[]这种定长数组一旦new出来长度就动不了,超了就报ArrayIndexOutOfBoundsException。
JS里的常用操作
const users = [{name:'阿明',level:3},{name:'小红',level:5}];users.push({name:'老王',level:1});users.forEach(u => console.log(u.name));const top = users.filter(u => u.level >= 3);push往尾部加,filter按条件筛出一份新数组,原数组不动,map用来把每个元素转成别的形式。如果需求是按等级排序,用sort配上比较函数,注意sort是原地排序,直接改掉原数组。只要一份有序副本的话先slice再sort。
Java里的两种容器
定长数组写法是Person[] arr = new Person[10],注意new出来的是十个null,放进去的是引用,不提前new每个元素就报空指针。日常开发更常用ArrayList,add、get、remove都封装好了,长度自动扩。遍历推荐增强for,写起来短。要删除元素时别在增强for里直接remove,会抛并发修改异常,用Iterator的remove或者先收集再删。
容易被忽略的三件事
- 比较:JS里两个字段相同的对象用全等比较还是false,因为比的是引用。JS只能逐字段比,Java里记得重写equals和hashCode。
- 拷贝:展开运算符和Arrays.copyOf都是浅拷贝,改副本里的对象原数组跟着变,深拷贝得自己逐个new。
- 空值:JSON接口返回的数组里某个元素可能是null,循环第一件事先判空再取值。
规模很小且结构固定时,对象数组比Map可读性好,顺序也天然保留。数据量上万还频繁按字段查,就该换成Map或者数据库索引,别死守数组。