韩顺平Java32——集合Homework
集合Homework
1.
package collection.homework; import java.util.ArrayList; import java.util.Collections; /** * @author 紫英 * @version 1.0 * @discription */ public class Homework01 { public static void main(String[] args) { News news01 = new News("新冠确诊病例超千万,数百万印度教信徒赴恒河“圣浴”引民众担忧");//\"圣浴\"或者用中文的”“ News news02 = new News("男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生"); ArrayList list = new ArrayList(); list.add(news01); list.add(news02); Collections.reverse(list); //也可以如下,因为如果没必要不要轻易改变数组 /*老师方法: for(int i = list.size()-1;i>=0;i--){ News news = (News) list.get(i); System.out.println(proTitle(news.getTitle())) } */ for (Object o : list) { News n = (News) o; //下面的if语句可以封装成方法 if ((n.getTitle().length()) > 15) { System.out.println(n.getTitle().substring(0, 15) + "...");//substring获取指定索引的字符串 } // System.out.println(proTitle(((News) o).getTitle())); } } // public static String proTitle(String title) { // if (title == null) return ""; // if ((title.length()) > 15) { // title = title.substring(0, 15) + "...";//substring获取指定索引的字符串 // } // return title; // } } class News { private String title; private String content; public News(String title) { this.title = title; } @Override public String toString() { return "News——" + "新闻标题:" + title; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
2.
package collection.homework; import java.util.ArrayList; /** * @author 紫英 * @version 1.0 * @discription */ public class Homework02 { public static void main(String[] args) { Car car = new Car("宝马",400000); Car car2 = new Car("宾利",5000000); ArrayList list = new ArrayList(); list.add(car); list.add(car2); System.out.println(list); // list.remove(car2); System.out.println(list.contains(car2)); System.out.println(list.isEmpty()); list.addAll(list); System.out.println(list.containsAll(list)); for (Object o : list) { System.out.println(o); } } } class Car { private String name; private int price; @Override public String toString() { return "Car{" + "name:'" + name + '\'' + ", price:" + price + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public Car(String name, int price) { this.name = name; this.price = price; } }
3.
package collection.homework; import java.util.*; /** * @author 紫英 * @version 1.0 * @discription */ public class Homework03 { public static void main(String[] args) { Map m = new HashMap(); m.put("jack", 650); m.put("tom", 1200); m.put("smith", 2900); m.put("jack", 2600); Set set = m.keySet(); Collection values = m.values(); for (Object key : set) { m.put(key, (Integer) m.get(key) + 100);//注意转换成Interger } System.out.println("======遍历员工:====="); for (Object key : set) { System.out.println(key + ":" + m.get(key) + "元"); } System.out.println("======遍历员工(迭代器):====="); Set entrySet = m.entrySet(); Iterator iterator = entrySet.iterator(); while (iterator.hasNext()) { Object o = iterator.next(); Map.Entry map = (Map.Entry) o; System.out.println(map.getKey() + ":" + map.getValue() + "元"); } System.out.println("======遍历工资:====="); for (Object value : values) { System.out.println(value + "元"); } } }
4.简答题:HashSet和TreeSet分别如何实现去重?
- (1)HashSet的去重机制:
使用hashcode()+equals(),底层先传入(key)对象,通过运算得到对应的hash()值,再通过hash()值得到对应的数组索引,如果发现该索引位置没有数据,就直接存入,如果有数据,就进行equals()比较。注意是对该索引处的所有元素遍历比较(链表),而且使用的是传入对象(自身)对应的equals()方法。比较之后,如果都不相同,就挂载到最后,如果有相同的就替换value值(PERSENT),key不加入,因为是set,所以相当于不加入。
- (2)TreeSet去重机制
如果在创建构造器的时候传入了comparator对象,则按照自定义的comparor方法去重——如果方法返回0就判定为相同元素不予添加。如果没有传入比较器对象,则按照传入对象实现的Comparable接口的compareTo方法进行去重。(这里体现了接口的多态——接口类型的变量可以指向实现了该接口的对象实例)
Comparable<? super K> k = (Comparable<? super K>) key;
5.
public class Test { public static void main(String[] args) { TreeSet treeSet = new TreeSet(); treeSet.add(new Person()); } } class Person{}
分析:因为在创建构造器的时候,使用的是无参构造器,没有传入比较器所以就会走如题4的那条语句,然后发现Person类并没有实现
Comparable接口,导致抛出类型转换异常,如果只是想编译不报错的话可以让Person实现Comparable接口。
class Person implements Comparable{ @Override public int compareTo(@NotNull Object o) { return 0; } }
但是这样的话永远 return 0; 也就是说只能添加一个对象,想要更丰富就看情况自己写。
6.
package test; import java.util.HashSet; import java.util.Objects; public class Test { public static void main(String[] args) { HashSet set = new HashSet(); Person p1 = new Person(1001,"AA"); Person p2 = new Person(1002,"BB"); set.add(p1); set.add(p2); p1.name = "CC"; set.remove(p1);//这里的remove是按照原先存进去的hash()值来计算的,这时name改变导致删除失败,返回的是false System.out.println(set);//false set.add(new Person(1001,"CC"));//1002BB 1001CC System.out.println(set);//1002BB 1001CC 1001CC set.add(new Person(1001,"AA")); System.out.println(set);//1002BB 1001CC 1001CC 1001AA } } class Person { int id; String name; @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return id == person.id && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(id, name); } public Person(int id, String name) { this.id = id; this.name = name; } }
7.Vector与ArrayList的比较
另外Vector的一个构造器可以指定扩容大小
本文来自博客园,作者:紫英626,转载请注明原文链接:https://www.cnblogs.com/recorderM/p/15834183.html