java学习--集合

集合简介

关系示例图

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值的链表后面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值