java学习--集合

news2024/9/20 14:57:25

集合简介

关系示例图

Collection接口实现类的特点

Collection接口常用方法

Collection接口遍历元素方式:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!

*/public class Main {
    public static void main(String[] args) {
        Collection List=new ArrayList();
        List.add(new Book("小米","雷军",28.9));
        List.add(new Book("小米","雷军",28.9));
        List.add(new Book("小米","雷军",28.9));
        List.add(new Book("小米","雷军",28.9));
        Iterator iterator=List.iterator();//返回List的迭代器(Iterator)
        while (iterator.hasNext())//判断返迭代器中下一个是元素还是抛出异常,是元素返回true
        {
            Object object=iterator.next();//返回下一个元素,返回类型是Object
            System.out.println(object);
        }
        //增加for循环,底层仍然是迭代器
        for (Object book:List)
            System.out.println(book);

    }
}
class Book{
    private String name;
    private String author;
   private double price;

    public Book(String name, String author, double price) {
        this.name = name;
        this.author = author;
        this.price = price;
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

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

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

List接口常用方法

package com.List;

import java.util.ArrayList;
import java.util.List;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
*/public class test {
    public static void main(String[] args) {
        List list= new ArrayList();
        list.add("续爱");
        list.add("小美");
        System.out.println(list);//[续爱, 小美]
        System.out.println(list.get(1));//小美可获取对应下标序列的数据
        //1表示加入的数据插入的位置下标
        list.add(1,"续期");
        System.out.println(list);//[续爱, 续期, 小美]
        List list1=new ArrayList();
        list1.add("小怒");
        //在指定位置插入另一个集合
        list.addAll(0,list1);
        System.out.println(list);//[小怒, 续爱, 续期, 小美]
        System.out.println(list.lastIndexOf("小怒"));//最后一次出现的位置(下标)
        System.out.println(list.indexOf("小怒"));//第一次出现该数据的位置(下标)
        list.remove(0);//移除指定下标的数据
        System.out.println(list);//[续爱, 续期, 小美]
        list.set(2,"梦里");//指定位置的数据替换成我们现在输入的数据
        System.out.println(list);//[续爱, 续期, 梦里]
        System.out.println(list.subList(0,2));//[续爱, 续期]从0号下标的数据到2号下标前一位数据。

    }
}

例题:

package com.List.test01;

import java.util.ArrayList;
import java.util.List;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
ListExercise.java
●添加10个以上的元素(比如String"hello”),在2号位插入一个元素“韩顺平教
育”,获得第5个元素,删除第6个元素,修改第7个元素,在使用迭代器遍历集
合,要求:使用List的实现类ArrayList完成。
*/public class test01 {
    public static void main(String[] args) {
        List list= new ArrayList();
        list.add("美女");
        list.add("帅哥");
        list.add("小胡");
        list.add("小美");
        list.add("东东");
        list.add("美女");
        list.add("帅哥");
        list.add("小胡");
        list.add("小美");
        list.add("东东");
        list.add(1,"韩顺平");
       list.get(4);
       list.remove(5);
        list.set(6,"小敏");
        for (Object o :list) {
            System.out.print(o+" ");

        }


    }
}
List三种遍历方法

package com.List.test02;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
使用List的实现类添加三本图书,并遍历,打印如下效果

名称:xx
名称:xx
名称:xx
要求
1)按价格排序,从低到高(使用冒泡法)
2)要求使用ArrayList、LinkedList 和 Vector三种集合实现

*/public class test02 {
    public static void main(String[] args) {
      List list=  new ArrayList();
      list.add(new Book("小米","雷军",1999));
      list.add(new Book("泪目","设计",1234));
      list.add(new Book("箱子哦","啊上档次",120));
      manner_(list);
    }
    static void manner_(List list)
    {
        for(int i=0;i<list.size()-1;i++)
        {
            for(int j=0;j<list.size()-1-i;j++)
            {

                Book o=(Book)list.get(j);
                Book o1=(Book)list.get(j+1);

                if (o.getPrice()>o1.getPrice())
                {
                    list.set(j,o1);
                    list.set(j+1,o);

                }


            }
        }
        Iterator iterator=list.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);
        }
    }
}
class Book{
    private String name;
    private String author;
    double price;

