首先看下继承结构:

ArrayList(常用):

  /**
* List接口继承Collection接口
* ArrayList, Vector为List接口的实现类
* add()添加新元素,remove()删除指定位置元素,get()通过索引获取对应位置元素,set()设置索引位置元素
* Iterator(最常用)接口实现集合遍历
*/
List list = new ArrayList<String>();
list.add("Hello aa");
list.add("Hello bb");
list.add("Hello cc");
list.add("Hello dd");
list.add("Hello dd");
list.add("Hello dd");
list.remove(0);
System.out.println(list);
System.out.println(list.get(0));
list.set(0, "nihao");
System.out.println(list.get(0));
Iterator iter = list.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}

Vector(旧版):

 /**
* List接口继承Collection接口
* ArrayList, Vector为List接口的实现类
* add()添加新元素,remove()删除指定位置元素,get()通过索引获取对应位置元素,set()设置索引位置元素
* Iterator(最常用)接口实现集合遍历
*/
List list = new Vector<String>();
list.add("Hello aa");
list.add("Hello bb");
list.add("Hello cc");
list.add("Hello dd");
list.add("Hello dd");
list.add("Hello dd");
list.remove(0);
System.out.println(list);
System.out.println(list.get(0));
list.set(0, "nihao");
System.out.println(list.get(0));
Iterator iter = list.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}

两者的主要区别:

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

HashSet, TreeSet:

 /**
* Set(集合)是不重复的, Collection集合的子接口
*/
Set hashSet = new HashSet<String>();
hashSet.add("1111");
hashSet.add("1111");
hashSet.add("2222");
hashSet.add("3333");
hashSet.add("X");
hashSet.add("C");
hashSet.add("E");
hashSet.add("A");
System.out.println(hashSet); // 发现HashSet是无序的
Set treeSet = new TreeSet<String>();
treeSet.add("1111");
treeSet.add("1111");
treeSet.add("2222");
treeSet.add("3333");
treeSet.add("X");
treeSet.add("C");
treeSet.add("E");
treeSet.add("A");
System.out.println(treeSet); // 发现TreeSet是有序的

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

Book类:

 public class Book {
private String title;
private double price;
public Book(){
this("", 0.0);
}
public Book(String title, double price){
this.title = title;
this.price = price;
}
}

执行如下代码:

 public class Ph {
public static void main(String[] args) {
Set treeSet = new TreeSet<String>();
treeSet.add(new Book("Java开发", 29.8));
treeSet.add(new Book("Java开发", 29.8));
treeSet.add(new Book("JSP开发", 39.8));
treeSet.add(new Book("Oracle开发", 79.8));
System.out.println(treeSet);
}
}

运行时异常:

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

故Book类此时应为:

 public class Book implements Comparable<Book>{
private String title;
private double price;
public Book(){
this("", 0.0);
}
public Book(String title, double price){
this.title = title;
this.price = price;
} @Override
public int compareTo(Book o) {
if(price > o.price){
return 1;
}else if(price < o.price){
return -1;
}else{
// 注意应该把所有元素的比较填入, 不然有一个属性相同可能就会误以为相同元素
return title.compareTo(o.title);
}
}
}

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

 import java.util.Objects;

 public class Book {
private String title;
private double price; public Book() {
this("", 0.0);
} public Book(String title, double price) {
this.title = title;
this.price = price;
} @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Double.compare(book.price, price) == 0 &&
Objects.equals(title, book.title);
} @Override
public int hashCode() {
return Objects.hash(title, price);
} @Override
public String toString() {
return title + price;
}
}

HashMap,Hashtable:

 Map map = new HashMap<String, Integer>();
map.put("Hello", 1);
map.put("Hello", 100);
map.put("world", 100);
map.put("Java", 100);
map.put(null, 100);
System.out.println(map.get("Hello"));
System.out.println(map.get("Jav"));
System.out.println(map.get(null));

运行结果:

100
null
100

 Map map = new Hashtable<String, Integer>();
