HashSet是Set接口的实现类,储存的是无序、唯一的对象。由于是无序的所以每组数据都没有索引,很多list可用的方法他都没有,凡是需要通过索引来进行操作的方法都没有,所以也不能使用普通for循环来进行遍历,只有加强型for和迭代器两种遍历方法。
主要方法add():
只有set中尚未包含指定元素,则添加指定元素返回true,否则添加失败返回false。remove():
如果指定元素存在于此 set 中,则将其移除。底层使用HashMap的remove方法删除指定的Entry。contains():
判断某个元素是否存在于set中。clone():
调用返回这个集合的浅表副本。
示例代码:
HashSet<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
set.add("c");//之前有则添加会失败
set.add("是否包含c:"+set.contains("c"));
set.add("d是否在集合中:"+"d".equals(set));
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
LogU.i("MainActivity -->", "TreeSet: " + set.size() + " : " +
next + ",hashcode值为:" + next.hashCode() + "");
}
//HashSet<String> cloneset = new HashSet<String>();
HashSet cloneset = (HashSet) set.clone();
System.out.println("原数据:" + set);
System.out.println("克隆数据:" + cloneset);
打印结果:
TreeSet: 5 : d是否在集合中:false,hashcode值为:97196323
TreeSet: 5 : a,hashcode值为:97
TreeSet: 5 : b,hashcode值为:98
TreeSet: 5 : 是否包含c:true,hashcode值为:3569038
TreeSet: 5 : c,hashcode值为:99
原数据:[false, a, b, true, c]
克隆数据:[a, false, b, c, true]
试题:找到字符串中第一个重复出现的字符
private char getChar(String str) {
HashSet hashSet = new HashSet();
char[] chars = str.toCharArray();
for (int i = 0; i < str.length(); i++) {
if (!hashSet.add(chars[i])) {
//添加失败,说明之前已经存在了
return chars[i];
}
}
return 0;
}