    public Book(String name, String author, double price) {
        this.name = name;
        this.author = author;
        this.price = price;
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

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

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

ArrayList注意事项

ArrayList源码

调用ArrayList无参构造器的源码代表此时的elementData为默认的一个elemenData深入可发现目前就是空的一个数组

ensuCapacityInternal()确认容量是否够,然后再赋值

ensuCapacityInternal()方法内容是先判断elementData是否空数组,是就给你添个扩容值。扩容值从与minCapacity中选大的那个,而此时默认值是10,minCaoacity是我们上面那步传进来的1,所以再调用ArrayList无参构造器时,第一次添加给的容积为10,确定了扩容值后再来到该方法确定是否真的要扩容

modCound++表示当前集合修改的次数,再往下的判断表示,要扩容的值是否能被当前有的容积容纳,当前的容积是否够,如果大于0代表不够,开始扩容

来到扩容的方法,表示,新的容积等于当前的容积加上当前的容积除以2(向右移一位)也就是扩成当前的1.5倍,再来判断,新的是否小于之前需要的容量,小于那么就让新的容量变成需要的容量

然后开始扩容数组,

使用copyof()来完成这个方法是因为他不会覆盖原有的值进行扩容

要去掉该选项,不然Debug会阉割数据

走有参构造器的ArrayList,创建一个指定大小的数组

Vector介绍

Vector与ArrayList比较

使用无参构造器,底层默认给你十个容量

到加数据的方法add,modCount也是记录修改的次数。然后ensureCapcityHelper是确定需要的空间和已有的空间匹不匹配。如果大于零则不够需要扩容

判断capacityIncrement是否大于0.如果不大于0则就是oldCapacity加oldCapacity为当前容量,也就是所说的按2倍扩容。

有参构造器

LinkedList介绍

底层解析

链表调用无参构造器删除的是第一个节点

ArrayList与LinkedList比较

Set接口

Set接口常用方法

HashSet介绍

底层机制介绍

占位作用

得到传进来的数的hash值,这个值决定着数存放的位置

package com.test01;

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
定义一个Employee类,该类包含:private成员属性name,age要求:
1.创建3个Employee放入HashSet中
2.当name和age的值相同时,认为是相同员工,不能添加到HashSet集合中
*/public class test01 {
    public static void main(String[] args) {
       HashSet set = new HashSet();
        System.out.println(set.add(new Employee("小米",18)));
        System.out.println(set.add(new Employee("小米",18)));

    }
}
class Employee{
    private String name;
    private int  age;

    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return age == employee.age && Objects.equals(name, employee.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
package com.test02;

import java.util.HashSet;
import java.util.Objects;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
定义一个Employee类,该类包含:private成员属性name,sal,birthday(MyDate类
型),其中birthday为MyDate类型(属性包括:year,month,day),要求:
1.创建3个Employee放入HashSet中
2.当name和birthday的值相同时,认为是相同员工,不能添加到HashSet集合中
*/public class test02 {
    public static void main(String[] args) {
        //Employee employee = new Employee("小美", "女", new Employee.myDate(2003, 1, 1));
        HashSet set = new HashSet();
        System.out.println(set.add(new Employee("小美", "女", new Employee.myDate(2003, 1, 1))));
        System.out.println(set.add(new Employee("小美", "女", new Employee.myDate(2003, 1, 1))));


    }

}
class Employee{
    private String name;
    private String sex;
    myDate birthday;
    static class myDate{
        private int year;
        private int month;
        private int day;

        public myDate(int year, int month, int day) {
            this.year = year;
            this.month = month;
            this.day = day;
        }

        public int getYear() {
            return year;
        }

        public void setYear(int year) {
            this.year = year;
        }

        public int getMonth() {
            return month;
        }

        public void setMonth(int month) {
            this.month = month;
        }

        public int getDay() {
            return day;
        }

        public void setDay(int day) {
            this.day = day;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            myDate myDate = (myDate) o;
            return year == myDate.year && month == myDate.month && day == myDate.day;
        }

        @Override
        public int hashCode() {
            return Objects.hash(year, month, day);
        }
    }

    public Employee(String name, String sex, myDate birthday) {
        this.name = name;
        this.sex = sex;
        this.birthday = birthday;
    }

    public Employee(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return Objects.equals(name, employee.name) && Objects.equals(sex, employee.sex) && Objects.equals(birthday, employee.birthday);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, sex, birthday);
    }
}

 TreeSet解析

解析:

TreeSet底层是TreeMap,

使用add()方法添加数据时,使用m调用了方法put()

将需要传入的数据传入方法p)中,以及为支持映射的对象关联的虚拟值。

进入put(K key, V value)方法后,又调用了,put(K key, V value,replaceOld),值得一提的是,此时的key为传入的值,value为

再然后进入到put(K key, V value,replld)方法,创建一个类型的t用来指向前面创建得同类型的root,root默认值为null所以此时,t也为null,所以可以进入下面的判断语句,该判断语句内调用了方法

进入该方法先是将传入的key传入中,传入第一个数据进入该方法其实是为了判断传入的是否为null值此时的key的值都为传入的数据“ab”,进入该方法内,我们需要判断comparator是否为null,注该变量是初始值是随机生成的,每次都不太一样,但尽管如此,也都不为null,所以在该方法就需要返回这部分的结果,因为我们在之前创建Comparator对象时重写了Comparator的compare()方法,所以这时调用的就是重写的这个方法进行比较,传入的值

重写的方法调用了该方法进行比较,比较方法是拿到字符串底层的数组value,然后将v1和v2数组指向需要比较的两个字符串的ASCII值,注意JDK9之后由byte类型的数组来存储String,维护了一个属性coder,它是一个编码格式的标识,使用LATIN1还是UTF-16,这个是在String生成的时候自动的,如果字符串中都是能用LATIN1就能表示的就是0,否则就是UTF-16.显然我们得例子这次都可以使用LATIN1,所以c判断为真,

进入

该方法拿到两个数组的长度,然后又调用了

这个方法首先调用Math类的min方法拿到两个数组长度中较小的值,然后作为遍历的结束因素,然后进入for循环,开始逐个数据逐个数据比较,如果,两个数组当前的数据不相同,则进入判断返回两个数据的ASCII值的差数,如果知道遍历结束都没有进入if判断,则直接返回两个数组的长度差

经过层层调用比较又回到了这,新建一个Entry对象,并且将我们传入的值key和value传入新建的这个对象,此时这个对象里的key为“ab”,value的值为,parent的值为null。

然后将为null的root指向他,​​​​​​​此时,完成了数据的存放,所以记录数据个数的size赋值为1,然后记录修改次数的modCount也需要++,接着回到了这进行下一步直接返回null

一路返回到这,可以看出来,这里进行了一个判断,因为返回的是null所以为真,所以最终会返回true,那么代表 System.out.println(treeSet.add("ab"));结果会打印出true。

此时第一个数据才算真的装入完毕。

当我们要接着装入值时,前面步骤一致,来到这才有所不同,

 通过第一个数据的加入可知,root不再是null。所以t的不是null,那么将不再进入第一个判断语句,

接着往下走,我们可知Comparator的值不是为null是有默认值的,所以,将进入第二个判断语句,

将新建的parent变量指向了我们得t,然后再讲t指向的地址中的key的值与刚传入的key进行比较,之前有分析过比较的方式是最终会返回不同字母时的ASCII值的差或者长度差,因为我们这次传入的是cd,上次是ab,所以这次返回的是2,那么cmp就为2,2是大于0的所以进入这个判断,将t指向t.right,因为从未有过关于t.right的操作并且right默认值是null,所以目前t也为null,所以将退出此循环,来到该方法,将我们本次传入的数据传入新建的entry对象中,然后因为传入的cmp<0是小于0所以addToleft为false则进入else中,将传入的parent也就是原本指向上一个传入的数据的right指向刚传入的数据

为红黑树的设计暂时不研究,然后就是记录数据的size++,记录修改次数的modCount++。由上可得知,大的成为右节点,小的成为他的左节点

LinkHashSet介绍

底层介绍

package com.test02;

import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Objects;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
Car类(属性:name,price),如果name和price一样,
则认为是相同元素,就不能添加。
*/public class test03 {
    public static void main(String[] args) {
        LinkedHashSet linkedHashSet = new LinkedHashSet();
        System.out.println(linkedHashSet.add(new Car("小牧",1233)));
        System.out.println(linkedHashSet.add(new Car("小牧",1233)));

    }
}
class Car{
    private String name;
    private double price;

    public Car(String name, double price) {
        this.name = name;
        this.price = price;
    }

    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;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Car car = (Car) o;
        return Double.compare(car.price, price) == 0 && Objects.equals(name, car.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, price);
    }
}

Map接口介绍及常用方法

Map体系继承图

常用方法

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
使用HashMap添加3个员工对象,要求
键:员工id
值:员工对象
并遍历显示工资>18000的员工(遍历方式最少两种)
员工类:姓名、工资、员工id
*/public class test01 {
    public static void main(String[] args) {
        Map map = new HashMap();
        //Employee employee = new Employee(12, "小美", 12340);
//        Employee employee1 = new Employee(13, "亚美", 12240);
//        Employee employee2 = new Employee(14, "猪猪", 12349);
        map.put(12,new Employee(12, "小美", 12340));
        map.put(14,new Employee(14, "猪猪", 123499));
        map.put(15, new Employee(15, "猪猪", 12349));
        Set set = map.entrySet();
        for (Object o :set)//将set逐个给了o,
        {
            Map.Entry m=(Map.Entry)o;//因为具体的key,value的值再Map.Entry里,相应拿到就需要强转
            Employee e=(Employee) m.getValue();//因为要判断工资,所以为了拿到工资,我们需要拿到value部分并强转成Employee类
            if (e.getSalary()>18000)//拿到并判断
            {
                System.out.println(m.getValue());}//使用getValue方法打印相应数据


        }
        Set set1 = map.entrySet();
        Iterator iterator=set.iterator();
        while (iterator.hasNext())
        {
            Map.Entry m=(Map.Entry) iterator.next();
            Employee n=(Employee)m.getValue();
            if (n.getSalary()>18000)
                System.out.println(m.getValue());

        }
        Set keySet = map.keySet();//通过方法keySet()将Map中所有的key值放入keySet中
        for (Object o :keySet) {
            Employee e=(Employee) map.get(o);//通过get(key)方法拿到key对应的value,强转成Employee
            if (e.getSalary()>18000)
            System.out.println(o+" "+map.get(o));

        }


    }
}
class Employee{
   private int id;
   private String name;
   private double salary;

