JAVA基础部分复习(二、集合类型)
对于这些常用的集合,建议还是需要先了解一下底层实现原理,这样在不同的使用场景下才能选择更好的方案。
Set介绍以及对比,常用方法:
package cn.review.day02; import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.TreeSet; import org.junit.Test; /**
* Set集合复习
* Set集合用于存储无序,不重复的元素,可以存储一个null值。
* 其中Set集合主要分为:HashSet,LinkedSet,TreeSet
*
* 集合性能分析:
* HashSet和TreeSet是Set集合中用得最多的I集合。HashSet总是比TreeSet集合性能好,因为HashSet不需要额维护元素的顺序。
* LinkedHashSet需要用额外的链表维护元素的插入顺序,因此在插入时性能比HashSet低,但在迭代访问(遍历)时性能更高。
* 因为插入的时候即要计算hashCode又要维护链表,而遍历的时候只需要按链表来访问元素。
* @author dyq
*
*/
public class ReviewSet {
@Test
public void setTest() {
/**
* HashSet:实现了set接口,存储元素是无序的,从底层代码可以看到是用HashMap来实现的,是一个value相同key不同的HashMap
* 使用hashCode的算法来存储元素,因此具有比较好的读写性能,是非线程安全的。
*/
HashSet<String> hashSet = new HashSet<String>();
hashSet.add("aaa");
hashSet.add("bbb");
hashSet.add("ccc");
hashSet.add("ddd");
Iterator<String> iter0 = hashSet.iterator();
while(iter0.hasNext()) {
System.out.println(iter0.next()+"=====");
}
System.out.println(hashSet);
/**
* LinkedHashSet:从底层代码可以看到继承了HashSet,实现了Set接口。
* LinkedHashSet存储元素使用一个链表来维护元素的插入顺序,读取的时候按照插入顺序读取。
* LinkedHashSet本质上也是从LinkedHashMap而来,LinkedHashSet的所有方法都继承自HashSet, 而它能维持元素的插入顺序的性质则继承自LinkedHashMap。
* 同时LinkedHashSet是非线程安全的。
*
*/
LinkedHashSet<String> lhSet = new LinkedHashSet<String>();
lhSet.add("aaa");
lhSet.add("bbb");
lhSet.add("ccc");
Iterator<String> iter = lhSet.iterator();
while(iter.hasNext()) {
System.out.println(iter.next()+"------");
}
System.out.println(lhSet);
/**
* TreeSet:从源码中可以看到,TreeSet实现了NavigableSet集合,而NavigableSet继承于SortedSet。
* TreeSet底层是用TreeMap来实现的,其原理是红黑树,默认是自然升序排序,同时也可以定制排序,需要关联一个 Comparator对象,由Comparator提供排序逻辑。
* 因为会默认调用compareTo比较元素大小,做升序排序,所以TreeSet只允许存储同一类元素。
* TreeSet同样是非线程安全的。
*/
//本集合使用自定义排序倒序排序。
TreeSet<Integer> treeSet = new TreeSet<Integer>(new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
int a1 = (Integer)o1;
int a2 = (Integer)o2;
return a1<a2?1:a1>a2?-1:0;
}
});
treeSet.add(3);
treeSet.add(1);
treeSet.add(8);
treeSet.add(2);
System.out.println(treeSet);
} /**
* 获取字符串的hashCode值
*/
@Test
public void hashCodeTest() {
String str = "aa";
String str1 = "aa";
System.out.println(str.hashCode());
System.out.println(str1.hashCode());
} }
List介绍以及对比,常用方法:
package cn.review.day02; import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Vector; import org.junit.Test; /**
* List集合
* List是继承于Collection接口,除了Collection通用的方法以外,扩展了部分只属于List的方法。
* List是一个有序的集合,和set不同的是,List允许存储项的值为空,也允许存储相等值的存储项.
* List包含:ArrayList,LinkedList,Vector
* @author dyq
*
*/
public class ReviewList { @Test
public void listTest() {
/**
* ArrayList:底层是一个数组实现的列表,由于数据是存入数组中的,因此也跟数组的特点一样,查询很快,但是中间部分的插入和删除都很。
* 适用于多查找的场景
* 非线程安全的。
*/
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("1111");
arrayList.add("2222");
System.out.println(arrayList.toString()); /**
* LinkedList:底层是由链表实现,插入和删除方便,适用于多次数据替换的场景
*/
LinkedList<String> linkedList = new LinkedList<String>();
linkedList.add("1111");
linkedList.add("2222");
System.out.println(linkedList.toString());
/**
* Vector:Vector就是ArrayList的线程安全版,它的方法前都加了synchronized锁,其他实现逻辑都相同。
* 由于锁的原因导致Vector要比ArrayList慢。
*/
Vector<String> vector = new Vector<String>();
vector.add("3333");
vector.add("4444");
System.out.println(vector.toString());
}
}
Map介绍以及对比,常用方法:
package cn.review.day02; import java.util.Comparator;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap; import org.junit.Test; /**
* Map:用于保存具有映射关系的数据,key-value形式,key不能重复。
* Map---实现Map
* Map.Entry--Map的内部类,描述Map中的按键/数值对。
* SortedMap---扩展Map,使按键保持升序排列
*
* 常用Map类型介绍:HashMap,HashTable,LinkedHashMap,TreeMap
*
* @author dyq
*
*/
public class ReviewMap {
@Test
public void mapTest() {
/**
* HashMap:非同步的,所以是线程不安全的,异步的所以读写速度都很快。
* HashMap中允许key或者value为null
*/
HashMap<String, String> hashMap = new HashMap<String,String>();
hashMap.put("1","aaa");
hashMap.put(null,null);
for(Map.Entry<String, String> entry : hashMap.entrySet()) {
System.out.println(entry.getKey()+"---"+entry.getValue());
} /**
* Hashtable:查看源码发现,其方法使用synchronized关键字修饰,为同步的,线程安全的,所以读写速度都会变慢。
* Hashtable中不允许key或者value的值为null。
*/
Hashtable<String,String> hashTable = new Hashtable<String,String>();
hashTable.put("1","aaa");
hashTable.put("2","bbb" );
for(Map.Entry<String, String> entry :hashTable.entrySet()) {
System.out.println(entry.getKey()+"--"+entry.getValue());
}
/**
* LinkedHashMap:查看源码发现,继承了HashMap,其底层使用双向链表维护键值对的顺序,迭代顺序与键值对插入的顺序一致。
* LinkedHashMap需要维护插入时候的顺序,所以性能低于HashMap,但是在迭代元素的时候有很好的性能,因为它是用链表来
* 维护内部的顺序。
*/
LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<String,String>();
linkedHashMap.put("1","aaa");
linkedHashMap.put("2","bbb");
for(Map.Entry<String, String> entry : linkedHashMap.entrySet()) {
System.out.println(entry.getKey()+"--"+entry.getValue());
}
/**
* TreeMap:查看源码发现,继承了SortedMap,基于红黑树对所有的key进行排序,有两种排序 方式:自然排序和定制排序。
* 自定义排序需要关联一个Comparator对象,重写compare方法。
*/
TreeMap<String, String> treeMap = new TreeMap<String,String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
treeMap.put("1", "aaa");
treeMap.put("2", "bbb");
for(Map.Entry<String, String> entry:treeMap.entrySet()) {
System.out.println(entry.getKey()+"--"+entry.getValue());
} }
}
JAVA基础部分复习(二、集合类型)的更多相关文章
- Java基础-引用数据类型之集合(Collection)
Java基础-引用数据类型之集合(Collection) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便 ...
- Java基础拾遗(二)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358523冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...
- JAVA基础第五章-集合框架Map篇
业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...
- java基础解析系列(二)---Integer
java基础解析系列(二)---Integer 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bug的时候,才能处理更加从容. 目录 java基础解析 ...
- java基础语法(二)--单列模式
java基础语法(二)--单列模式 /** * 功能:单列模式 * @author Administrator * */ public class SingletonTest { public sta ...
- Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介
1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...
- java基础知识点补充---二维数组
#java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...
- JAVA基础部分复习(一、8中基础类型,以及String相关内容)
以下是关于java中8种基本类型的介绍说明: package cn.review.day01; /** * java基础复习,8种数据类型 * (byte,short,long,int,double, ...
- Java基础学习笔记二十八 管家婆综合项目
本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...
随机推荐
- windows 下的命令操作
删除文件夹 RD /S D:\aaaaa 删除文件夹下的文件 DEL D:\aaaaa\*.*
- pytesseract 验证码识别
以下代码,如有不懂加群讨论# *-* coding:utf-8 *-* #import jsonimport requestsimport pytesseractimport timeimport d ...
- Maven常见jar包依赖
<!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactI ...
- 蓝桥杯—ALGO-2 最小最大公倍数
问题描述已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式输入一个正整数N. 输出格式输出一个整数,表示你找到的最小公倍数.样例输入9样例输出504数据规模与约定1 ...
- WINDOWS 端口查看
查看Windows下所有使用的端口 netstat -ano 查看Windows下某一个特定的端口 netstat -ano | find "8080" 查看windows下所 ...
- SQL 常用判断语句
我们在做sql更新时,为防止sql重复执行报错,需要对所需要执行的对象进行判断是否存在: 常用判断脚本如下: 判断视图是否存在 IF object_id('viewname') IS not NULL ...
- vue组件通信方式总结
对于vue来说,组件之间的消息传递是非常重要的,下面是我对组件之间消息传递的各种方式的总结,总共有8种方式. 1. props和$emit 父组件向子组件传递数据是通过prop传递的,子组件传递数据给 ...
- ural1297
题解: 后缀数组 st表处理加速lcp 把串后面加一个不可能出现的字符 然后再把串倒过来放在后面 暴力枚举中心 判断lcp 代码: #include<bits/stdc++.h> usin ...
- Linux Shell 编程 教程 常用命令
概述: Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户 ...
- 卷积与反卷积以及步长stride
1. 卷积与反卷积 如上图演示了卷积核反卷积的过程,定义输入矩阵为 I(4×4),卷积核为 K(3×3),输出矩阵为 O(2×2): 卷积的过程为:Conv(I,W)=O 反卷积的过称为:Deconv ...