zoukankan      html  css  js  c++  java
  • java基础:13.1 集合框架

    1、ArrayList

    java基础:6.0 ArrayList 中,初步了解了ArrayList,知道了ArrayList的特点:

    1. ArrayList 的大小灵活,所以无须提前给定它的大小。而当创建一个数组时,它的大小必须给定。
    2. ArrayList 包含许多有用的方法。比如,可以使用contains 方法来测试某个元素是否在列表中。如果使用数组,则需要编写额外代码来实现该方法。
    3. 元素必须是一种对象,不能是int,double…,可以是Integer.
    4. ArrayList 可以用来存储多个自定义的对象
    {
        ...
        ArrayList<String> cityList = new ArrayList<>();   
        // <>中的元素必须是一种对象,不能是int,double..,可以是Integer.
        cityList.add("London");
        ...
        cityList.add("Miami");
        System.out.println(cityList.Size() + cityList.contains("Miami") + cityList.remove("Miami");
        System.out.println(cityList.toString());   //  == System.out.println(cityList);
    }
    

    2、特点

    以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组。
    按数组下标访问元素–get(i)/set(i,e) 的性能很高,这是数组的基本优势。
    直接在数组末尾加入元素–add(e)的性能也高,但如果按下标插入、删除元素–add(i,e), remove(i), remove(e),则要用System.arraycopy()来移动部分受影响的元素,性能就变差了,这是基本劣势。

    3、和数组的区别

    在这里插入图片描述
     

    4、常用的方法

    在这里插入图片描述

    toArray 可以把一个ArrayList对象转换为数组。

    需要注意的是,如果要转换为一个Hero数组,那么需要传递一个Hero数组类型的对象给toArray(),这样toArray方法才知道,你希望转换为哪种类型的数组,否则只能转换为Object数组。

            ArrayList heros = new ArrayList();
            
            // 初始化5个对象
            for (int i = 0; i < 5; i++) {
                heros.add(new Hero("hero " + i));
            }
            Hero specialHero = new Hero("special hero");
            heros.add(specialHero);
            System.out.println(heros);
            
            Hero hs[] = (Hero[])heros.toArray(new Hero[]{});
            System.out.println("数组:" + hs);
    

    addAll 把另一个容器所有对象都加进来.
    heros.addAll(anotherHeros);
     
     

    5、使用泛型与不使用泛型

    学习别人的程序时发现有人是第一种写法,有人是第二种。

    1. ArrayList heros = new ArrayList();
      对于不使用泛型的容器,可以往里面放英雄,也可以往里面放物品
      heros.add(new Hero(“盖伦”));
      heros.add(new Item(“冰杖”)); // 放别的类的对象并不会报错

    2. ArrayList<Hero> heros = new ArrayList<>();
      使用泛型后, heros.add(new Item(“冰杖”));则会系统报错,因此此时只可以放属性是Hero的对象,或者Hero的子类

    3. 如果要求ArrayList只能放两种对象,则可以把这两个对象继承在同一个父类。利用了2中的知识点。

     
     

    6、遍历

    有三种方法。

    for 用for循环遍历

    iterator 迭代器遍历

    for: 用增强型for循环

    package collection;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    
    
    public class TestCollection {
    
        public static void main(String[] args) {
    
    
            ArrayList<Hero> heros = new ArrayList<>();
            
            // 初始化5个对象
            for (int i = 0; i < 5; i++) {
                heros.add(new Hero("hero " + i));
            }
            
            Hero specialHero = new Hero("special hero");
            heros.add(specialHero);
            System.out.println(heros);
            
            // 第一种遍历 for循环
            System.out.println("--------for 循环-------");
            for (int i = 0; i < heros.size(); i++) {
                Hero h = heros.get(i);
                System.out.println(h);
            }
            
            //第二种遍历,使用迭代器
            System.out.println("--------使用while的iterator-------");
            Iterator<Hero> it= heros.iterator();
            //从最开始的位置判断"下一个"位置是否有数据
            //如果有就通过next取出来,并且把指针向下移动
            //直到"下一个"位置没有数据
            while(it.hasNext()){
                Hero h = it.next();
                System.out.println(h);
            }
            //迭代器的for写法
            System.out.println("--------使用for的iterator-------");
            for (Iterator<Hero> iterator = heros.iterator(); iterator.hasNext();) {
                Hero hero = (Hero) iterator.next();
                System.out.println(hero);
            }
    
            // 第三种,增强型for循环
            System.out.println("--------增强型for循环-------");
            for (Hero h : heros) {
                System.out.println(h);
            }
        }
         
    }
    

    7、练习

    练习1 -判断是否相同
    如果就是要判断集合里是否存在一个 name等于 "hero 1"的对象,应该怎么做?
    疑问 为什么方法1和方法2的答案不一样???

    package collection;
    
    import java.util.ArrayList;
    
    
    public class TestCollection {
    
        public static void main(String[] args) {
    
    
            ArrayList<Hero> heros = new ArrayList<>();
            
            // 初始化5个对象
            for (int i = 0; i < 5; i++) {
                heros.add(new Hero("hero " + i));
            }
            
            Hero specialHero = new Hero("special hero");
            heros.add(specialHero);
            System.out.println(heros);
            
            Hero testhero = new Hero("hero 1");
            for(Hero h: heros) {
            	if ( h.getName() == testhero.getName() )
            		 System.out.println("存在");
            	else System.out.println("不存在");
            }
              
            System.out.println("方法2");
        
           for(int i=0 ; i<heros.size(); i++) {
        	   if(heros.get(i).toString().equals("hero 2"))
        		   System.out.println("存在");
           }
        }     
    }
    

    练习2 - 首先初始化一个Hero集合,里面放100个Hero对象,名称分别是从
    hero 0
    hero 1
    hero 2

    hero 99.
    通过遍历的手段,删除掉名字编号是8的倍数的对象

    public class TestCollection {
        public static void main(String[] args) {
            ArrayList<Hero> heros = new ArrayList<>();        
            // 初始化5个对象
            for (int i = 0; i < 100; i++) {
                heros.add(new Hero("hero " + i));
            }        
            for(int i=0; i < heros.size();i++) {
            	int n = Integer.parseInt(heros.get(i).getName().substring(5));
            	if( n%8 ==0 )
            		heros.remove(i);
            }
            
            for(Hero a:heros)
            	System.out.println(a);
            
        }     
    }
    
  • 相关阅读:
    一文读懂网管协议
    Python 3.8 离线安装
    Redis 6.X 离线安装
    ES 日期格式影响聚合效果
    (1)Canal入门
    (10)MySQL进阶篇SQL优化(InnoDB锁-间隙锁)
    (9)MySQL进阶篇SQL优化(InnoDB锁-记录锁)
    (8)MySQL进阶篇SQL优化(InnoDB锁-共享锁、排他锁与意向锁)
    (7)MySQL进阶篇SQL优化(InnoDB锁-事务隔离级别 )
    (6)MySQL进阶篇SQL优化(MyISAM锁)
  • 原文地址:https://www.cnblogs.com/l20902/p/10610878.html
Copyright © 2011-2022 走看看