数组
声明数组有两种方式
int[] a
和int a[]
,推荐使用:int[] a(变量类型都在左边)1
2
3
4
5public 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 | //对于情况E,赋值会产生空指针异常。java.lang.NullPointerException |
快速初始化数组
1
2
3
4boolean[] 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 | private static ArrayList<Contact> contacts = new ArrayList<Contact>() {{ |
迭代器接口:
用与遍历集合元素的接口,共包含4个方法
- next():返回值,并且向下移动
- hasNext()
- remove()
- forEachRemaining()
1 | @Test |
for-each语法糖:
JAVA中for-each的底层实现就是利用了迭代器,for-each其实只是java提供的语法糖。语法糖是编程语言提供的一些便于程序员书写代码的语法,是编译器提供给程序员的糖衣,编译时会对这些语法特殊处理。语法糖虽然不会带来实质性的改进,但是在提高代码可读性,提高语法严谨性,减少编码错误机会上确实做出了很大贡献。
集合类常用方法:
- size()
- isEmpty()
- contains()
- clear()
- toArray()