Java高级运用(集合)

集合

什么是集合?

(1)同一类事物放在一起组成的集合;数据类型为引用数据类型;是与数组最大的区别
(2)集合的底层是数组,是一个动态的数组

集合分类

(1)List:有序可重复
(2)Set:无序不重复

他们都是接口;父类都是Collection

List常见的实现类:(常用)

(1) ArrayList(数组实现)
(2)LinkedList(链表实现)

Set常见的实现类:(不常用)

(1)HashSet (哈希表实现)
(2)TreeSet (二叉树实现)

ArrayList

什么是ArrayList

实现(implements)了List接口(List接口继承了Collection)

一个类实现了一个接口,那么就要重写接口里的(抽象)方法,接口里的方法就都有了。接口中全是抽象方法

书写格式

new ArrayList<数据类型>();
<>中放的就是泛型,指的就是集合里面放入的数据类型
<>中放指定的数据类型,只能放入该数据类型的数据,那么取出来的时候也是这种数据类型。

例:

ArrayList<String> staff = new ArrayList<>();

增删改查

(1)底层是数组(Object[])
(2)元素个数:size()方法
(3)增:add(元素):数组的长度和size()不是一回事,如果size()小于数组长度,直接将元素放入到数组里面;如果size()等于数组的长度,自动扩容两倍
(4)删:remove(元素) 删除第一次出现的元素
remove(索引) 删除指定索引位置的元素
(5)改:set(索引,元素)
(6)查:get(索引)

new IllegalArgumentException("Illegal Capacity: "+initialCapacity); 非法参数异常

ArrayList和LinkedList的区别

(1)底层数据结构不一样 (数组,链表)
(2)ArrayList 查询快,增删慢
(3)LinkedList 查询慢,增删快

泛型的好处

(1)省去了从集合中取出数据时的强制类型转换。
(2)加了泛型,就会要求我们放入数据的时候,只能放入该数据类型的数据,那么取出来的时候也是这种数据类型。
(3 )<> 放指定的数据类型

案例

今天公司要招入4个员工,先把之前的员工存储进集合在添加新入职员工
今天公司由于项目不景气准备裁员2名业绩不好的人员。
由于公司要加入4名新员工,所以公司决定裁掉年龄大于35岁的员工


public class Staff03 {
    private String name;
    private double price;
    private int age;

    public Staff03() {
    }

    public Staff03(String name, double price, int age) {
        this.name = name;
        this.price = price;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Staff03{" +
                "name='" + name + '\'' +
                ", price=" + price +
                ", age=" + age +
                '}';
    }
}


import java.util.ArrayList;

public class Firm03 {
    public static void main(String[] args) {
        ArrayList<Staff03> staff = new ArrayList<>();
        staff.add(new Staff03("张三",20000,30));
        staff.add(new Staff03("李四",15000,36));
        staff.add(new Staff03("王五",21000,31));
        staff.add(new Staff03("赵六",25000,20));
        staff.add(new Staff03("孙七",23000,40));
        staff.add(new Staff03("周八",12000,20));
        //冒泡排序
        for (int i = 0; i < staff.size()-1; i++) {
            for (int j = 0; j < staff.size()-1-i; j++) {
                if (staff.get(j).getPrice() > staff.get(j+1).getPrice()){
                    Staff03 temp = staff.get(j);
                    staff.set(j,staff.get(j+1));
                    staff.set(j+1,temp);
                }
            }
        }
        System.out.println(staff);
        Staff03 staff01 = staff.remove(0);
        Staff03 staff02 = staff.remove(0);
        System.out.println("被辞职的员工:" + staff01);
        System.out.println("被辞职的员工:" + staff02);
        System.out.println(staff);

        //年纪大于35的被辞退
        for (int i = staff.size()-1; i >= 0; i--) {
            if (staff.get(i).getAge() > 35){
                Staff03 remove = staff.remove(i);
                System.out.println("被辞退的35岁的:" + remove);
            }
        }
        System.out.println(staff);
    }
}


HashSet

什么是HashSet

无序(没有索引) 不重复(可以去重)

增删

(1)增:add(元素)
(2)删:remove(元素)
(3)清空:clear()

增强for循环,去重

增强for循环

//格式
for(数据类型 变量: 集合名称){
使用变量
}

去重
构造方法里面可以放集合,思路就是先把list转成set去重,然后再转成list
例:

ArrayList<String> names = new ArrayList<>();
        names.add("张三");
        names.add("李四");
        names.add("张三");
        names.add("王五");
        names.add("赵六");
        // 1、创建一个HashSet  
        //2、将ArrayList中的元素全部放入HashSet中  
        //3、将HashSet中的元素全部放入ArrayList中
        HashSet<String> set1 = new HashSet<>(names);
        names = new ArrayList<>(set1);
        System.out.println(names);
       

for与foreach的区别

(1)、for可以操作索引,但是语法结构相对复杂
(2)、foreach不可以操作索引,但是语法结构相对简单

HashSet和HashTable的区别

(1) HashSet是线程不安全的,效率高,允许空(null)值
(2) HashTable是线程安全的,效率低,不允许空(null)值

HashMap(字典)

什么是HashMap

经常被叫做双列组合但没有这个概念

增删改查

(1)增:put(键值,第二个值)
(2)改:put(键值,第二个值) 键值是唯一的可以修改键值后面的数
(3)删:remove(键值) ;通过键值删除内容
(4)查:get(键值);通过键值查看内容

jdk8HashMap底层

数组+链表+红黑树
(1)HashMap负载因子: 0.75 元素个数超过数组长度的0.75倍,数组就会扩容2倍大小
(2)链表的长度超过8,链表就会转换成红黑树;红黑树的长度小于6,红黑树就会转换成链表。
(3)HashMap的初始容量: 16

案例

今天公司要求统计每个人的身份证号码

import java.util.HashMap;
import java.util.Set;

public class IdentityCard03 {
    public static void main(String[] args) {
        HashMap<String, String> staff = new HashMap<>();
        staff.put("123456123456123456","张三");
        staff.put("789456754145321574","李四");
        staff.put("456789465678946789","王五");
        staff.put("123456123456123456","王五");
        Set<String> keySet = staff.keySet();
        for (String key : keySet){
            System.out.println("身份证:" + key + " 名字:" + staff.get(key));
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值