    public Employee(int id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    public Employee(int id) {
        this.id = id;
    }

    public Employee(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                '}';
    }
}

 HashMap底层解析

把Node转为entry类型,然后放到entryset里,不过只是指向,目的是方便遍历,因为里面有getvalue和getkey方法

将数据传传入,hash()方法计算hash值的,由此可见传入的是key,所以key的数据对hash值有直接影响,然后进入putVal()方法

为true表示不改值和为false表示为创建模式,此时前者为false后者为true,该判断中,注意,若是第一次放入数据则,table初始就为null,tab为刚新建的,通过赋值过程,tab目前也为null,则开始调用方法,进行扩容,然后再将扩容好的数组让tab指向,此时tab不再为null,n接收此时扩容好的tab的数组长度,

扩容细节介绍

先创建一个一个数组oldTab指向当前的table数组,然后再来确定oldCap的值,如果oldTab为null则oldCap就为0否则就为oldTab数组的长度,因为首次table为null,所以oldCap就为0,可见oldCap存放的是数组长度

由上可得threshold默认值为0,则初次时oldThr也为0,再进行到下一步的判断,由于一开始,oldCap为0则不进入次if,又因为oldThr也为0则也不进入else if()所以会直接到达else

为默认初始容量,值为16,所以此时的newC16,而为加载因子,初始值为0.75,用于提前为扩容考量的,当使用的空间到达用这个数计算出的值就会开始扩容,而不是等到到达当前所拥有的空间的极限才开始扩容,比如此时的newThr为16*0.75=12,则空间占用到12则开始实施扩容。

接着往下走,判断newThr是否为0,此时newThr为12,所以不进入此if

直接来到该步骤,将刚刚计算的临界值付给threshold,此时threshold不再为0而为12,然后新建一个数组容量为newCap(16)的数组newTab

由于第一次存入数据,oldTab还是null,所以不执行则语句直接返回刚刚新建的数组

接收到新建的数组后将tab指向返回的数组,然后将其长度赋给n此时n的值为16

然后再来判断tab的这个位置是否存有数据,如果没有,则将刚刚传入的数据放入该位置,并且让p指向该数据如果有了则判断现在传进来的hash值跟p指向的数据的hash值是否一样,传进来的key值是否和p指向的数据是否一样或者传进来的key是否为null且传入的key与p指向的key是否相同(使用equals判断就要看程序员是否重写equals了,具体判定是哪方面的相同全看equals方法的写法),之所以进行这样的判断是因为,hash值的多少与key的值密不可分(之前计算hash值时传入key参与计算了)。如果此判断为真,则将创建得e指向p,所以现在e也指向了p所指向的数据,

通过以上步骤则来到该判断,因为e指向与p同样的地址且地址是有存放数据的则e不可能为null,所以进入此判断语句,表示当前e指向的地址的value值,将其赋给oldValue,然后来到判断,因为原本是false,通过!符号就为true了,则进入该判断语句,通过将传入的value赋给e当前指向的地址所存放的value。从而改变value的值,返回原value值。

倘若顺利进行到这一步,则下一步

赋完数据,直接来到,这表示记录修改次数,

这个size数值个数的计算,判断当前数据是否大于设置的临界值如果大于则扩容,若是第一次数据加入则为12,不大于则进行下一步返回null

另外此方法还未写所以目前来说调用也还无意义

l

HashMap扩容解析

