zoukankan      html  css  js  c++  java
  • Collection、List、Set

    1.ArrayList继承了AbstractList同时又实现接口List,而List接口又继承了Collection接口,Collection是集合中最顶层的接口了;Collection是所以集合的祖宗
    2.List接口:怎么存就怎么取,有数组下标,可以存重复元素: 常有的类:ArrayList类; LinkedList类;
    3.Set接口:怎么存的不一定怎么取,没有数组下标,不可以存重复数据 ;常有的类:HashSet类、 LinkedHashSet类
    4.Collection是接口不能new对象所以的多态借用子类对象:Collect<泛型> 变量名=new ArrayList<泛型>();
    5.ArrayList<Person> list=new ArrayList<Person>();添加元素:list.add(new Person("小明",12));new Person("小明",12)这里直接添加了Person对象,因为重写构造方法所以直接赋值
    6.System.out.println(list.get(i)) 如果Person类中没有重写toString方法那么这里打印的是地址;但是Person重写了tostring方法那么这里打印的方法内的内容
    7.Collection<Integer> col=new ArrayList<Integer>();因为Collection是接口不能new对象所以这里借用了子类ArrayList创建对象,是多态
    Collection的基本操作:1.添加元素:col.add(123);2.删除元素:col.remove(123);这里删除直接写集合内要删除的内容不需要写下标
    3.清空集合:col.clear;把集合中的内容删了,但是集合还在
    8.因为Collection是接口不能new对象所以的向下转型才能遍历集合:
    if(col Instanceof ArrayList){ ArrayList<Integer> arr=(ArrayList<Integer>)col; for(int i=0;i<arr.size();i++){system.out.println(arr.get(i))}
    9.判断集合中是否有某个元素:boolean flag=col.contains(999);
    10.集合转为数组:Object arr=col.toArray();因为Collection的.toArray()方法返回值是Object所有用Object arr接
    再进行遍历取值:for(inti=0;i<arr.length;i++){system.out.println(arr[i])};
    11.Collection获取集合内的元素是通过迭代器实现的:迭代器对象Iterator会先对Collection进行判断用.hasnext()方法进行判断如果有就返回true没有就返回false;
    如果.hasNext()返回的是true那么再调用.next()方法把Collection中的值取出来,迭代器取值是判断一次去一次值;然后再判断再取值
    12.Collection<String> col=new ArrayList<String>(); it.add("你好");
    取值需要先获取迭代器对象:Iterator<String> it=col.iterator();调用Collection的对象col调取iteartor()方法获取迭代器对象;再赋值给it;迭代器Iterator的泛型要和 Collection要被遍历的集合一样;it.hasNext()是判断集合中是否还有值有就返回true再调用it.next()方法取值,没有就返回false然后结束
    13.利用迭代器循环取值:while(it.haxnext()){system.out.println(it.next())};while循环里面条件只有true和false那么默认就true所以it.haxnext()就是it.haxnext()==true
    14.利用判读字符内容来取值:while(it.hasnext()){String str="哪吒";if(str.equals("哪吒")){system.out.println(str)}判断字符是哪吒后再输出;一定先定义和变量;再判断输 出变量;因为collection是先判断有没有值然后再取值的所以的先定义个变量str接收了才能保存住要不然输出的是下一个值
    15.Collection col=new ArrayList();//如果不加泛型,就可以什么都向集合存
    col.add(123);//不加泛型系统自动把值提升为object类型
    col.add("123");
    col.add(123.456);
    //获取迭代器对象
    Iterator it=col.iterator();//因为上面的集合没写泛型所以这里迭代器对象也不写泛型
    while(it.hasNext()){
    Object obj=it.next();//因为集合里没写泛型值都生成Object;所以这里也用Object来接
    if(obj instanceof String){
    String s=(String)obj;//转成字符串
    System.out.println(s.length());
    }
    }
    16.增强for:专门用来变量数组和集合的(没有下标)不能打印有下标的集合数组(打印1-100的值);它的内部原理是迭代器Interator,所以在打印过程中不能对集合中的元素
    进行增删,但可以修改;只要不改变集合/数组的长度都行.
    格式:for(要遍历的元素类型(Person) 变量名(p): Collection集合or数组(arr)){system.out.println("p")};
    增强for和老式的for循环的区别:增强for的循环必须要有目标,且目标只能是Collection的数组和集合,在遍历时如果只是对数组和集合进行遍历那么就用增强for
    如果还需要对数组和集合的元素进行操作那么就用老式for循环,通过对下标的操作进行增删改;
    17.public static void main(String[] args){
    Collection<Person> col=new ArrayList<Person>();
    col.add(new Person("小明",20));col.add(new Person("小红",18));
    for(Person s:col){ 内置原理是迭代器Interator,先判断col集合里面是否有值(has.next())再进行取值(.next())然后把取到的值赋给s;再打印是;然后再判断,再取值,再复制,打印
    system.out.println(s)}增强for和迭代器不能增删但是可以修改,只有不改变集和的长度就行,如果想增删改就用老式for,因为增强for和迭代器一样一直往下走不能回头,就不能改变长度
    这里是增强for打印自定义的Person类,把col的值赋值到Person类型的p对象里面,然后再打印p,因为Person重写了toString()方法所以这里打印的toString()方法里面的内容而不是地址
    18.用一个方法遍历多种Collection集合,(通配符<?>;当做泛型)
    public static void main (String[] args){
    Collection<Person> col=new ArrayList<Person>();col.add(new Person("小明",20);col.add(new Studemt("小红",19));
    Collection<Student> col2=new rrayList<Student>();col.add(new Student("小黑",10));col.add(new Student("小蓝",20));
    调用同一个get()方法进行遍历: get(col);get(col2);}
    public static void get(Collection<?> col){// (Collection<?> col)中的?是通配符,在不知道泛型是什么的时候就有?代替泛型这样就能调用多种collection泛型的集合
    Interator it=col.iterator(); 曾强for不能遍历带有通配符?的集合,因为增强for不认识通配符?;只能用迭代器进行遍历
    while(it.hasnext()){system.out.println(it.next());}
    public static void main(String[] args) {
    Collection<Cook> col1=new ArrayList<Cook>();
    col1.add(new Cook());
    Collection<Waiter> col2=new ArrayList<Waiter>();
    col2.add(new Waiter());
    Collection<Scanner> col3=new ArrayList<Scanner>();
    //调一个方法遍历集合
    get(col1);
    get(col2);
    //get(col3);
    }
    public static void get(Collection<? extends Emp> col){ 就是extends表示必须是继承Emp的子类和Emp才能传过来;super意思是Emp是这个父类最底层的子类,只能是Emp的父类们 (父类,爷爷类)和它自己Emp才能传过来
    Iterator<?> it=col.iterator();//Collection<? extends Emp>这里是传的继承Emp的子类及其Emp;是上限的意思;上限时Emp
    while(it.hasNext()){ //Collection<? super Emp>这里传的是Emp的父类及其Emp;是下限的意思;下限时Emp
    System.out.println(it.next());//因为不设置上下线有通配符?存在所以传什么类都行,这样就进行了限制
    }
    }
    19.List的特点:有下标,怎么存的怎么取出来,可以存重复值;用户可以根据元素插入集合中的位置准确的找到相关元素,并通过下标对存进去的元素进行操作
    20.List接口的子类:ArrayList(查询用的多)和LinkedList(存储用的多);
    21.从Collection继承来的方法带有下标的就是List独有的方法
    22.List及其子类的存储的特点:堆栈: 1.先进后出(就是在它后面存进去的集合在提取时先被依次取出,待它们取出结束后再取出)
    压栈的入口和出口都是栈的顶端位置; 压栈:就是存入元素; 弹栈:就是取出元素
    队列:1.先进先出(存进去的元素要在它前面的元素依次取出后才能取出); 2.入口,出口各占一侧
    23.数组类型的数组集合(ArrayList):1.查找元素快(通过索引可以快速的找到指定位置的元素;因为有下标所以查询快)
    增删元素慢:因为它的长度不可改变,增加或删除一个元素时需要先创建一个新的数组,然后把增加或删除后的数组整个粘进去
    链表类型的数组集合(LinkedList):由数值域+指针域(存的是下一个元素的地址)组成;多个元素节点之间通过地址链接
    1.查找元素慢(因为没有下标,得通过地址一个一个找);想查找某个元素,需要通过连接的节点,依次向后查找指定元素
    2.增删速度快:因为新增或者删除一个元素直接改变元素链接的下一个地址就行;
    24.ArrayList是数组类型的集合:查询速度快,增删速度慢,所以多用ArrayList集合存储经常需要查询的数据;多用于查询业务。
    、 25.LinkedList是链表类型的集合:增删速度快,查询速度慢,所以多用LinkedList进行存储业务
    26.5.6 Vector集合;就是早期的ArrayList(方法也一样)(和ArrayList一样都是数组类型的);枚举就是现在的迭代器(方法也一样)
    27.List:
    public static void main(String[] args){
    List<String> list=new ArrayList<String>();因为List是接口不能直接new对象需要借助多态,借助子类ArrayList进行new对象
    list.add("a");
    list.add(0,"b");在指定位置插入元素,在下标0的位置插入元素b
    list.add("c"); 遍历:for(int i=0;i<list.size();i++){system.out.println(list.get(i)};因为List具有下标,可以用老式for进行循环取值
    删除指定位置的元素,这里str是返回值,是把删除的元素返回回来了,str就是删除的那个值
    String str=list.remove(2);因为这里的返回值是泛型,而List的泛型是String,所以这里用String str来接, .remove(下标),这里的下标填的谁就删除水
    修改指定位置上的值: list.set(0,"你好//通过下标值来修改元素;将b改成了 你好")
    遍历;因为这里只是取值并不对值进行增删操作不该变集合的长度,所以可以用增强for
    for(String s:list){system.out.println(s)}

    28.LinkedList:public static void main(String[] args){
    LinkedList<String> arr=new LinkedList<String>();
    arr,addFrist("a"); .addFrist()是把元素添加为第一个元素的意思,但是后来调用的.addFrist()方法的元素会替代之前用的或者现有的第一个元素
    arr.addFrist("b");
    arr.addLast("c"); .addLast()是把元素添加为最后一个元素的意思,但是后来调用的.addLast()方法的元素会替代之前或者现有的最后一个元素
    arr.addFrist("d");
    for(String s:arr){system.out.println(s)}//结果d,b,a,c
    移出第一个位置的元素
    arr.removeFrist() 删除第一个位置的元素
    得到最后一个元素.getLast():system.out.println(arr.getLast());
    //判断集合中是否有元素:system.out.println(arr.isEmpty());结果是false,isEmpty()是判断集合是否为空是否没有值,所以是false如果没有值就返回true

  • 相关阅读:
    CORS跨域资源共享漏洞
    Linux Restricted Shell Bypass
    无情一点并没有错
    [机器学习]numpy broadcast shape 机制
    Chrome和IE的xss过滤器分析总结
    php使用substr中文乱码问题
    mac下自定义伪协议配置
    【转】前端黑魔法之远程控制地址栏
    Windows可信任路径代码执行漏洞
    小记一次mysql启动失败没有日志的处理
  • 原文地址:https://www.cnblogs.com/hankai2735/p/11331861.html
Copyright © 2011-2022 走看看