【Java】数组与集合

【Java】数组与集合


数组

  • 声明数组有两种方式 int[] aint a[],推荐使用:int[] a(变量类型都在左边)

    1
    2
    3
    4
    5
    public static void main(String[] args) {
    //等价于 int[] a=new int[10];
    int[] a;
    a=new int[10];
    }
  • 创建数组时,有默认值

    • 数字数组,默认为:0
    • boolean数组,默认为:false
    • 对象数组,默认为:null
  • 一旦创建数组后,就不能再去改变它的大小

  • 数组之间使用=时,表示两个变量引用同一个数组

  • 如果想要拷贝一个新的数组,可以使用Arrays.copyOf()

  • 数组排序,Arrays.sort(a),采用了快速排序的方法

1
2
3
4
5
6
7
8
9
//对于情况E,赋值会产生空指针异常。java.lang.NullPointerException
float [][]f = new float[6][];
f[0][1] = 1.0f;
System.out.println(f[0][1]);
//若要访问,需要创建数组,并指向该地址。
float [][]f = new float[6][];
f[0] = new float[5];
f[0][1] = 1.0f;
System.out.println(f[0][1]);
  • 快速初始化数组

    1
    2
    3
    4
       boolean[] a=new boolean[10];
    Arrays.fill(a,true);
    System.out.println(a[0]);
    //输出ture

集合

集合体系及特点

这里给出常用的一些接口和实现类,实际上远比这个要复杂:可以使用IDEA查看diagram

Collection

  • 是集合类的一个顶级接口
  • Collection是单列集合
  • Collection中只有Set系列要求元素唯一

List接口

  • List是元素有序并且可以重复的集合,称为序列
  • List可以精确的控制每个元素的插入位置,或删除某个位置的元素

ArrayList类:

  • ArrayList底层是由数组实现的,长度动态增长(没超过边界一次,容量就会自动扩大为原来的1.5倍)
  • 由于是用数组实现的,当在某个不是头尾的位置进行插入删除时,需要移动其位置后面的所有元素,效率很低,所以增删速度慢
  • 由于是用数组实现的,索引速度快,所以更适合查询和更新元素

LinkedList类:

  • 是基于链表结构实现的
  • 基于链表实现,所以查询速度慢
  • 基于链表实现,所以增删速度快

vector类:

  • 底层也是由数组实现的,每次扩容扩大为原来的2倍
  • Vector 是很多方法都有用synchronize修饰,也就是说,可以做到线程安全,但性能比较低

stack类

Set接口

  • Set是元素无序的
  • 元素不可以重复,称为集

HashSet类:

  • HashSet是Set接口的重要实现类,称为哈希集
  • HashSet中的元素无序并且不可以重复
  • 具有良好的存取和查找性能

TreeSet类:

  • TreeSet是基于二叉树的数据结构
  • 可以在插入的时候,自然的排序

Map

  • Map中的数据是以键值对(key-value)的形式存储的,是双列集合
  • 可以通过key值快速查找value
  • key值不能重复,但是value可以重复

HashMap类:

  • 基于哈希表的Map接口的实现
  • HashMap中的Entry对象是无序排列的

Tips

关于静态容器类的初始化,可以用双花括号解决:

1
2
3
4
5
6
7
private static ArrayList<Contact> contacts = new ArrayList<Contact>() {{
add(new Contact(5468754, "a"));
add(new Contact(4468754, "b"));
add(new Contact(7468754, "c"));
add(new Contact(2468754, "d"));
add(new Contact(6468754, "e"));
}};

迭代器接口

用与遍历集合元素的接口,共包含4个方法

  • next():返回值,并且向下移动
  • hasNext()
  • remove()
  • forEachRemaining()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test() {
ArrayList<Integer> list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
//获取集合的迭代器
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}

for-each语法糖

JAVA中for-each的底层实现就是利用了迭代器,for-each其实只是java提供的语法糖。语法糖是编程语言提供的一些便于程序员书写代码的语法,是编译器提供给程序员的糖衣,编译时会对这些语法特殊处理。语法糖虽然不会带来实质性的改进,但是在提高代码可读性,提高语法严谨性,减少编码错误机会上确实做出了很大贡献。

集合类常用方法:

  • size()
  • isEmpty()
  • contains()
  • clear()
  • toArray()

 
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×