1、数组
数组是最为常见的一种数据结构。
效率最高的存储和访问元素的方式。
数组是将一些数据按照线性顺序连续存储的序列。
定义(声明)格式:元素类型[]数组名称;
int[] array11; // 更为符合原理。
元素类型可以是基本数据类型或引用类型
String[] array13;
T0501Array[] array14;
第一种初始化,数组元素的初值为0
定义后再赋值,第三种初始化方法是不可行的(int [] array23={1,2,3,4,5})
1、基本特点
1-元素类型遵循数组类型(基本数据类型和引用类型都可)
2-初始化赋值后数组长度固定不变。
null是引用类型变量未赋值时的默认值
数组变量一定是引用类型
2、数组遍历
1-通过下标索引访问遍历
遍历时注意数组越界
int[] arr={1,2,3,4,5};
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
2-加强for each遍历
遍历的效率更高
int[] arr={1,2,3,4,5};
for(int i:arr){
System.out.println(i);
}
EX长度为10 的double数组,随即生成元素,范围为30-50
@Test
public void test01() {
int[] arr=new int[10];
Random ran=new Random();
for(int i=0;i<arr.length;i++) {
arr[i]=ran.nextInt(10);
}
print(arr);
max(arr);
exchange(arr);
haveFive(arr);
}
public void f1() {
for (int i = 0; i < a2.length; i++) {
a2[i]++;// a2[i]=a2[i]+1;
String s = "a1["+ i+"]="+ a1[i];
s += "\ta2["+i+"]="+ a2[i];
s += "\ta3["+ i + "]=”+ a3[i];
System. out .println(s);
}
//根据运行结果,发现两个数组的值相同,
//而代码中只是对a2数组的值进行了修改,
//但a1数组的值也随之改变了?
//原因:将数组a1的内存地址赋给了数组a2,
//所以两个数组内存中指向同一个地址,
//改变数组a2的值也相当于改变了数组a1的值。
//引用类型变量,实质上存储的是指向内存中的个地址,Java中称之为引用
引用变量参数传递后,在数组内对参数再进行new或者重新赋值,就会是一个新的地址。
@Test
public void test01() {
String name =new String ("bes");
char[] product= {'d','x','p'};
Integer i=10;
change(name,product,i);
System.out.println(name+" "+new String(product)+" "+i);
}
public void change(String name,char[] product,Integer i) {
name="Change";
i=100;
product[1]='a';
}
2、二维数组
数组分为一维数组,二维数组和多维数组
声明:
int[][] array;
int array[][];
int [] array[];
初始化;
int[][] arr=new int[2][3];
int[][] arr=new int[][]{{1,2,3},{3,4,5}};
int [][] arr={{1,2,3},{3,4,5}};
特殊:
int[][] arr=new int[2][];
int[] arr1=arr0;
int[][] arr=new int[][]{};
3、System中的数组方法
arraycopy(来源数组名称,来源数组起始位置,目的数组的名称,目的数组的起始位置,来源数组中需要复制元素的个数长度)
Arrays.copyOf(原始数组,复制的元素长度)
2、算法(排序和查找)
冒泡排序
插入排序
快速排序集合
3、集合
<> 表示泛型
集合可以扩展长度
ArrayList默认原始容量为10,,扩容倍数为1.5倍
使用foreach进行循环遍历
Vector 线程安全的
Collection(工具类)用于集合,
Hashset:
没有索引,不重复
TreeSet:
元素按照自然顺序(或者自定义顺序)排序,元素不可重复
HashMap:
实现原理
JDK7及以前, HashMap底层基于数组(Entry数组)和链表实现,计算hash时发生hash冲突将该节点以链表形式存储,当hash冲突过多会导致单个链表过长,查找节点时将耗费0(n)的查找时间。
JDK8:底层基于数组(Node数组)、链表、红黑树实现,当同- hash值的节点数超过阈值(8),链
表结构将会被转换为红黑树进行数据存储。