码迷,mamicode.com
首页 > 编程语言 > 详细

Java类集 1 List, Set基本使用

时间:2018-10-28 23:02:15      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:import   price   定位   定义   自定义   click   接口继承   img   util   

首先看下继承结构:

技术分享图片

ArrayList(常用):

技术分享图片
 1  /**
 2          * List接口继承Collection接口
 3          * ArrayList, Vector为List接口的实现类
 4          * add()添加新元素,remove()删除指定位置元素,get()通过索引获取对应位置元素,set()设置索引位置元素
 5          * Iterator(最常用)接口实现集合遍历
 6          */
 7         List list = new ArrayList<String>();
 8         list.add("Hello aa");
 9         list.add("Hello bb");
10         list.add("Hello cc");
11         list.add("Hello dd");
12         list.add("Hello dd");
13         list.add("Hello dd");
14         list.remove(0);
15         System.out.println(list);
16         System.out.println(list.get(0));
17         list.set(0, "nihao");
18         System.out.println(list.get(0));
19         Iterator iter = list.iterator();
20         while (iter.hasNext()) {
21             System.out.println(iter.next());
22         }
View Code

Vector(旧版):

技术分享图片
 1 /**
 2          * List接口继承Collection接口
 3          * ArrayList, Vector为List接口的实现类
 4          * add()添加新元素,remove()删除指定位置元素,get()通过索引获取对应位置元素,set()设置索引位置元素
 5          * Iterator(最常用)接口实现集合遍历
 6          */
 7         List list = new Vector<String>();
 8         list.add("Hello aa");
 9         list.add("Hello bb");
10         list.add("Hello cc");
11         list.add("Hello dd");
12         list.add("Hello dd");
13         list.add("Hello dd");
14         list.remove(0);
15         System.out.println(list);
16         System.out.println(list.get(0));
17         list.set(0, "nihao");
18         System.out.println(list.get(0));
19         Iterator iter = list.iterator();
20         while (iter.hasNext()) {
21             System.out.println(iter.next());
22         }
View Code

两者的主要区别:

ArrayList是JDK1.2新加入的, Vector在JDK1.0中就已经出现, Vector是同步的, 所以是线程安全的(当然性能会低),ArrayList是异步的,所以线程不安全,日常开发中Vector已经很少用了,ArrayList更常用一些,两者的用法基本一致。

HashSet, TreeSet:

技术分享图片
 1 /**
 2          * Set(集合)是不重复的, Collection集合的子接口
 3          */
 4         Set hashSet = new HashSet<String>();
 5         hashSet.add("1111");
 6         hashSet.add("1111");
 7         hashSet.add("2222");
 8         hashSet.add("3333");
 9         hashSet.add("X");
10         hashSet.add("C");
11         hashSet.add("E");
12         hashSet.add("A");
13         System.out.println(hashSet); // 发现HashSet是无序的
14         Set treeSet = new TreeSet<String>();
15         treeSet.add("1111");
16         treeSet.add("1111");
17         treeSet.add("2222");
18         treeSet.add("3333");
19         treeSet.add("X");
20         treeSet.add("C");
21         treeSet.add("E");
22         treeSet.add("A");
23         System.out.println(treeSet); // 发现TreeSet是有序的
View Code

用HashSet, TreeSet存储自定义类Book:

Book类:

技术分享图片
 1 public class Book {
 2     private String title;
 3     private double price;
 4     public Book(){
 5         this("", 0.0);
 6     }
 7     public Book(String title, double price){
 8         this.title = title;
 9         this.price = price;
10     }
11 }
View Code

执行如下代码:

技术分享图片
 1 public class Ph {
 2     public static void main(String[] args) {
 3         Set treeSet = new TreeSet<String>();
 4         treeSet.add(new Book("Java开发", 29.8));
 5         treeSet.add(new Book("Java开发", 29.8));
 6         treeSet.add(new Book("JSP开发", 39.8));
 7         treeSet.add(new Book("Oracle开发", 79.8));
 8         System.out.println(treeSet);
 9     }
10 }
View Code

运行时异常:

Exception in thread "main" java.lang.ClassCastException: MyPackageOne.Book cannot be cast to java.lang.Comparable
看到Comparable明白TreeSet通过Comparable接口实现让元素不重复和排序,所以运用TreeSet存储自定义类时应实现Comparable接口并实现CompareTo方法

故Book类此时应为:

技术分享图片
 1 public class Book implements Comparable<Book>{
 2     private String title;
 3     private double price;
 4     public Book(){
 5         this("", 0.0);
 6     }
 7     public Book(String title, double price){
 8         this.title = title;
 9         this.price = price;
10     }
11 
12     @Override
13     public int compareTo(Book o) {
14         if(price > o.price){
15             return 1;
16         }else if(price < o.price){
17             return -1;
18         }else{
19             // 注意应该把所有元素的比较填入, 不然有一个属性相同可能就会误以为相同元素
20             return title.compareTo(o.title);
21         }
22     }
23 }
View Code

而此时换成HashSet,发现会有重复元素,因为HashSet通过HashCode()和equals()方法实现去重,故此时Book类应为:

技术分享图片
 1 import java.util.Objects;
 2 
 3 public class Book {
 4     private String title;
 5     private double price;
 6 
 7     public Book() {
 8         this("", 0.0);
 9     }
10 
11     public Book(String title, double price) {
12         this.title = title;
13         this.price = price;
14     }
15 
16     @Override
17     public boolean equals(Object o) {
18         if (this == o) return true;
19         if (o == null || getClass() != o.getClass()) return false;
20         Book book = (Book) o;
21         return Double.compare(book.price, price) == 0 &&
22                 Objects.equals(title, book.title);
23     }
24 
25     @Override
26     public int hashCode() {
27         return Objects.hash(title, price);
28     }
29 
30     @Override
31     public String toString() {
32         return title + price;
33     }
34 }
View Code

 

Java类集 1 List, Set基本使用

标签:import   price   定位   定义   自定义   click   接口继承   img   util   

原文地址:https://www.cnblogs.com/sqdtss/p/9867718.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!