java学习--集合

avatar
作者
筋斗云
阅读量:0

集合简介

关系示例图

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

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!