1.首先了解一下HashSet的原理:

Set接口
  Set是对数学上集的抽象,Set中不包含重复的元素.如何界定是否是重复元素?Set最多可含一个null元素;对于任意的非null元素e1和e2,都满足e1.equals(e2)==false.
  Object.hashcode()的约定:
a.在程序的一次执行中,无论何时在同一个java对象上重复调用hashcode(),都必须一致地返回同一个整数值,并不像Object.equals()那样提供Object是否被修改了的信息,但这个整数值不必在同一个应用程序的多次运行之间保持一致.
b.如果两个Object通过equals()判断是相等的,那么,在这两个Object上调用hashcode()必返回相同的值.

c.如果两个Object通过equals()判断是不相等的,那么,并不要求这两个Object.hashcode()返回不同的整数值.

Set实现
  HashSet是使用一个哈希表存储元素的,是非排序的,可以随机访问,是Set的最优性能实现.TreeSet实现了SortedSet接口,使用一个红黑树来存储元素,提供了元素的有序存储和访问.
   HashSet(HashSet在底层借用HashMap)
  HashSet在底层实现上依赖于HashMap.
    HashSet的源码片断:

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object(); public HashSet() {
map = new HashMap<E,Object>();
} public boolean add(E o) {
return map.put(o, PRESENT)==null;
} public boolean remove(Object o) {
return map.remove(o)==PRESENT;
} public boolean contains(Object o) {
return map.containsKey(o);
}

从代码可见,HashSet在底层借用HashMap,使用一个Object类型的哑元值作为HashSet中元素在底层HashMap存储中的映射值.它抓住了HashMap的键不允许重复的特性.对于add()中调用底层映射的put(),将欲添加的元素和一个PRESENT哑元值放入底层map.如果底层Map返回null,说明原来的集合中并不存在该键.对于Map接口的put()返回null时有两种解释,一是原来的Map中不包含该键;另一种可能是原来的Map中已经存储了该健,但该键映射到null.而在HashSet中的add()和remove()等中的返回null只有一种解释,即原来的集合不包含该元素.这是因为HashSet的底层的映射中存储的都是一个名为PRESENT的Object类型的对象,不可能是null.

2.示例代码如下:

          UserLookupSearchCriteria criteria =(UserLookupSearchCriteria) theForm.getSearchCriteria2();
