容器(也就是集合collection)
数组相较于集合的缺点
• 长度必须在初始化时指定,且固定不变
• 数组采用连续存储空间,删除和添加效率低下
• 数组无法直接保存映射关系
• 数组缺乏封装,操作繁琐
位于java的工具包下 (java.util)
看一下家族
特点
• Collection 接口存储一组不唯一,无序的对象
• List 接口存储一组不唯一,有序(索引顺序)的对象
• Set 接口存储一组唯一,无序的对象
• Map接口存储一组键值对象,提供key到value的映射
Key 唯一 无序
value 不唯一 无序
它们各自的优缺点
• List
• 特点:有序 不唯一(可重复)
• ArrayList 线性表中的顺序表
• 在内存中分配连续的空间,实现了长度可变的数组
• 优点:遍历元素和随机访问元素的效率比较高
• 缺点:添加和删除需大量移动元素效率低,按照内容查询效率低,
• LinkedList 线性表中双向链表
• 采用双向链表存储方式。
• 缺点:遍历和随机访问元素效率低下
•优点:插入、删除元素效率比较高(但是前提也是必须先低效率查询才可。如果插入删除发 生在头尾可以减少查询次数)
- List的常用方法
- List相对Collection增加了关于位置操作的方法
- 常用的遍历方法
for
for-each
Iterator
迭代器
练习
public class TestGeneric {
public static void main(String[] args) {
MyClloction<String> mc = new MyClloction<String>();//这里的第二个<String>可以省略
mc.set("洛尘曦",0);
String b = mc.get(0);
System.out.println(b);
}
}
class MyClloction<E>{
Object [] objs = new Object[10];
public void set(E e,int index) {
objs[index] = e;
}
public E get(int index) {
return (E)objs[index];
}
}
输出
洛尘曦
**泛型通常用ETV表示,其实这里的泛型
E
类似于传参机制,他就表示返回String类型的数据,如果不用容器的话,在调用方法的时候应该进行强制类型转换。
不使用泛型,如下面的方式
public class TestGeneric {
public static void main(String[] args) {
MyClloction mc = new MyClloction();//这里的第二个<String>可以省略
mc.set("洛尘曦",0);
String b = (String)mc.get(0);
System.out.println(b);
}
}
class MyClloction<E>{
Object [] objs = new Object[10];
public void set(Object e,int index) {
objs[index] = obj;
}
public Object get(int index) {
return objs[index];
}
}
Collection的常用方法
public static void main(String[] args) {
test();
}
public static void test() {
Collection<String> c = new ArrayList<>();
c.size();//判断容器的大小
c.isEmpty();//判断容器是否为空
c.add("洛尘曦");
c.add("上官易泽");
System.out.println(c.contains("洛尘曦"));//容器中是否包含洛尘曦
System.out.println(c);
System.out.println(c.size());
c.remove("洛尘曦");//会把容器中的洛尘曦移除
c.clear();//移除所有
}
无论是ArrayList 还是LinkedList它们的常用方法其实几乎一样