Collection类相关总结
集合类的框架如下:
Collection(接口)
List(接口):允许重复。
ArrayList
Vector
LinkedList
Set(接口):不允许重复
HashSet
TreeSet
Collection:由于collection是一个接口,不能实例化。
- collection中的方法(list继承他的方法,因此,以下方法都可以用)
- add(E e) :往集合里新增一个元素 return boolean
- addAll(Collection c) 往一个集合中新增一个集合的所有元素
- clear() 移除所有元素
- contains(Object o) 如果此 collection 包含指定的元素,则返回 true。
- containsAll(Collection c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true。
- isEmpty() 如果此 collection 不包含元素,则返回 true。
- remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
- removeAll(Collection c) 移除此 collection 中那些也包含在参数 collection 中的所有元素
- retainAll(Collection c) 交集
- size() 返回此 collection 中的元素数
- Object[] toArray() 返回包含此 collection 中所有元素的数组。
- Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器
//迭代器的几种使用方法 Iterator<String> iterator = collection.iterator();
//第一种,使用iterator.next();
String next = iterator.next();
System.out.println("TestMain.main()X"+next);
iterator.remove();
System.out.println("TestMain.main()X"+next);
String next2 = iterator.next();
System.out.println("TestMain.main()X"+next2);
//第二种,iterator.hasnext()
while (iterator.hasNext()) {
String string = (String) iterator.next();
System.out.println("TestMain.main()"+string);
}
//第三种,for循环遍历
for (Iterator iterator2 = collection2.iterator(); iterator2.hasNext();) {
String string = (String) iterator2.next();
}
2,list,是collection的子类
- 遍历list中的元素,可以用iterator迭代器,也可以用list自己的迭代器ListIterator(listiterator是iterator的一个子接口)
//list接口
List list=new ArrayList();
list.add("hello");
list.add("world");
list.add("!"); //list特有的遍历方式
//第一种,不适用迭代器
for(int i=0;i<list.size();i++){
Object object = list.get(i);
System.out.println("TestMain.main()"+object); }
//第二种,使用List特有的迭代器
int i=0;
//ListIterator listIterator = list.listIterator();
while(listIterator.hasNext()){
Object next = listIterator.next();
System.out.println("ListDemo.main()"+next);
listIterator.set("student"+i++); }
//listIterator
while(listIterator.hasPrevious()){
Object previous = listIterator.previous();
System.out.println("TestMain.main()"+previous);
}
for(ListIterator listIterator=list.listIterator();listIterator.hasNext();){
Object next = listIterator.next();
System.out.println("TestMain.main()"+next);
}
3,ArrayList(上面的都可以实现,因为ArrayList是他们的子类)
- ArrayList特有的方法(增强型for循环JDK1.5之后才有的)
for (Object object : arrayList) {
System.out.println("TestMain.main()"+object);
}- 需要注意的是:增强性for循环中不能同时去增加或删除集合里面的元素。不然会报java.util.ConcurrentModificationException的错误。
- 正确的说法应该是,要删除list里面的元素,有两种方式,一种是通过list.size()做for循环,另一种是通过iterator迭代器删除(迭代器删除的时候不能通过list.remove删除,只能通过iterator.remove删除)如下所示:
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
//list.remove(object);运行时会报错
iterator.remove();//运行成功
}
4,set
- set不允许重复。
- 实现原理:实际上用的是hashmap函数,而hashmap底层依赖的是哈希表。set的添加功能底层依赖hashcode与equals两个方法。
- 具体代码实现如下
hashset的底层实现是一个hashmap 哈希表
map = new HashMap<>(); 映射(key,value) 一一映射 set.add("hello"); (“hello” present)
set.add("world");
set.add("cskaoyan");
set.add("java");
set.add("hello"); map.put(“hello” present) // Student s4 = new Student("zhaoliu",23);
// Student s5 = new Student("zhagnsan",23); public V put(K key, V value) { //如果哈希表为空,新建一张哈希表
if (table == EMPTY_TABLE) {
inflateTable(threshold);
} //如果为null,会插入一个key为null的映射(null, present)
if (key == null)
return putForNullKey(value); //通过这个key去计算其哈希值
int hash = hash(key); "student" "student" 字符串的哈希值一样 //从哈希表里找对应的hash值的位置。如果没有返回0
int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
} modCount++;
addEntry(hash, key, value, i);
return null;
} final int hash(Object k) {
int h = hashSeed;
if (0 != h && k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
} h ^= k.hashCode(); 100 // This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
} 字符串的hashcode :结论是两个字符串存储的字符一样,hash值一样。
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value; for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}- hashset的用法如下:
HashSet<Object> hashSet = new HashSet<>(); //插入的是基本类型
/*hashSet.add("student");
hashSet.add("add");
hashSet.add("student");*/
//如果插入的是自己写的类,如student类中,name,age.如何判断是否为同一个
Student student1=new Student("zhangsan",11);
Student student2=new Student("lisi",22);
Student student3=new Student("zhangsan",11);
hashSet.add(student1);
hashSet.add(student2);
hashSet.add(student3);
//此时需要重写student的equals方法和hashcode方法 for (Object object : hashSet) {
System.out.println("TestMain.main()"+object);
}
5,map
- map接口(映射),Map<K,V>,
K- 此映射所维护的键的类型,V- 映射值的类型 - map的成员方法如下:
- V put(K key,V value)
- V remove(Object key)
- void clear()
- boolean containsKey(Object key)
- boolean containsValue(Object value)
- boolean isEmpty()
- int size()
- V get(Object key)
- Set<K> keySet()
- Collection<V> values()
- Set<Map.Entry<K,V>> entrySet()
- hashmap案例如下
HashMap<String,String>
HashMap<Integer,String>
HashMap<String,Student>
HashMap<Student,String>
- map接口(映射),Map<K,V>,
6,map和collection的区别
- Map是双列的,Collection是单列的
- Map的键唯一,Collection的子体系Set是唯一的
- Map集合的数据结构值针对键有效,跟值无关
- Collection集合的数据结构是针对元素有效
Collection类相关总结的更多相关文章
- C#异常类相关总结
C#异常类相关总结 C#异常类相关总结 C#异常类一.基类ExceptionC#异常类二.常见的异常类1.SystemException类:该类是System命名空间中所有其他异常类的基类.(建议:公 ...
- Class类相关
Class类是java.lang包中的类,该类的实例可以帮助程序创建其他类的实例或者取得其他类的对象的内部信息 使用class类获得一个类相关的class类(注意得到的是class类,不是相关的类) ...
- Python学习笔记008_类_对象_继承_组合_类相关的BIF
# 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...
- 多线程(二)~Thread类相关的API介绍
一.线程安全问题: 当我们使用多个线程操作统一方法内的局部变量的时候,每个局部变量在当前线程里都有自己的副本,这种情况是不会出现线程安全问题的.当我们两个线程同时操作全局变量的时候,有可能 ...
- C#图解教程学习笔记——类相关的概念
一.一些基本概念1. 字段:隶属于类的变量,即类的成员变量.2. 方法:隶属于类的函数,即类的成员函数.3. 实例成员:类的每个实例拥有自己的各个类成员的副本,这些成员称为实例成员. 改变一个实例字段 ...
- Collection类及常用API
Collection类及常用API Collection—类集工具类,定义了若干用于类集和映射的算法,这些算法被定义为静态方法,具体查看api文档; a) public static void so ...
- Python 基础之面向对象之类中的方法和与类相关的魔术属性以及反射
一.类中的方法 普通方法: 没有参数,只能类调用绑定方法: (1)绑定到对象(自动传递对象参数) (2)绑定到类(自动传递参数)静态方法: 无论是类还是对象,都能调用的方法#例:class Dog() ...
- 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解
PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...
- PyQt(Python+Qt)入门:Designer组件属性编辑界面中QWidget类相关属性详解
本文适用人员:本文比较长,适合不理解Qt Designer部件属性的人员阅读或资料查找. 声明: 1.如果有人认为本文是简单的复制粘贴+翻译而成,敬请读本文最后的后记: 2.本文为老猿Python学习 ...
随机推荐
- 使用StyleCop进行代码审查
使用StyleCop进行代码审查 工欲善其事,必先利其器,上篇简单介绍了怎样使用Astyle进行代码格式化,使编写的代码具有一致的风格.今天简单介绍下怎样使用StyleCop对原代码进行审查,看编写的 ...
- angularjs 手动加载
利用ng-app可以完成自动加载,如果不利用ng-app.那么使用bootstrarp实现手动加载模块 <html> <head> <script src="a ...
- 树莓派启用root账户
树莓派使用的linux是debian系统,所以树莓派启用root和debian是相同的. debian里root账户默认没有密码,但账户锁定. 当需要root权限时, 直接执行 sudo su 即可切 ...
- C#基础之数组排序,对象大小比较
从个小例子开始: 1 2 3 int[] intArray = new int[]{2,3,6,1,4,5}; Array.Sort(intArray); Array.ForEach<int&g ...
- [IOS Tableview] cell自定义view显示错误问题
问题介绍:按照tableviewcell的tag自定义cell的view显示的时候,会出现拖动时显示错误情况(在Tableview的范围超出屏幕范围需要滑动的情况下). 我做的是一个下载界面,我为了简 ...
- 开发一个jQuery插件——多级联动菜单
引言 开发中,有好多地方用到联动菜单,以前每次遇到联动菜单的时候都去重新写,代码重用率很低,前几天又遇到联动菜单的问题,总结了下,发现可以开发一个联动菜单的功能,以后想用的时候就方便多了.项目中每个页 ...
- HDU 5923 Prediction
这题是2016 CCPC 东北四省赛的B题, 其实很简单. 现场想到的就是正解, 只是在合并两个并查集这个问题上没想清楚. 做法 并查集合并 + 归并 对每个节点 \(u\), 将 \(u\) 到根的 ...
- 配置ASP.NET Web应用程序, 使之运行在medium trust
这文章会向你展示, 怎么配置ASP.NET Web应用程序, 使之运行在medium trust. 如果你的服务器有多个应用程序, 你可以使用code access security和medium ...
- UI学习之常用方法
1.-(BOOL) respondsToSelector: selector 用来判断是否有以某个名字命名的方法(被封装在一个selector的对象里传递) if ([delegate respond ...
- 什么是FOUC?如何避免FOUC?
因为在看一些面试题,所以接触到了这个词 FOUC 什么叫做 FOUC 浏览器样式闪烁 如果使用import方法对css进行导入,会导致某些页面在Windows 下的Internet Explorer出 ...