package org.vv.game.test;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentLinkedQueue;
public class TypeTest {
/**
* ArrayList 优缺点 可以快速访问每个元素,调用get(i)方法来访问下标为i的数组元素。 添加对象速度慢,操作其中对象的速度慢 。
*/
private void arrayListTest() {
ArrayList<String> arrayList = new ArrayList<String>();
// 添加
arrayList.add(String.valueOf(1));
arrayList.add(new Integer(2).toString());
arrayList.add("3");
// 在指定位置插入对象
arrayList.add(0, new String("00"));
for (String str : arrayList) {
System.out.println(str); // 0,1,2,3
}
// 查询
// 返回位置
System.out.println(arrayList.indexOf("1")); // 1
// 返回指定位置的对象
System.out.println(arrayList.get(1)); // 1
// 判断对象是否存在
System.out.println(arrayList.contains("3")); // true
// 修改
System.out.println(arrayList.set(1, "11"));
// 删除
arrayList.remove(0); // remove index
arrayList.remove(String.valueOf(2)); // remove obj
// JDK 1.5 后的遍历方式
for (String str : arrayList) {
System.out.println(str); // 11,3
}
// 原始迭代器
ListIterator<String> listIterator = arrayList.listIterator();
String string = null;
while (listIterator.hasNext()) {
string = (String) listIterator.next();
System.out.println(string);
}
// 转换为数组
// 此方法在多线程同时修改 {@code List} 的情况下可能抛出异常
// String[] l = (String[])arrayList.toArray(new
// String[arrayList.size()]);
// 其它的一些方法
arrayList.size(); // 获取大小
arrayList.clear(); // 清空
arrayList.isEmpty(); // 是否为空
arrayList.subList(0, 1); // 截取
arrayList.lastIndexOf("0"); //返回指定的对象在列表中最后一次出现的位置索引。
arrayList.trimToSize();//将此 ArrayList 实例的容量调整为列表的当前大小。
}
/**
* List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList
* 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列
* (deque)。 此类实现 Queue 接口,为 add、poll
* 等提供先进先出队列操作。其他堆栈和双端队列操作可以根据标准列表操作方便地进行再次强制转换
* 。虽然它们可能比等效列表操作运行稍快,但是将其包括在这里主要是出于方便考虑。
* 是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值
* 。当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可,当删除记录时也一样。
*
* 操作其中对象的速度快 不能随即访问:虽然存在get()方法,但是这个方法是通过遍历接点来定位的所以速度慢。
*
* LinkedList在实现Queue时很有用。
*/
private void linkedListTest() {
// 多个线程同时访问链接的哈希集合时保持同步
/*List<String> list = Collections
.synchronizedList(new LinkedList<String>());*/
LinkedList<String> list = new LinkedList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.addFirst("first");
list.addLast("end");
list.getFirst();
list.getLast();
// 其它方法参考ArrayList
}
/**
* HashSet 主要方法
*/
private void hashSetTest() {
HashSet<String> hashSet = new HashSet<String>();
// 添加数据 注意每次插入的数据是无序的
hashSet.add("a");
hashSet.add("b");
hashSet.add("c");
hashSet.add("d");
// 删除数据
hashSet.remove("a");
// 清空数据
hashSet.clear();
// 查询数据
hashSet.contains("a");
hashSet.size();
hashSet.isEmpty();
for (String str : hashSet) {
System.out.println(str);
}
// 转换为数组
String[] strs = (String[]) hashSet.toArray(new String[0]);
}
/**
* LinkedHashSet
*
* 具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。 此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。
* 此链接列表定义了迭代顺序,即按照将元素插入到集合中的顺序(插入顺序)进行迭代。 注意,插入顺序不 受在集合中重新插入的 元素的影响。
*/
private void linkedHashSetTest() {
// 多个线程同时访问链接的哈希集合时保持同步
/*Set<String> s = Collections
.synchronizedSet(new LinkedHashSet<String>());*/
LinkedHashSet<String> s = new LinkedHashSet<String>();
s.add("a");
s.add("b");
s.add("c");
s.add("d");
for (String str : s) {
System.out.println(str); // a,b,c,d
}
}
/**
* TreeSet 此类实现 Set 接口,该接口由 TreeMap 实例支持。 此类保证排序后的 set
* 按照升序排列元素,根据使用的构造方法不同,可能会按照元素 的自然顺序 进行排序(参见 Comparable),或按照在创建 set
* 时所提供的比较器进行 排序。
*
* HashSet是基于Hash算法实现的,其性能通常优于TreeSet,我们通常都应该使用HashSet,在我们需要排序的功能时,
* 我门才使用TreeSet
*/
private void treeSetTest() {
TreeSet<Student> s = new TreeSet<Student>(new Student.compareToStudent());
s.add(new Student(1, "a"));
s.add(new Student(2, "b"));
s.add(new Student(4, "d"));
s.add(new Student(4, "c"));
s.first();
s.last();
//其它tree节点操作参考jdk文档
for (Student stu : s) {
System.out.println(stu);
}
/*
* Student [id=1, name=a] Student [id=2, name=b] Student [id=4, name=c]
* Student [id=4, name=d]
*/
}
/**
* 一个基于链接节点的、无界的、线程安全的队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部
* 是队列中时间最短的元素。新的元素插入到队列的尾部,队列检索操作从队列头部获得元素。当许多线程共享访问一个公共 collection
* 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许 null 元素。
*/
private void concurrentLinkedQueueTest() {
ConcurrentLinkedQueue<String> concurrentLinkedQueue = new ConcurrentLinkedQueue<String>();
concurrentLinkedQueue.add("a");
concurrentLinkedQueue.add("b");
concurrentLinkedQueue.add("c");
concurrentLinkedQueue.offer("d"); // 将指定元素插入到此队列的尾部。
concurrentLinkedQueue.peek(); // 检索并移除此队列的头,如果此队列为空,则返回 null。
concurrentLinkedQueue.poll(); // 检索并移除此队列的头,如果此队列为空,则返回 null。
for (String str : concurrentLinkedQueue) {
System.out.println(str);
}
}
/**
* HashMap 基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用
* null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。、
* 使用HashMap要求添加的键类明确定义了hashCode()和equals()的实现。
*/
private void hashMapTest() {
HashMap<Integer, Student> map = new HashMap<Integer, Student>();
map.put(1, new Student(1, "a"));
map.put(2, new Student(2, "a"));
map.put(3, new Student(3, "a"));
map.put(4, new Student(4, "a"));
System.out.println(map.containsKey(1));// true
System.out.println(map.containsValue(new Student(4, "a")));// true
System.out.println(map.get(2)); // Student [id=2, name=a]
// 获取所有的 key
Set<Integer> keySet = map.keySet();
for (Integer i : keySet) {
System.out.println(i); // 1,2,3,4
}
// 遍历 Map
Set<Map.Entry<Integer, Student>> entries = map.entrySet();
for (Map.Entry<Integer, Student> entry : entries) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
// 1:Student [id=1, name=a]
// 2:Student [id=2, name=a]
// 3:Student [id=3, name=a]
// 4:Student [id=4, name=a]
}
/**
* 此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。 Hashtable 是同步的。
*/
private void hashTableTest() {
Hashtable<String, Integer> numbers = new Hashtable<String, Integer>();
numbers.put("one", new Integer(1));
numbers.put("two", new Integer(2));
numbers.put("three", new Integer(3));
Integer n = (Integer) numbers.get("two");
if (n != null) {
System.out.println("two = " + n);
}
// 其操作方法参考 HashMap
}
/**
* TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap
*/
private void treeMapTest() {
TreeMap<String, Integer> numbers = new TreeMap<String, Integer>();
numbers.put("one", new Integer(1));
numbers.put("two", new Integer(2));
numbers.put("three", new Integer(3));
// 其操作方法参考jdk文档
}
/**
* Properties Properties 类表示了一个持久的属性集。Properties
* 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
*/
private void propertiesTest() {
Properties properties = new Properties();
OutputStream os = null;
try {
os = new FileOutputStream(getClass().getResource("test.properties")
.getFile());
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
properties.load(getClass().getResourceAsStream("test.properties"));
properties.getProperty("key");
properties.getProperty("key", "default");
properties.setProperty("new key", "new value");
properties.store(os, "comment");
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// 测试 ArrayList
// TypeTest.arrayListTest();
// TypeTest.hashSetTest();
// TypeTest.linkedHashSetTest();
new TypeTest().hashMapTest();
}
}
class Student implements Comparable {
private int id;
private String name;
public Student(int id, String name) {
super();
this.id = id;
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;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
static class compareToStudent implements Comparator // 定义一个内部类来实现比较器
{
public int compare(Object o1, Object o2) {
Student s1 = (Student) o1;
Student s2 = (Student) o2;
int rulst = s1.id > s2.id ? 1 : (s1.id == s2.id ? 0 : -1);
if (rulst == 0) {
rulst = s1.name.compareTo(s2.name);
}
return rulst;
}
}
@Override
public int compareTo(Object o) {
int result;
Student s = (Student) o;
result = id > s.id ? 1 : (id == s.id ? 0 : -1);
if (result == 0) {
result = name.compareTo(s.name);
}
return result;
}
}
分享到:
相关推荐
// java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...
Java 集合框架中 List、Set、Map 的用法和区别 Java 集合框架(Java Collections Framework)是 Java 语言中的一个重要组件,提供了一些基本的数据结构和算法来操作和存储数据。其中,List、Set、Map 是三个非常...
需要注意的是,Collection、List、Set 和 Map 等接口和实现类都有其特点和使用场景,需要根据实际情况选择合适的集合类。同时,理解集合类的底层实现机制也非常重要,可以帮助开发者更好地使用集合类。 在 Java 中...
常见的Map实现包括: - **HashMap**:基于哈希表实现,提供了快速的存取速度。 - **TreeMap**:基于红黑树实现,可以保持键的自然排序。 - **LinkedHashMap**:结合了HashMap和链表的特点,可以按照插入顺序或访问...
根据给定文件的信息,我们可以详细地探讨一下Java中几种主要的集合容器——List、Set以及Map的区别,并且深入了解它们各自的特性和应用场景。 ### 一、List #### 1. ArrayList - **特点**:`ArrayList`是基于动态...
了解和熟练掌握List、Set和Map接口及其实现类,对于编写高效、可维护的Java代码至关重要。在实际应用中,根据需求选择合适的集合类型,并结合排序、遍历、线程安全等知识点,能够更好地解决各种数据结构问题。
在Java编程语言中,集合框架是处理对象的重要工具,其中包括Set、List和Map三大接口。这些接口提供了多种数据结构和操作方法,使得开发者能够高效地组织和管理数据。 1. **Set接口**: Set接口表示一个不包含重复...
总结,通过使用Java的Jedis库,我们可以轻松地实现对Redis的String、List和Map的操作。通过封装和单元测试,可以提高代码的可维护性和可靠性。在实际项目中,还可以考虑使用更高级的客户端如Lettuce,以及Spring ...
ArrayList 和 LinkedList 是 List 集合的两个常用的实现类。ArrayList 使用数组结构,查询速度快,但增删慢。LinkedList 使用链表结构,查询速度慢,但增删快。 Set 集合是一种无序集合,不能存储重复元素。HashSet...
`Set`接口的实现类有`HashSet`、`TreeSet`等。`HashSet`是基于哈希表的,插入和查找速度较快,但无序;`TreeSet`则基于红黑树,保证元素排序,可以按自然顺序或自定义比较器进行排序,但性能略低于`HashSet`。 `Map...
总结来说,List和Set在使用`retainAll`方法时,Set的效率通常优于List,尤其是当集合元素数量庞大时。这主要归功于Set的内部实现,如HashSet的哈希表结构。在实际开发中,应根据具体需求和性能考虑来选择合适的集合...
List接口的实现类有ArrayList、LinkedList和Vector等。 #### 常用方法 除了Collection接口中的方法,List还提供了以下方法: - `get(int index)`:获取指定索引处的元素。 - `set(int index, E element)`:替换...
在Java编程语言中,集合框架是处理对象集合的重要工具,主要包括了List、Set、Map以及Table等接口及其实现类。这些接口和类各有特点,适用于不同的数据存储和操作场景。 1. **List接口**: - List是Collection的一...
Hashtable和HashMap的区别在于,Hashtable是一个同步的Map实现类,而HashMap是一个非同步的Map实现类。因为同步需要花费机器时间,所以Hashtable的执行效率要低于HashMap。 Collection框架是Java容器类的基础,它...
### Set,List,Map 的区别与应用 在 Java 编程语言中,集合框架是一个非常重要的概念,它提供了存储和操作对象的方式。集合框架主要包括三种类型的集合:`Set`、`List` 和 `Map`。这三种集合各自拥有独特的特性和...
Java 集合类 List-Set-Map 的区别和联系 Java 集合类 List、Set 和 Map 是 Java 语言中最基本的集合类,它们之间存在着紧密的联系和区别。在本文中,我们将对 Java 集合类 List、Set 和 Map 的区别和联系进行详细的...
"Java集合Collection、List、Set、Map使用详解" Java集合是Java编程语言中最基本也是最重要的一部分。能够正确地使用集合类和理解集合的实现原理对于Java程序的开发具有无比的好处。本文将详细解释Java集合的实现...
### Java集合Collection、List、Set、Map使用详解 #### 1. 集合框架概述 集合框架是Java编程语言中最基本且最重要的组成部分之一。它提供了处理数据集合的强大工具,这些工具不仅支持基本操作(如添加、删除和查找...
例如,可能包含如何使用put()方法向Map中添加元素,如何使用add()方法向List和Set中添加元素,以及如何使用get()方法获取元素等基本操作。 总的来说,熟悉和掌握Map、List和Set接口以及序列化是Java编程的基础,...