 HashMap小结

HashTable介绍

关系图

HashMap和Hashtable对比

Properties介绍

示意图

总结各类型的选择

示例:

import java.util.*;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
*/public class test02 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("tom");
        list.add("nice");
        list.add("io");
        list.add("der");
        Collections.reverse(list);
        System.out.println("翻转顺序后"+list);//翻转顺序后[der, io, nice, tom]
        Collections.shuffle(list);
        System.out.println("随机排序后"+list);//随机排序后[tom, nice, der, io],每运行一次结果都不同
        Collections.sort(list);
        System.out.println("根据元素进行升序排序"+list);//根据元素进行升序排序[der, io, nice, tom]
        Collections.sort(list, new Comparator() {

            @Override
            public int compare(Object o1, Object o2) {
               // return( (String)o1).compareTo((String) o2);//自行设计排序的比较方法这时字母大小升序排
                return ( (String)o1).length()-((String)o2).length();//这是字符串长度升序排
            }
        });
        System.out.println("自定义排序比较方法"+list);
        Collections.swap(list,0,3);
        System.out.println("下标为0位与下标为三位数据进行交换结果为"+list);//第0位与第三位数据进行交换结果为[nice, der, tom, io]
        System.out.println("返回出最大的数据"+Collections.max(list)); //返回出最大的数据tom,同样可以自定义比较方法来得到最大的值
        System.out.println("返回最长的数据"+Collections.max(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ( (String)o1).length()-((String)o2).length();
            }
        }));//返回最长的数据nice
        System.out.println("返回出最小的数据"+Collections.min(list)); //返回出最小的数据der同样可以自定义比较方法来得到最大的值

        System.out.println("返回最短的数据"+Collections.min(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ( (String)o1).length()-((String)o2).length();
            }
        }));//返回最短的数据io
        System.out.println("返回指定集合中指定的值在其中出现的次数"+Collections.frequency(list,"io"));//返回指定集合中指定的值在其中出现的次数1
        List list1 = new ArrayList();//必须要让背copy的集合大小不大于copy进去的集合,
        // 所以我们就先让新的集合容量跟被copy的一样,然后再实验copy()方法
        for(int i=0;i<list.size();i++)
        {
            list1.add(" ");
        }
        Collections.copy(list1,list);
        System.out.println("copylist集合的值后的list1的值为:"+list1);
        //copylist集合的值后的list1的值为:[nice, der, tom, io]
        Collections.replaceAll(list,"tom","谭娜");
        System.out.println("替换后"+list);//替换后[nice, der, 谭娜, io]


    }

}

