5.9 容器
容器(Collection)
数组是一种容器, 集合也是一种容器
java编程中, 装其他各种各样的对象(引用类型)的一种东西, 叫容器
(图书馆里所有的书, 要想管理图书馆里所有的书, 就需要先把这些书放到一个东西里面, 目前掌握的知识来说, 只能是数组, 数组的长度是固定的, 这就出现一个问题, 数组的长度该定义成多长 ? 长度是不固定的, 因为不知道有多少本书, 这个时候需要这样一种机制: 定义一种东西, 长度不固定, 可以随时添加和删除, 这种东西就是Collection, 只要不超出内存, 随便往里添加)
Collection 目前来说比较重要的两个子接口List,set。
add()添加元素 addAll ( )往一个集合添加另一个集合 删除:remove(索引)
接口:
import java.util.ArrayList; import java.util.Collection; public class Test { public static void main(String[] args) { Collection m = new ArrayList(); //接口不能直接new,实现类 ArrayList可以 m.add(123); m.add("aaa"); m.add(new Person()); m.remove(new Person()); m.remove(new Integer(123)); System.out.println(m.size()); // 1 System.out.println(m); // aaa } }
List 接口:*ArrayList 和 LinkedList 的区别
List接口(可以重复, 有顺序)
*ArrayList---实现类(以数组为底层的实现机制)
查询速度快, 但是增删改效率低
LinkedList---实现类(以链表为底层的实现机制)
查询速度慢, 增删改的效率高
有顺序, 可以重复
Collection接口的使用
Collection<String> c = new ArrayList<String>();
问题:
为什么不直接写ArrayList<String> a = new ArrayList<String>();
c.add(参数类型必须是Object)
c.remove方法: 通过判断两个对象是否互相的equals来确定是不是该删除该对象, 自定义的类, 需要自己重写父类的equals方法
重写equals方法, 也应该重写hashCode方法
hashCode通常用来做索引, 一个对象通过它的hashCode的值可以找到它在内存中的地址, 所以两个对象如果equals了, 而且又要作为索引的情况下, hashCode的值必须相等
import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; public class Test { public static void main(String[] args) { Collection m = new LinkedList(); m.add(123); m.add("aaa"); m.add(new Person()); m.remove(new Person()); //没删掉 需要重写e方法 m.remove(new Integer(123)); System.out.println(m.size()); // 打印出2 System.out.println(m); // 打印出[aaa,Person[啥也没有]] } }
List接口:
有顺序, 可以重复添加
get
set(有一个返回值要注意 !)
add
remove(int)
remove(Object)
indexOf 返回某个对象在这个集合中第一次出现的索引位置
lastIndexOf 返回某个对象在这个集合中最后一次出现的索引位置
retainAll(Collection)----返回一个boolean值,
当list的内容被改变的时候返回true, 否则返回false
import java.util.ArrayList; import java.util.List; public class Test2 { public static void main(String[] args) { List list1 = new ArrayList(); list1.add("aaa"); list1.add(new Person()); list1.add("123"); Object o = list.get(2); //打印123 System.out.println(o); Object o2 = list.set(2, 456); //123改成了456 System.out.println(o2); //有返回值,会把替换的对象封装变成返回值 System.out.println(list); list.remove(1); //移出new person list.remove("aaa"); //移出aaa System.out.println(list); System.out.println(list.indexOf(new Person())); //打印出1 } }
retainAll(Collection)----返回一个boolean值,
当list的内容被改变的时候返回true, 没有改变返回false
import java.util.ArrayList; import java.util.List; public class Test2 { public static void main(String[] args) { List list1 = new ArrayList(); list1.add("aaa"); list1.add("bbb"); list1.add("ccc"); List list2 = new ArrayList(); list2.add("aaa"); list2.add("bbb"); list2.add("ccc"); System.out.println(list1); System.out.println(list2); boolean f = list1.retainAll(list2); System.out.println(f); System.out.println(list1); System.out.println(list2); boolean f2 = list1.equals(list2); System.out.println(f2); } }
Set接口(不允许重复, 没有顺序)
Set接口中的方法没有自己定义的, 全部都是继承自Collection
*HashSet---实现类(以哈希码表为底层的实现机制) 一定要重写equals和hashCode
TreeSet---实现类(以二叉树(一种数据结构)为底层的实现机制)
没有顺序, 不可以重复(可以互相equals就叫重复)
posted on 2018-05-10 19:15 sunyexiang 阅读(109) 评论(0) 编辑 收藏 举报