Collection(根接口)集合框架
数组和集合的区别:
数组:既可以存储基本数据类型(值)又可以存储引用数据类型(地址值)
长度:数组的长度是固定的不能自动增长
使用环境:元素个数固定的时候
集合:只能存储引用数据类型(对象)也可以存储基本数据类型(存储基本数据类型会自动装箱)
长度:集合的长度是可变的 随着元素的增加而增加
使用环境:元素个数不固定的时候
List和set的区别:
List:有顺序 有下标索引 存和取都是有序的 可以存重复的
Set:无顺序 没有下标索引 不能存储重复值 存和取的顺序不能保证
Collection集合的基本功能:
Collection是接口 不能实例化 需要使用多态 接口引用指向间接子类对象
例:Collection c=new ArrayList();//多态 接口引用指向间接子类对象
添加:
c.add(元素);//基本数据类型 自动包装为包装类
c.addAll(c1);//添加所以c1的元素到c集合中
查询:显示集合元素个数
c.size();
查询:是否包含指定的元素
c.contains(指定的元素);//用boolean接收
c.containsAll(c1);//是否包含c1中的全部元素
移除:
c.remove(要移除的元素);//对象不可以这么移除
c.removeAll(c1);//从c中移除所有和c1有交集的元素(没有交接无法移除 保持原来的值)
c.retainAll(c1);//c与c1取交集 c中不是交集的元素被移除 保留交集的元素
清空集合:
c.clear();
判断:判断集合是否为空
c.isEmpty();
遍历:集合转数组遍历
Object[] obj=c.toArray();
for (int i = 0; i <c.size() ; i++) {
System.out.println(obj[i]);
}
独立拿到对象中的属性:集合中不能存在基本数据类型的元素
Object[] obj=c.toArray();
for(int i=0;i<obj.length;i++){
Student s=(Student) obj[i];//向下转型
System.out.println(s.getName()+" "+s.getAge()); }
迭代器遍历:
Collection c=new ArrayList();
通过对象返回一个迭代器
Iterator it=c.iterator();
public static void main(String[] args) {
Collection c=new ArrayList();
c.add(3);
c.add("你好");
c.add(true);
c.add(23.7);
c.add(new Student("木舟",25));
Iterator it=c.iterator();
//判断it.hasNext是否存在 如果仍有元素可以迭代,则返回 true
/* if(it.hasNext()){
System.out.println(it.next());//it.next()返回迭代的下一个元素
}*/
while(it.hasNext()){
Object obj = it.next();
System.out.println(obj);
}
}
并发修改异常
public static void main(String[] args) {
List l=new ArrayList();
l.add("i");
l.add("love");
l.add("java");
l.add("programing");
//Iterator i=l.iterator();//并发修改异常(ConcurrentModificationException)
ListIterator it=l.listIterator();//ArrayList扩展迭代器
while(it.hasNext()){
String s=(String) it.next();
System.out.println(s);
if(s.equals("java")){
it.add("javaee");//添加 要加在迭代器中
}
}
System.out.println(l);
}
去重(对象去重要在对象类中重写equals方法)
public static void main(String[] args) {
ArrayList list=new ArrayList();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("c");
System.out.println(list);
ArrayList single = getSingle(list);
System.out.println(single);
}
public static ArrayList getSingle(ArrayList list){
//去重方法
//返回类型 ArrayList 参数类型ArrayList
ArrayList newlist=new ArrayList();
//老集合获取迭代器
Iterator i=list.iterator();
while(i.hasNext()){
Object obj = i.next();//每个元素
//如果新集合中没有老集合中的元素就添加
if(!newlist.contains(obj)){
newlist.add(obj);
}
}
return newlist;
}
链表
链表与数组的区别
数组:查询修改快 增删慢
链表:增删快 查询修改慢
总结
ArrayList:底层数据结构是数组 查改快 增删慢 线程不安全 效率高
Vector:底层数据结构是数组 查改快 增删慢 线程安全 效率低
LinkedList:底层数据结构是链表 查改慢 增删快 线程不安全 效率高
这三个不知道该用那个的时候就用ArrayList