例题:

package test05;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
按要求实现:
(1)封装一个新闻类,包含标题和内容属性,提供get、set方法,重写toString方法,打印对象
时只打印标题;
·(2)只提供一个带参数的构造器,实例化对象时,只初始化标题;并且实例化两个对象:
新闻一:新冠确诊病例超千万,数百万印度教信徒赴恒河“圣浴”引民众担忧
新闻二:男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生
(3)将新闻对象添加到ArrayList集合中,并且进行倒序遍历;
(4)在遍历集合过程中,对新闻标题进行处理,超过15字的只保留前15个,然后在后边加“.”
(5)在控制台打印遍历出经过处理的新闻标题;
*/public class Test01 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new News("新冠确诊病例超千万,数百万印度教信徒赴恒河“圣浴”引民众担忧"));
        list.add(new News("男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生"));
        Collections.reverse(list);
        for (Object o :list) {
            News news=(News) o;

            System.out.println(Process(news.getTitle()));

        }


    }
    public static String Process(String st)
    {
        if (st==null)
            return null;
        else if (st.length()>15)
            return st.substring(0,15)+"...";
        else
            return st;
    }

}
class News{
    private String title;

    public News(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "News{" +
                "title='" + title + '\'' +
                '}';
    }
}

package test05;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
使用ArrayList 完成对 对象 Car {name,price}的各种操作
1.add:添加单个元素
2.remove:删除指定元素
3.contains:查找元素是否存在
4.size:获取元素个数
5.isEmpty:判断是否为空
6.clear:清空
7.addAll:添加多个元素
8.containsAll:查找多个元素是否都存在
9.removeAll:删除多个元素
使用增强for和 迭代器来遍历所有的car,需要重写Car的toString方法