map.put("Hello", 1);
map.put("Hello", 100);
map.put("world", 100);
map.put("Java", 100);
map.put(null, 100);
System.out.println(map.get("Hello"));
System.out.println(map.get("Jav"));
System.out.println(map.get(null));

运行结果:

Exception in thread "main" java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:465)
at MyPackageOne.Ph.main(Ph.java:12)

将null去掉:

 map.put("Hello", 1);
map.put("Hello", 100);
map.put("world", 100);
map.put("Java", 100);
System.out.println(map.get("Jav"));

运行结果:

null

总结:HashMap和Hashtable区别:

Hashtable为JDK1.0时存在的Map实现类, HashMap为JDK1.2时新加入的Map实现类,HashMap可以设置null而Hashtable不能,Hashtable为同步的线程安全,不推荐使用,HashMap为异步线程非安全,两者用法基本一致。

遍历HashMap(Hashtable一样):

 Map map = new Hashtable<String, Integer>();
map.put("Hello", 1);
map.put("world", 100);
map.put("Java", 100);
/**
* 方法一
* 通过keySet()方法获取key集合
*/
Set keySet = map.keySet();
Iterator iter = keySet.iterator();
while (iter.hasNext()){
System.out.println(iter.next());
}
/**
* 方法二
* 通过Map.Entry接口
*/
Set<Map.Entry<String, Integer>> set = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = set.iterator();
while (iterator.hasNext()){
Map.Entry<String, Integer> mapEntry = iterator.next();
System.out.println(mapEntry.getKey() + mapEntry.getValue());
}

特别的, Map可以以自定义类为key或value,当作key时,比如之前的Book类(注释掉hashCode和equals方法)

 Map map = new HashMap<Book, String>();
map.put(new Book("Java", 10.9), "1");
map.put(new Book("Java", 10.9), "1");
map.put(new Book("Java", 11.9), "1");
System.out.println(map);

运行结果为:{Java10.9=1, Java10.9=1, Java11.9=1}

发现有重复元素, 去掉hashCode和equals方法注释:

此时运行结果:{Java10.9=1, Java11.9=1}

总结:用HashMap,Hashtable时如果自定义类作为key需要加上hashCode和equals方法

Stack:

  /**
* Stack为Vector子类,但一般用法与Vector无关
* 常用push,pop,size方法
*/
Stack stack = new Stack<String>();
stack.push("11");
stack.push("22");
stack.push("33");
System.out.println(stack.size());
System.out.println(stack.get(stack.size() - 1));
stack.pop();
System.out.println(stack.get(stack.size() - 1));

Properties:

 /**
* Properties类为Hashtable子类
* 不用设置泛型因为只能用String,String
* 常用setProperty方法设置属性, getProperty方法获得属性
* store方法存入文件中,load方法从文件中取出
*/
Properties properties = new Properties();
properties.setProperty("123", "456");
properties.setProperty("1", "4");
properties.setProperty("12", "45");
properties.setProperty("123", "456");
System.out.println(properties.getProperty("123"));
properties.store(new FileOutputStream(new File("key.txt")), "key-info");
properties.load(new FileInputStream(new File("key.txt")));

Collections:

 /**
* Collection和Collections的区别:
* Collection是集合的接口,Collections是接口的工具类,提供一些方法
* 如:addAll, reverse, replaceAll等方法
*/
Collections.addAll(list, "1", "2", "3");
Collections.reverse(list);
System.out.println(list);
Collections.replaceAll(list, "1", "2");
System.out.println(list);