String tempFilterUserCodes=criteria.getFilterUserCodes();//这里指从页面上获取的filterUserCodes String filterUserCodes=printDlg.getFileUserCodes();//调用一个接口,从数据库查询的filterUserCodes //然后现在有两个filterUserCodes,他们的值是不同的,所以需要遍历来获取他们一个不重复的set集合,然后传入后台进行过滤。 Set<String> userCodesSet=new HashSet<String>();//新建一个Hashset集合 if(!StringUtil.isEmpty(tempFilterUserCodes)){
String[] tempUserCodesArray=tempFilterUserCodes.split(",");
for(String userCode:tempUserCodesArray){
userCodesSet.add(userCode);
}
} //判断如果tempFilterUserCodes不为空,就使用split方法转为数组进行遍历,然后add到set集合中
if(!StringUtil.isEmpty(filterUserCodes)){
String[] userCodesArray=filterUserCodes.split(",");
for(String userCode:userCodesArray){
userCodesSet.add(userCode);
}
} //判断如果filterUserCodes 不为空,就使用split方法转为数组进行遍历,然后add到set集合中,但是在这里如果两个String的值都不为空,根据set集合的特性,会过滤掉重复的值,所以得到的set集合是一个没有重复值的集合。
StringBuffer userCodeStr=null;
if(userCodesSet!=null&&userCodesSet.size()>0){
userCodeStr=new StringBuffer();
for(String userCode:userCodesSet){
userCodeStr.append(userCode).append(",");
}//然后去遍历userCodesSet集合,转为一个String,
userCodeStr.deleteCharAt(userCodeStr.length()-1); //使用String的方法deleteCharAt 过滤掉最后一个逗号 }
criteria.setFilterUserCodes(userCodeStr==null?"":userCodeStr.toString());//拿到新的String传入后台
UserLookupSearchCriteria userLookupSearchCriteria = printDlg.getUserLookupList(criteria);
theForm.setUsers(userLookupSearchCriteria.getUsers());
theForm.setSearchCriteria2(userLookupSearchCriteria); forwardName = "userlookupList";

note:这里为什么要使用这样的过滤呢?是因为一个是从页面上传入过来的userCode,还有一个是从后台读取的userCode,而这两个String都是需要过滤掉的,所以需要使用整合过滤。

关于利用HashSet,split,deleteCharAt等方法详解的更多相关文章

  1. 利用C#实现AOP常见的几种方法详解

    利用C#实现AOP常见的几种方法详解 AOP面向切面编程(Aspect Oriented Programming) 是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 下面这篇文章主要 ...

  2. Python 字符串方法详解

    Python 字符串方法详解 本文最初发表于赖勇浩(恋花蝶)的博客(http://blog.csdn.net/lanphaday),如蒙转载,敬请保留全文完整,切勿去除本声明和作者信息.        ...

  3. Python内置方法详解

    1. 字符串内置方法详解 为何要有字符串?相对于元组.列表等,对于唯一类型的定义,字符串具有最简单的形式. 字符串往往以变量接收,变量名. 可以查看所有的字符串的内置方法,如: 1> count ...

  4. equals()方法和hashCode()方法详解

    equals()方法和hashCode()方法详解 1. Object类中equals()方法源代码如下所示: /** * Object类中的equals()方法 */ public boolean ...

  5. session的使用方法详解

    session的使用方法详解 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器 ...

  6. C++调用JAVA方法详解

    C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...

  7. CURL使用方法详解

    php采集神器CURL使用方法详解 作者:佚名  更新时间:2016-10-21   对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程 ...

  8. Java提高篇——equals()与hashCode()方法详解

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

  9. for_each使用方法详解[转]

    for_each使用方法详解[转] Abstract之前在(原創) 如何使用for_each() algorithm? (C/C++) (STL)曾經討論過for_each(),不過當時功力尚淺,只談 ...

随机推荐

  1. 【VMware】安装不同系统的虚拟机出现开机黑屏的情况

    解决方法一: 1.以管理员身份运行命令提示符(cmd.exe),输入命令 netsh winsock show catalog 按下回车键执行命令(可以看到VMware注册了两个LSP:vSocket ...

  2. Spring JdbcTemplate 使用总结

    1.查询Object public Classify queryClassifById(int id){ String sql="select * from t_classify where ...

  3. VS2008、 VS2010 、 VS2012、 VS2013 都能用的快捷键

    VS2008.  VS2010  . VS2012.  VS2013 都能用的快捷键 Ctrl+E,D             --格式化全部代码 Ctrl+K,F              --格式 ...

  4. 数组和矩阵(3)——Next Greater Element I

    https://leetcode.com/problems/next-greater-element-i/#/description You are given two arrays (without ...

  5. 【代码笔记】Java常识性基础补充(一)——赋值运算符、逻辑运算符、三元运算符、Scanner类、键盘输入、Random类、随机数

    为什么要进行Java常识性基础补充? 之前学习Java语言,学得很多很杂,而且是很多不同的方面插入讲解的,比如在跟班上课,自学java编程例子,java语法,过了很久,因为各种原因长时间不怎么写,有时 ...

  6. linux C之判断文件或目录是否存在 access函数

    http://blog.sina.com.cn/s/blog_6a1837e90100uh5d.html access():判断是否具有存取文件的权限 相关函数    stat,open,chmod, ...

  7. maven学习(二)maven常用的命令

    参考博客:(http://blog.csdn.net/keda8997110/article/details/20925449) 以下命令都是基于命令行的操作,也可以直接在eclipse等IDE上ma ...

  8. Spring Boot学习路线

    Spring Boot 学习路线,本文计划根据作者近几年的工作.学习经验,来分析和制定一个学习使用 Spring Boot技术的步骤路线图. SpringBoot是伴随着Spring4.0诞生的: S ...

  9. sqlserver学习3---sql函数

    一.SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法.但是 SQL 语言也包含用于更新 ...

  10. 深度剖析hdfs原理

    大数据底层技术的三大基石起源于Google在2006年之前的三篇论文GFS.Map-Reduce. Bigtable,其中GFS.Map-Reduce技术直接支持了Apache Hadoop项目的诞生 ...