Car car=new Car(“宝马”,400000);
Car car2=new Car("宾利”,5000000);
*/public class Test02 {
    public static void main(String[] args) {
        List list = new ArrayList();
        Car car=new Car("宝马",400000);
        Car car2=new Car("宾利",5000000);
        list.add(car);
        list.add(car2);
        list.remove(0);
        System.out.println(list);
        System.out.println(list.contains(car));
        System.out.println(list.size());
        System.out.println(list.isEmpty());
       // list.clear();
        System.out.println(list);
       List list1 = new ArrayList();
      list1.addAll(list);
        System.out.println(list1);
        System.out.println(list1.containsAll(list));
        list1.removeAll(list);
        System.out.println(list1);
        for(Object o:list)
        {
            System.out.println(o);
        }
        Iterator iterator=list.iterator();
        while (iterator.hasNext())
        {
            Object next=iterator.next();
            System.out.println(next);
        }

    }
}
class Car{
    private String name;
    double price;

    public Car(String name, double price) {
        this.name = name;
        this.price = price;
    }

    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;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}
package test05;

import javax.swing.text.html.HTMLDocument;
import java.security.KeyStore;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
按要求完成下列任务
1)使用HashMap类实例化一个Map类型的对象m,键(String)和值(int)分别用于存储员
jack-650元;tom-1200元;smith-2900元;

工的姓名和工资,存入数据如下:
2)将jack的工资更改为2600元
3)为所有员工工资加薪100元;
4)遍历集合中所有的员工
5)遍历集合中所有的工资
*/public class Test03 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put(1,new employee("jack",650));
        map.put(2,new employee("tom",1200));
        map.put(3,new employee("smith",2900));
      Set set=map.entrySet();
        for (Object o :set) {
            Map.Entry e=(Map.Entry)o;
            employee p=(employee) e.getValue();
            if (p.getName().compareTo("jack")==0)
            {
                p.setSalary(2600.0);

            }
            else
                p.setSalary(p.getSalary()+100);

            System.out.println(p.getName());

        }
        Iterator iterator=set.iterator();
        while (iterator.hasNext()) {
            Map.Entry y=(Map.Entry)iterator.next();
            employee m=(employee) y.getValue();
            System.out.println(m.getSalary());


        }




    }
}
class employee{
   private String name;
   double salary;

