基础
声明
可以这样声明:
int[] scores String[] names
|
也可以这样声明
int scores[] String names[]
|
二维更为古怪
int [][]x; int []x[]; int x[][];
|
这里注意一点,声明时不能往括号中加东西,会报错。例如:int x[1];//报错
java中推荐吧括号放到前面,可能int[]也成了一个对象?
创建数组对象
创建数组对象语法和c++中创建动态数组类似。
int[] scores = new int[100];
上面这个代码首先要在堆中分配空间,然后把里面的数据初始化。
括号中的数字可以使常量,也可以是变量,甚至可以是0(表示里面没有数据).
访问数组的元素和长度
和c++一样,下标索引。如果越界,会抛出ArrayIndexOutOfBoundsException异常
所有数组都有length属性,表示数组的长度: public final length
.
所以我们可以直接输出这一属性,例如:
int x[] = new int[40]; System.out.println(x.length);
|
如果是对象数组,那么数组中的元素时对象的引用,因此当我们不使用数组的时候最好把值赋null触发垃圾回收机制。
String sb = new String("a"); String sbs[] = new String[](sb,null); ... sbs[0] = null; sbs = null;
|
多维数组和不规则数组
String[][] rooms = new String[2][]; rooms[0] = new String[]("Tom","Mike"); rooms[1] = new String[]("Mary");
|
可以用不等长数组是因为每一行都是一个数组元素,都有自己的length变量
for(int i=0 { for(int k=0 { System.out.println(rooms[i][k]) } }
|
第一个循环的length是rooms引用多少个数组,rooms[]指的是每个数组的长度。
要注意只有最后一个括号可以不加数字,我的理解是只有最后一层才是真正的数组对象,才有length,同时,前面不确定就不知道要开多少个数组对象。
数组作为返回值
在c++中数组是不能作为返回值的,因为c++中数组是一个指针,而又不能像其他指针一样确定它的大小。而在java中数组是一个对象,可以返回它的引用。
哈希表
平常我们想找某一个值都是通过遍历数组得到的,我们也可以用值通过某种映射关系得到在数组中的位置。这就是哈希表
例如:
public int hash(int value) { return value%10-1; }
|
上面这个例子中value就是值,返回的是下标。但是这时如果超过十就会出现重复,这叫做哈希冲突。我们可以设计更复杂的映射来处理哈希冲突。
判断重复的条件是 object1.equals(boject2)
class Node { private Object value; private Node next; public Node(Object value) { this.value = value; } public Object getValue() { return value; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } }
public class MyhashSet { private Node[] array; private int size = 0; public MyHashSet(int length) { array = new Node[length]; } public int size() { return size; } private static int hash(Object o) { int h = o.hashCode(); h += ~(h << 9); h ^= (h >>> 14); h += (h << 4); h ^= (h >>> 10); return h; } private int indexFor(int hashCode) { return hashCode & (array.length-1); } public void add(Object value) { int index = indexFor(hash(value)); Node newNode = new Node(value); Node node = array(index); if(node == null) { array(index) = newNode; size++; } else { Node nextNode; while(!node.getValue().equals(value) && (nextnode = node.getNext()) != null) { node = nextNode; } if(!node.getValue().equals(value)) { node.setNext(newNode); size++; } } } public boolean contains(Object value) { int index = indexFor(hash(value)); Node node = array[index]; while(node != null && !node.getValue().equals(value)) { node = node.getNext(); } if(node!=null && node.getValue().equals(value)) { return true; } else { return false; } } public boolean remove(Object value) { int index = indexFor(hash(value)); Node node = array[index]; if(node!=null && node.getValue().equals(value)) { array[index] = node.getNext(); size--; return true; } Node lastNode = null; while(node != null && !node.getValue().equals(value)) { lastNode.setNext(node.getNext()); size--; return true; } else { return false; } } public Object[] getAll() { Object[] values = new Object[size]; int index = 0; for(Node node: array) { while(node != null) { values[index++] = node.getValue(); node = node.getNext(); } } return values; } }
|
Arrays类
java.util.Arrays类,有一系列操作数组的方法。这是一个私有类
静态方法:
- equals(): 比较两个数组是否相同
- fill(): 向数组中填充数据
- sort(): 把数组升序排列
- parallelSort(): 开启多个线程,以并发的方式对数组中元素进行排序,提高效率
- asList()把一个数组变成List
例: Arrays.sort(a);
用 … 声明数目可变参数
可以用int… a代替 int[] a;这种模式下如果输入立即数可以转化成数组类型:
public static int max(int... datas) { ... } public static void main(String[] args) { System.out.println(max(5, 8, 2, 4, 5); |
|
但是必须要放在参数列表的最后一位
```
pubilc void max(int… data, String p)//错误,int… 必须放在最后
{
…
}