集合框架(对象数组的概述和使用)
结合类能存储任意对象,长度是可以改变的,随着元素的增加而增加,元素的减少而减少
数组和集合的区别
1、数组既可以存储基本数据类型,也可以存储引用数据类型,但集合中只能存储引用数据类型,如要存储基本数据类型,在存储过程中会自动装箱变成对象。
2、数组元素的固定的,不能自动增长,而集合长度是可变的,可以根据元素的增加而增长
Collection
List Set
(有序,存取数据有序,索引,可重复) (无序,存取顺序不一致,无索引,不可以存储重复数据)
ArrayList LinkedList Vector(数组) HashSet(哈希表) TreeSet(二叉树)
--------------------------------------------------------------------------Collection(Util)
Collection collection = new ArrayList();
boolean flg = collection.add(Object o);
c.clear()
c.size()
c.contain(对象);
集合转数组遍历
Object[] arr = coll.toArray();//要对Object进行强制类型转换
boolean flg = c.addAll(collection c1); 把c1中的每一个元素添加到c中
boolean flg = c.removeAll(collection c1); 删除的是由交集的部分
boolean flg = c.containsAll(collection c1);判断调用的集合是否包含传入的数据
boolean flg = c.returnAll(collection c1);去交集,如果调用的集合改变,返回true,如果调用集合不变就返回false
--------------------------------------------------------------------------
集合的迭代器遍历
Iterator it = collection.iterator();
while(it.hasNext()){
Object o = it.next();//调用一次,指针向后移动一次
}
为什么要将方法抽取到接口中new
迭代器对集合遍历,每一个集合内部的存储结构不同,每个集合存取都不同,如果每个都写在其中,过于臃肿
好处1、声明了规则,只能使用hasNext()和next()
2、代码底层内部实现,使用者无需关系如何实现
--------------------------------------------------------------------------
List集合的特有功能概述和测试
List<T> list = new ArrayList<T>();
Object obj = list.remove(key);//按照序列号返回
删除的时候不能自动装箱,只能当做key来使用
Object obj = list.get(key);
list.set(key,value);
--------------------------------------------------------------------------
并发修改异常产生的原因以及解决方案(迭代器运行过程中,不能够修改)
ConcurrentModificationException并发修改异常
1、采用迭代器修改元素的特有功能 采用ListIterator lit = list.listIterator(); 就可以使用add()方法了
2、采用遍历元素的方法
ListIterator方法
next() hasNext()
preivous() hasPrevious()//直接反向遍历 必须让迭代器指针放置在最后一个元素
--------------------------------------------------------------------------
Vector类的特有功能
Vector v = new Vector()
Enumeration e =v.elements();
while(en.hasMoreElement()){}
--------------------------------------------------------------------------
数组 查询、修改快,增删慢(ArrayList)线程不安全,效率高
数组 查询、修改快,增删慢(Vector)线程安全,效率低
Vector相对于ArrayList查询慢(线程安全)
Vector相对于LinkedList增删慢(数组结构)
链表 查询、修改慢,增删快(LinkedList)线程不安全 效率高
Vector和ArrayList区别
Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高
其中,他们的底层结构都是数组
ArrayList和LinkedList都是线程不安全的
查询多用ArrayList
增删多用 LinkedList
都多使用ArrayList
--------------------------------------------------------------------------
去除ArrayList中重复值
思路是创建新的集合方式
public static ArrayList getSingle(ArrayList list){
ArrayList newList = new ArrayList<>();
Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();
if(newList.contains(obj)){
}else{
newList.add(obj);
}
}
return newList;
}
------------------------------------------------------
如果要去除自定义对象
remove方法和contains方法底层都是用的equals方法,所以对于自定义对象要使用重写equals方法实现该效果
-----------------------------------------------------------------
LinkedList的特有功能
addFirst(E e) addLast(E e)
getFirst() getLast()
removeFirst() removeLast()
get(int index) 这里的index和数组一致
-------------------------------------------------
栈和队列的区别
栈是先进后出,队列是先进先出
利用LinkedList模拟栈
public class Stack{
private LinkedList list = new LinkedList();
//模拟进栈方法
public void in(Object obj){
list.addLast(obj);
}
public Object out(Object obj){
//模拟出栈
return list.removeLast();
}
public boolean isEmpty(){
return list.isEmpty();
}
}
--------------------------------------------------
泛型的优势:<必须存储引用数据类型,并且保证前后数据类型一致>
如果不使用泛型,当强转至某一个对象时,会出现ClassCastException
优势:提高了安全性,省去强转的麻烦,最好不要用Obejct
1 自定义类加泛型
public class A<E>{} 可以指定方法中某些必须调用的类型
2 自定义泛型方法的概述
public void method(E e){}在创建对象使用中,自动使用泛型的类型,方法泛型要和类的泛型一致 如方法自带自己的泛型 public<T> void show(T t){}则可以使用自定义的对象
3 自定义静态方法无法使用类泛型,因为在静态方法中,加载过程中可能还没有对象
静态方法只能使用自己的泛型
public static<W> void show(W w);
自定义泛型接口
interface Inter<T>{
public void show(T t);
}
class Demo implements Inter<String 直接指定类>{}
class Demo<T> implements Inter<T>{}
------------------------------------------------------------------
泛型高级之通配符
泛型通配符<?> 可以替代任意的类型,替代Object不会报错
? extends E 向下限定 E极其子类 使用E类型或者E的子类型
? super E 向上限定 E极其父类
-----------------------------------------------------------------
ArrayList存储字符串字符串并遍历泛型
ArrayList<String> arrayList = new ArrayList<String>();
list.add("");
Iterator<String> it = arrayList.iterator();
while(it.hasNext()){
it.next();//只能调用一次,否则会出现指针后移一位
}
-------------------------------------------------------------------
三种迭代能否删除
1、普通for循环 可以删除,但是索引要-- list.remove(i--)
2、迭代器,可以删除,但是必须使用自身的remove()方法,否则会出现并发异常
3、增强for循环不能删除
------------------------------------------------------------------
JDK1.5 静态导入 导入类中的静态方法
import static 包名,类名,方法 但是会和本类的静态方法出现冲突
JDK1.5 int...arr = int[] arr 并且其可以自动将参数变成数组,该参数必须放在参数列表的最后一个位置(int x,int...x)
-------------------------------------------------------------------
Arrays.asList(T...a) 返回一个受指定数组支持的固定大小的List(这个List不支持增加,删除,其他都可以)
但是使用基本数据类型的数据,放置在list中打印出地是地址
因为list中只能存放引用数据类型,所以默认将基本数据类型的数组当做引用,并打印地址
修改方法就是将基本数据类型改成引用数据类型
集合转数组使用泛型
Integer[] array = list.toArray(new Interger[size]);
当集合转换数组时,数组的长度如果是小于等于集合size()时,转换后的数组长度等于集合的length,如果数组的长度大于size,则分配的数组长度和指定的长度一致
-------------------------------------------------------------------
ArrayList 用增强for遍历,简化遍历,依赖的是迭代器
for(Person person :list){
}
ArrayList嵌套ArrayList
ArrayList<ArrayList<Object>> lists = new ArrayList<ArrayList<Objext>>();