集合简介
关系示例图
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值的链表后面