Java类集 List, Set, Map, Stack, Properties基本使用的更多相关文章

  1. 专题笔记--Java 类集框架

    Java 类集框架 1. Java类集框架产生的原因 在基础的应用中,我们可以通过数组来保存一组对象或者基本数据,但数组的大小是不可更改的,因此出于灵活性的考虑和对空间价值的担忧,我们可以使用链表来实 ...

  2. java:类集操作总结

    java:类集操作总结 1.List接口允许有重复的元素,Set接口中不允许有重复的元素 2.ArrayList,和Vector的区别 3.set依靠equals和hashCode区分 4.TreeS ...

  3. 浅谈java类集框架和数据结构(1)

    在另外一篇博客我简单介绍了java类集框架相关代码和理论. 这一篇博客我主要分析一下各个类集框架的原理以及源码分析. 一:先谈谈LinkedList 这是LinkedList源码的开头,我们能看到几点 ...

  4. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  5. Java类集框架详细汇总-底层分析

    前言: Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾: Collection集合接口 继承自:Iterable public interfa ...

  6. java:类集操作,多对多的关系

    java:类集操作,多对多的关系 //一个课程有多个学生报名, //一个学生可以报名多个课程 demo.java, Student.java, Course.java' public class Co ...

  7. Java -- Java 类集 -- 目录

    13.1 认识类集 13.1.1 基本概念 13.1.2 类集框架主要接口 13.2 Collection接口 13.2.1 Collection接口的定义 13.2.2 Collection子接口的 ...

  8. Java 类集初探

    类集 类集:主要功能就是Java数据结构的实现(java.util) 类集就是动态对象数组(链表也是动态数组) Collection 接口* Collection是整个类集之中单值保存的最大 父接口 ...

  9. java类集开发中一对多和多对多的关系的实现

    摘自<java开发实战经典>李兴华.著 一对多的关系 一个学校可以包含多个学生,一个学生属于一个学校,那么这就是一个典型的一对多关系,此时就可以通过类集进行关系的表示. 在定义Studen ...

随机推荐

  1. 如何让微信里的html应用弹出“点击右上角分享到朋友圈”的图片

    一个分享按钮,一个隐藏的图片(这个图片绝对定位在右上角)然后就是点击显示,点击隐藏了... <a href="javascript:;" onclick="docu ...

  2. 迅速上手:使用taro构建微信小程序基础教程

    前言 由于微信小程序在开发上不能安装npm依赖,和开发流程上也饱受诟病:Taro 是由京东·凹凸实验室(aotu.io)倾力打造的 多端开发解决方案,它的api基于react,在本篇文章中主要介绍了使 ...

  3. 十六进制的ASCII码 "\u6cf0\u56fd" 解码成unicode

    转码方法: C#: string a = "\u6cf0\u56fd"; string b = Encoding.UTF8.GetString(Encoding.UTF8.GetB ...

  4. vue生命周期探究(一)

    前言 在使用vue开发的过程中,我们经常会接触到生命周期的问题.那么你知道,一个标准的工程项目中,会有多少个生命周期勾子吗?让我们来一起来盘点一下: 根组件实例:8个 (beforeCreate.cr ...

  5. 通过java代码进行impala和kudu的对接

    对于impala而言,开发人员是可以通过JDBC连接impala的,有了JDBC,开发人员可以通过impala来间接操作kudu: maven导包: <!-- https://mvnreposi ...

  6. 解决 jQuery 实现父窗口的问题 如window.parent.document.getElementById().innerHTML

    因为先前遇到的问题,所以我考虑采用 IFRAME 来隔离不同的脚本,从而实现我需要的效果. 在框架中,我用 JavaScript 获取 JSON 数据,组织成 HTML 代码,最后将其填充至上层文档的 ...

  7. BZOJ1009 [HNOI2008]GT考试 矩阵

    去博客园看该题解 题目 [bzoj1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准 ...

  8. Python中type和object

    type  所有类是type生成的 a = 1 b = "abc" print("type a:{}".format(type(a))) print(" ...

  9. day46 html

    老师的笔记: day46 课程安排 HTML CSS JS基础 DOM操作 jQuery Bootstrap pymysql Django基础 项目实战 Vue.js 今日概要: "PUT ...

  10. thinkphp5控制器

    // 定义应用目录 define('APP_PATH', __DIR__ . '/../app/'); // 定义配置文件目录和应用目录同级 define('CONF_PATH', __DIR__.' ...