ArrayList集合的使用,随机点名的案例

集合

List接口: 有序的、不唯一

ArrayList:

特点: 有序、不唯一

数据结构: Object数组

ArrayList:包装类
 

作用一:ArrayList是基于Object[]实现的,所以该只能装引用数据类型,基本数据类型要想装进集合,需要将基本数据类型进行类的包装。

作用二:包装类中有将String类型转换为对应的基本数据类型的方法。
 

 ArrayList的基本用法和特点

特点:
    有序的:按照添加的顺序
    不唯一:同一个元素可以装多次
1:如何创建泛型对象
ArrayList<泛型> list=new ArrayList<>();

2:如何添加元素:
一次添加一个元素:
list.add(元素);
一次添加多个元素:
Collections.addAll(集合,元素,元素,...);
3:得到集合元素的个数
list.size();
4:得到某一个元素
list.get(下标);
5:如何判断集合里面是否出现指定元素
list.contains();
6:遍历
for+下标
for(int x=0;x<list.size();x++){
    //x->下标
    //list.get(元素);
}
foreache
for(集合的泛型 x :list){
    //x->元素
}
迭代器********(重点)
for(得到迭代器对象;判断迭代器上面是否还有下一个元素;){
取出下一个元素
  }

for(Iterator<泛型>car=list.iterator();car.hasNext;){
    car.next();->元素
}

 

 ArrayList 如何删除元素:

list.remove(int 下标);
下标指向谁就删除谁,如果下标不存在就抛出异常。
清空集合:list.clear();
list.remove(元素->参照物);
指定元素进行删除
*:一个remove只能删除一个对象。

 

1:ArrayList类里面的remove(元素)的方法
底层需要尊重equals比较机制

当我们想要删除一个元素的时候 底层拿着这个元素
和集合里面的每一个元素做equals比较

2:谁主张谁举证
要被删除的对象会主动调用他自己类的equals方法
和集合里面的每一个元素做比较 

3:当我们使用迭代器遍历集合的过程中 不允许对集合
的整体进行添加、删除操作 否则出发CME异常

如果想要在遍历的过程中进行删除
只能使用迭代器的删除方法:car.remove();

4:构造方法:
ArrayList list = new ArrayList(int 数组空间大小);
ArrayList list = new ArrayList();//数组默认开辟10块空间

集合会自动扩容:
jdk6.0及之前 x * 3 / 2 + 1
10 -> 16 -> 25....

jdk7.0及之后 x + (x >> 1)
10 -> 15 -> 22....

在项目开发的时候 尽量避免扩容:
1:创建一个更大的新的数组对象
2:将老数组里面的元素复制到新数组里面
3:改变引用指向
4:回收老数组对象
5:继续添加元素

扩容:list.ensureCapacity(数组空间)
缩容:list.trimToSize()

*****
Vector语法和ArrayList一模一样的
*********************
面试题:
ArrayList和Vector之间的区别?
1:同步特性不同
Vector同一时间允许一个线程进行访问,效率较低,但是不会发生并发错误。
ArrayList同一时间允许多个线程进行访问,效率高,但是可能会发生并发错误。
***********************
jdk5.0开始 集合的工具类[Collections]里面提供一个方法synchronizedList
   可以将线程不安全的ArrayList集合变成线程安全的集合对象
   于是Vector渐渐被淘汰了
2:扩容不同
ArrayList:分版本
jdk6.0及之前 x * 3 / 2 + 1
jdk7.0及之后 x + (x >> 1)

Vector:分构造方法
Vector(10) -> 2倍扩容 10 -》 20 -》 40...
Vector(10,3) -> 定长扩容 10 -》 13 -》 16...

3:出现的版本不同
  Vector:since jdk1.0
  ArrayList:since jdk1.2
 **************************************
 LinkedList语法和ArrayList一模一样
面试题: 
    ArrayList和LinkedList之间的区别?
     ArrayList和LinkedList底层数据结构不同 导致优劣势不同 
     ArrayList:底层是基于数组实现的
    优点:随机访问 遍历查找效率高
    缺点:添加删除元素的时候效率低
     LinkedList:底层是基于链表实现的

     优点:添加删除元素的时候效率高。
     缺点:随机访问 遍历查找效率低[从下标0开始找起]
**************************
Stack: 用数组模拟栈结构

代码:

 

import java.util.*;
public class Daycare{
   public static void main(String[] args){
	   //ArrayList  Collections.addAll(集合,元素,....)
	   //创建一个集合对象装名字
	   ArrayList<String> list=new ArrayList<>();
	   //一次添加一个元素的方式:添加:Andy   Lee
	   Collections.addAll(list,"Andy","Lee");
	   //统计集合里面有几个人的姓名
	   System.out.println("人的个数:"+list.size());
	   //打印第一个人的姓名
	   System.out.println("第一个人的名字:"+list.get(0));
	   //判断集合里面是否出现Lee的名字
	   System.out.println(list.contains("Lee"));
	   //使用两种不同的方式打印 所有以A开头的名字
	   for(String name:list){
		   if(name.charAt(0)=='A'){
			   System.out.println(name);
			   }
		   }
       for(String name:list){
		   if(name.startsWith("A")){
			   System.out.println(name);
			   }
		   }
      //用迭代器
      for(Iterator<String> car=list.iterator();car.hasNext();){
		  String name=car.next();
		  if(name.startsWith("A")){
			  System.out.println(name);
			  }

		  }
	   }
}
import java.util.*;
public class Daycare{
   public static void main(String[] args){
	   //老筐 里面装的水果 有些重复的
	   ArrayList<Integer> list=new ArrayList<>();
	   Collections.addAll(list,56,77,77,90,56,28);
	   ArrayList<Integer>list1=new ArrayList<>();
	   //将重复元素去除
	   for(Integer i:list){
		   if(!(list1.contains(i))){
		       list1.add(i);
		   }
		 }
		System.out.println(list1);
	   }
}

随机点名的案例:

        ArrayList<String>  list=new ArrayList<>();
        list.add("zs");
        list.add("ls");
        list.add("lucy");
        list.add("jack");
        System.out.println(list);
        list.add(2,"马云");
        System.out.println(list);
        System.out.println(list.get(0));
       //使用Arrays把数据转换成集合 这是一个固定格式
        List<String>  list01= Arrays.asList("张三","李四","王五");
        //通过构造方法创建名单集合 ,吧list集合中元素一一取出存入names结合中;
         ArrayList<String>  names=new ArrayList<>(list01);
        //综合案例: 使用Scanner 、Random、ArrayList完成一个不重复的点名程序
               //随机点一个人
        Random random=new Random();
        Scanner sc=new Scanner(System.in);
        while (true){
            if(names.size()==0){
                System.out.println("点名结束,请重新开始");
                break;
            }
            System.out.println("点名输入Y/y");
            String input=sc.next();//获取用的输入
            if(input.equals("Y")||input.equals("y")){
                int index=random.nextInt(names.size());
                String name=names.get(index);
                System.out.println(name+"为天选之人");
                names.remove(index);
            }else{
                System.out.println("点名抽查,欢迎下次使用");
                break;//结束循环
            }
            }
            //关闭资源
               sc.close();
            }
}

运行结果:

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值