    public employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

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

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

因为在此改了p1的内容,所以这个时候的p1跟最开始的那个p1的hash值是不一样的,所以说这个时候移除p1是无法移除存在集合里的,而在此加入的数据,虽然具体数据跟p1现在的数据是一样的,但是存放位置是要用hash值来判断的,最开始存p1hash值是以“AA”来计算的,所以此时这个以cc来计算是会在不同的位置,因此可存放,

因为这次存的数据与最开始的数据p1是一样的所以hash值也是一样的,那么位置就在同一个位置。但是p1后面的内容被改写了,那么他们就会存入在p1值的链表后面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vulnhub】The Ether: Evil Science靶机

靶机安装 下载地址&#xff1a;https://www.vulnhub.com/entry/the-ether-evilscience-v101,212/ 运行环境&#xff1a;Vmware 信息收集 进行IP发现 nmap 192.168.93.0/24 进行端口扫描,开放了80和22端口 nmap -A 192.168.93.155 -p- 进行目录扫描 dirsearch -u http://…

MATLAB(15)分类模型

一、前言 在MATLAB中&#xff0c;实现不同类型的聚类&#xff08;如K-means聚类、层次聚类、模糊聚类&#xff09;和分类&#xff08;如神经网络分类&#xff09;需要用到不同的函数和工具箱。下面我将为每种方法提供一个基本的示例代码。 二、实现 1. K-means聚类 % 假设X是…

现代前端架构介绍(第一部分):App是如何由不同的构建块构成的

远离JavaScript疲劳和框架大战&#xff0c;了解真正重要的东西 几周前&#xff0c;我的同事们对我们的前端架构、代码结构和面临的挑战很感兴趣。在做了几次关于如何构建可扩展且健壮的前端的演讲后&#xff0c;我觉得把它们都总结一下并与社区分享我们的策略是一个不错的主意。…

主机安装要点

1.选择主板时&#xff0c;一定要先看能不能与 CPU 匹配得上。 2.后缀带 K 的 CPU&#xff0c;因为支持超频&#xff0c;也最好搭配 支持超频 系列主板。 3.主板尺寸大小E-ATX 加大板、ATX 大板、M-ATX 小板、ITX 迷你板&#xff0c;符合机箱大小。 4.部分主板不带A-RGB,有灯…

OpenHarmony应用开发和Android应用开发区别

OpenHarmony 和 Android 是两个不同的操作系统平台&#xff0c;各自有其独特的开发环境和架构。以下是 OpenHarmony 应用开发与 Android 应用开发之间的主要区别&#xff1a; 1. 架构设计 OpenHarmony 微内核架构&#xff1a;OpenHarmony 采用微内核设计&#xff0c;核心功…

中科院2区SCI,稳定检索39年!不收版面费,审稿友好,最快6周录用,速投!

关注GZH【欧亚科睿学术】&#xff0c;第一时间了解期刊最新动态&#xff01; 中科院2区SCI&#xff0c;最快6周录用&#xff01; MACHINE LEARNING 是一本国际性期刊&#xff0c;由知名出版社SPRINGER出版&#xff0c;创刊于1986年&#xff0c;一直致力于发布报道高质量的机器…

2、 qt平台opencv引入,和工程搭建

1. 准备工作 opencv 编译&#xff0c; 参考&#xff1a; https://blog.csdn.net/qq_51355375/article/details/140857966vscode qt cmake工程创建及环境搭建&#xff1a; https://blog.csdn.net/qq_51355375/article/details/140752130 2. 引入opencv 头文件和链接库 2.1 配…

大数据信用报告查询注意事项

在当今这个数据驱动的时代&#xff0c;大数据信用报告已成为评估个人信用状况的重要参考。无论是申请贷款、租房还是求职&#xff0c;一份良好的信用报告都能为您加分不少。然而&#xff0c;在查询大数据信用报告时&#xff0c;有几点注意事项不容忽视&#xff0c;以确保您的信…

CAN通信编程

ubuntu使用虚拟can 1. sudo modprobe vcan //加载虚拟can模块 2. sudo ip link add dev can0 type vcan //添加can0网卡 3. ifconfig -a //查看can0 4. sudo ip link set dev can0 up //开启can0 5. sudo ip link set dev can0 down //关闭can0 6. sudo ip link del dev can0 /…

图数据库 Nebula Graph下载安装

1. 安装包下载解压 进入官网https://www.nebula-graph.com.cn/download&#xff0c;下载对应版本 tar -zxvf nebula-graph-3.8.0.ubuntu2004.amd64.tar.gz cd nebula-graph-3.8.0.ubuntu2004.amd64/2. 启动 Nebula Graph 服务 2.1 修改配置文件名以应用配置 将子目录etc中的…

用Python代码制作一个全自动扫雷(详细教程)

用PythonOpenCV实现了自动扫雷&#xff0c;突破世界记录&#xff0c;我们先来看一下效果吧。 中级 - 0.74秒 3BV/S60.81 相信许多人很早就知道有扫雷这么一款经典的游&#xff08;显卡测试&#xff09;戏&#xff08;软件&#xff09;&#xff0c;更是有不少人曾听说过中国雷圣…

开放式耳机哪个牌子质量好?热销的开放式耳机推荐

想要寻找一副舒适好听的开放式耳机可不是一件容易的事情&#xff0c;市面上数不胜数的品牌和型号让人眼花缭乱。不过&#xff0c;市面上的开放式耳机品牌繁多&#xff0c;质量参差不齐&#xff0c;究竟哪些牌子的产品更值得信赖呢&#xff1f;今天通过各大平台的推荐出了几款用…

常见的CMS漏洞

WordPress WordPress是⼀个以 PHP 和 MySQL 为平台的 ⾃由开源 的博客软件和 内容管理系统 。WordPress具 有插件架构和模板系统。截⾄2018年4⽉&#xff0c;排名前1000万的⽹站中超过30.6%使⽤WordPress。 WordPress是最受欢迎的⽹站 内容管理系统 。全球有⼤约30%的⽹站(7亿…

使用 宝塔面板 部署 springboot 和 vue

宝塔面板 部署 spring boot 和 vue 教程 代码仓库&#xff1a;还没弄 网站介绍 仿照别人项目做了个基于 springboot 和 vue 的网站&#xff0c;在腾讯云服务器上&#xff0c;通过 宝塔面板 部署了该项目。 项目的技术栈&#xff1a;Vue3、Vite5、Axios、Element Plus、Wange…

常回家看看之fastbin_attack

常回家看看之fastbin_attack 原理分析 fastbin属于小堆块的管理&#xff0c;这里说的fastbin_attack大多指glibc2.26之前的手法&#xff0c;因为自glibc2.26以后&#xff0c;glibc迎来了一位新成员tcachebin&#xff0c;它减少了堆的开销&#xff0c;使堆管理变得迅速而高效&…

【Android】安卓四大组件之ContentProvider知识总结

文章目录 Uri介绍组成 ContentResolver用法获取对象增删改查读取联系人获取权限配置ListView ContentProvider方法步骤1、注册2、继承onCreateUriMatcherinsertdeleteupdatequerygetType ContentProvider与ContentResolver Uri 介绍 统一资源标识符&#xff08;URI&#xff09…

nacos服务注册流程

一、客户端自动注册实例流程 1.首先客户端需要引入服务发现包 <groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.6.RELEASE</version> 2. NacosServiceRegist…

Linux中,MySQL存储引擎

存储引擎 在数据库中保存的是一张张有着千丝万缕关系的表&#xff0c;所以表设计的好坏&#xff0c;将直接影响着整个数据库。而在设计表的时候&#xff0c;最关注的一个问题是使用什么存储引擎。 MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种都…

【书生大模型实战营第三期 | 入门岛第1关-Linux基础知识】

学习心得&#xff1a;掌握InternStudio开发机与Linux基础 摘要 通过阅读这份详尽的InternStudio开发机与Linux基础教程&#xff0c;我对如何在云端算力平台上进行开发工作有了初步的了解。学习过程中&#xff0c;我不仅掌握了SSH远程连接和端口映射的技巧&#xff0c;还对Lin…

将后台传来的数据,转成easyui-tree所需格式

easyui 中文文档 EasyUI Tree组件需要一个包含特定属性&#xff08;如id, text, children等&#xff09;的JSON对象数组来初始化。 而后台返回的数据&#xff0c;它可能不是我们直接能拿来用的。 方式一&#xff1a;使用loadFilter函数处理来自Web Services的JSON数据。 $(#…