Java 容器与集合

目录
一、容器概念
二、 接口
1. 接口有两个子接口Set和List
2. 中常用方法:
3.代码示范:
4.的遍历
5. 泛型 < >
三、 接口
1. 的特点
2. 接口常用方法
3. 使用迭代器时的步骤
四、List接口
1. 特征
2. 常用方法
3. List的遍历
4. 解决并发增加问题
五、类
1. 特点
2.常用方法
3. 的遍历
4.储存对象
六、类
1. 特点
2. 遍历和常用方法
七、Set接口
1. 特点
2. Set常用方法
3. Set的遍历
八、类
1. 特点
2. 遍历
3. 常用方法
4. 去重
5. 代码示范
九、Map接口
1. 特征
2. Map常用方法
3. Map的遍历
4. 引用类型数据去重
5. 类
十、工具类
1. 特征
2. 常用方法
3. 代码示范
十一、File类
1. 概念
2. 要点
3. 常用方法
(1)创建功能
(2)重命名和删除功能
(3)判断功能
(4)获取功能
一、容器概念
数组是一种简单的线性序列,可以快速的访问数组元素,效率高,但是从数组 长度一旦确定,不可改变,因此,数组远远不能满足我们的需求 。我们需要一种灵活的,容量可以随时扩充的容器来装载我们的对象,这就需要用到容器类 , 或者叫集合框架 。
体系图如下:

Java 容器与集合

文章插图
接口是一组允许重复的对象 。Set 接口继承 ,无序不允许重复,使用自己内部的一个排列机制 。List 接口继承  , 有序允许重复 , 以元素安插的次序来放置元素 , 不会重新排列 。Map 接口是一组成对的键值对象,即所持有的是 key-value pairs 。Map 中不能有重复的 key 。拥有自己的内部排列机制 。容器中的元素类型都为引用类型,不能放置原生数据类型(使用装箱即可),使用泛型保留类型 。二、 接口 1. 接口有两个子接口Set和List2. 中常用方法: 方法摘要
add(Ee)
确保此包含指定的元素(可选操作) 。
()
如果此包含指定中的所有元素,则返回 true 。
()
比较此与指定对象是否相等 。
int
()
返回此的哈希码值 。
()
如果此不包含元素 , 则返回 true 。
()
返回在此的元素上进行迭代的迭代器 。
()
从此中移除指定元素的单个实例,如果存在的话(可选操作) 。
()
移除此中那些也包含在指定中的所有元素(可选操作) 。
()
仅保留此中那些也包含在指定的元素(可选操作) 。
int
size()
返回此中的元素数 。
[]
Java 容器与集合

文章插图
()
返回包含此中所有元素的数组 。
T[]
(T[]a)
返回包含此中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同 。
3.代码示范:
public static void main(String[] args) {//1.创建容器Collection c=new ArrayList();/** 2.添加元素* boolean add(E e) 确保此 collection 包含指定的元素(可选操作) 。boolean addAll(Collection c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作) 。*/c.add("清华大学");c.add("北京大学");Collection c2=new ArrayList();c2.add("哈工大");c2.add("佳木斯大学");c2.add(1); //Integer 自动装箱System.out.println(c.size());c.addAll(c2);/** 3.获取*int size() 返回此 collection 中的元素数 。boolean isEmpty() 如果此 collection 不包含元素,则返回 true 。*/System.out.println(c.size());System.out.println("判断是否为空:"+c.isEmpty());System.out.println(c);/** 4.删除*void clear() 移除此 collection 中的所有元素(可选操作) 。boolean remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作) 。boolean removeAll(Collection c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作) 。boolean retainAll(Collection c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作) 。*/System.out.println(c.size());System.out.println("remove:"+c.remove("清华大学"));System.out.println(c.size());//System.out.println("removeAll:"+c.removeAll(c2));System.out.println("removeAll:"+c.retainAll(c2));System.out.println(c.size());//c.clear();System.out.println(c.size());System.out.println("判断是否为空:"+c.isEmpty());/**Object[] toArray() 返回包含此 collection 中所有元素的数组 。*/Object[] obj=c.toArray();System.out.println(Arrays.toString(obj));/** 5.是否包含*boolean contains(Object o) 如果此 collection 包含指定的元素,则返回 true 。*/System.out.println(c.contains("佳木斯大学"));
4.的遍历
因为没有索引去定位,因此普通for循环无法使用,可以使用增强for循环和迭代器来遍历它 。
public static void main(String[] args) {Collection c=new ArrayList();c.add("拇指");c.add("食指");c.add("中指");c.add("无名指");c.add("小手指");//foreach循环for(Object s:c){System.out.println(s);}System.out.println("----------------------------------");//使用迭代器//1.获取一个迭代器对象 凡是实现了Collection接口的类都有iterator()方法Iterator it=c.iterator();//2.判断是否还有下一个元素while(it.hasNext()){//3.如果有下一个元素就使用next()方法获取//String s=(String) it.next();Object s = it.next();System.out.println(s);}}
5. 泛型 < >装入集合的类型都被当作对待,从而失去自己的实际类型,使用泛型,保留了容器中元素的类型 。从集合中取出时往往需要转型,效率低 , 容易产生错误 。
Java 容器与集合

文章插图
三、 接口 1. 的特点
所有实现了接口的容器类个 都有一个方法用以返回一个实现了接口的对象 。对象称作迭代器,用以方便的实现对容器内元素的遍历操作 。
Java 容器与集合

文章插图
2. 接口常用方法
boolean hasNext(); //判断是否有元素没有被遍历Object next(); //返回游标当前位置的元素并将游标移动到下一个位置void remove(); //删除游标左面的元素
3. 使用迭代器时的步骤
//使用迭代器//1.获取一个迭代器对象 Iterator it=c.iterator();//2.判断是否存在下一个元素while(it.hasNext()){//3.如果有下一个元素就使用next()方法获取//String s=(String) it.next();Object s = it.next();System.out.println(s);}
四、List接口 1. 特征
有序的,可重复的 。
2. 常用方法 方法摘要
add(Ee)
向列表的尾部添加指定的元素(可选操作) 。
void
add(, )
在列表的指定位置插入指定元素(可选操作) 。
()
如果列表包含指定的所有元素,则返回 true 。
()
比较指定的对象与列表是否相等 。
get()
返回列表中指定位置的元素 。
int
()
返回列表的哈希码值 。
int
()
返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素 , 则返回 -1 。
()
如果列表不包含元素,则返回 true 。
()
返回按适当顺序在列表的元素上进行迭代的迭代器 。
int
()
返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1 。
()
返回此列表元素的列表迭代器(按适当顺序) 。
()
返回列表中元素的列表迭代器(按适当顺序) , 从列表的指定位置开始 。
()
移除列表中指定位置的元素(可选操作) 。
()
从此列表中移除第一次出现的指定元素(如果存在)(可选操作) 。
()
从列表中移除指定中包含的其所有元素(可选操作) 。
()
仅在列表中保留指定中所包含的元素(可选操作) 。
set(, )
用指定元素替换列表中指定位置的元素(可选操作) 。
int
size()
返回列表中的元素数 。
List
(, )
返回列表中指定的 (包括 )和 (不包括)之间的部分视图 。
[]
()
返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素) 。
T[]
(T[]a)
返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型 。
3. List的遍历
List因为是有序的,所以可以使用索引,因此我们有三种方式可以遍历它 。
public static void main(String[] args) {List ls=new ArrayList();//增加ls.add("钢铁侠");ls.add("雷神");ls.add("灭霸");ls.add("美国队长");//1--------------for--------------for(int i=0;i
4. 解决并发增加问题
List在使用增强for和迭代器来遍历元素时,由于多个引用同时调用会引发多并发异常问题 。
Java 容器与集合

文章插图
:方法检测到对象的并发修改,但不允许这种修改时,抛出此异常 。
Java 容器与集合

文章插图
解决并发增加问题:使用
//3--------------迭代器--------------底层是由foreach实现的//ConcurrentModificationException //1)获取迭代器对象/* Iterator it=ls.iterator();//2)判断是否存在下一个元素while(it.hasNext()){//3)获取if(it.next().equals("灭霸")){ls.add("惊奇队长");}}System.out.println(ls);*///4.-----------解决并发增加问题:使用 ListIterator //1.获取迭代器ListIterator li=ls.listIterator();//判断while(li.hasNext()){if(li.next().equals("灭霸")){li.add("惊奇队长");}}System.out.println(ls);}
五、类 1. 特点
是 List 的子类,它和相反,允许存放重复元素,因此有序 。
底层由可变数组结构实现 。优点:查询,以及随机获取效率高 。缺点:增加,删除效率低 。动态扩容:使用进行扩容,新数组的大小是原数组的1.5倍 。2.常用方法
由于是List的实现类,因此继承了List的所有方法,常用方法也基本相同 。
3. 的遍历
同List接口的遍历方式相同
4.储存对象
注意: 在储存对象时,使用方法时调用的方法比较的是地址,如果要比较内容需要重写方法,生成快捷键Alt+S.
public class ArrayListTest09{public static void main(String[] args) {List ls=new ArrayList();ls.add(new Person("欢欢",18));ls.add(new Person("书书",19));System.out.println(ls.indexOf(new Person("书书",19))); //-1 因为Person中没有重写equals方法List ls2=new ArrayList();ls2.add(new String("么么"));System.out.println(ls2.indexOf(new String("么么"))); // 0因为String类型中重写了squals方法}}class Person{private String name;private int age;public Person() {super();}public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//重写equals方法,比较内容@Override/*public boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}*/}
六、类 1. 特点
可以重复,是一种可以在任何位置进行高效地插入和删除操作的有序序列 。
实现结构:是由链表结构实现的 。优点:插入,删除效率高 。缺点:查询,随机获取效率低 。新增了一些操作类表头和类表尾的方法 。2. 遍历和常用方法
同一样都为List的一个实现类,因此它的遍历方式和常用方法同List基本相同 。
public static void main(String[] args) {LinkedList ls=new LinkedList();ls.add("哈哈");ls.add("呵呵");ls.add("嘿嘿");System.out.println("getFirst:"+ls.getFirst());System.out.println("getFirst:"+ls.peek());System.out.println("getFirst:"+ls.peekFirst());}
七、Set接口 1. 特点
Set 接口中的元素无序不可重复,不包含重复元素,最多包含一个 null,元素没有顺序。
2. Set常用方法
Set继承了接口的所有方法,没有新增方法 。
3. Set的遍历
Set同父级接口相同,没有索引 , 只能通过增强for和迭代器来遍历元素 。
八、类 1. 特点
是 Set 接口的一个子类 , 主要的特点是:里面不能存放重复元素,而且采用散列的存储方法,所以没有顺序 。这里所说的没有顺序是指:元素插入的顺序与输出的顺序不一致 。
由哈希表的数据结构存储的 哈希表=数组+链表优点:查询 增加 删除 效率高缺点:无序的 2. 遍历
由于是无序,无法操作索引,因此与Set相同,只能通过增强for和迭代器遍历 。
3. 常用方法 方法摘要
add(Ee)
如果此 set 中尚未包含指定元素,则添加指定元素 。
void
clear()
从此 set 中移除所有元素 。
clone()
返回此实例的浅表副本:并没有复制这些元素本身 。
()
如果此 set 包含指定元素,则返回 true 。
()
如果此 set 不包含任何元素,则返回 true 。
()
返回对此 set 中元素进行迭代的迭代器 。
()
如果指定元素存在于此 set 中,则将其移除 。
int
size()
返回此 set 中的元素的数量(set 的容量) 。
4. 去重 重写 与。先调用,如果计算出来的位置不相同,默认就是两个对象 。如果值相同,再去调用,去比较内容 。
注意:Set下还有个类
5. 代码示范
public class HashSetDemo12 {public static void main(String[] args) {HashSet set=new HashSet<>();set.add(new User("李健",40));set.add(new User("谢霆锋",41));set.add(new User("李健",40));System.out.println(set.size());for(User u:set){System.out.println(u.hashCode());}TreeSet tr=new TreeSet();tr.add("c");tr.add("b");tr.add("哈哈");tr.add("a");tr.add("呵呵");tr.add("e");System.out.println(tr);System.out.println(tr.ceiling("b"));//cSystem.out.println(tr.floor("b"));//aSystem.out.println(tr.higher("b"));//cSystem.out.println(tr.pollFirst());//c}}class User{private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public User(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;User other = (User) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}}
九、Map接口 1. 特征
Map是一种用来存储键值对形式的数据的接口:K(key) - V(value) 。
key 键:唯一的 无序的 ---Set集合 。value 值: 无序的 不是唯一的 。一个key只能对应一个value(value作为list) 。Map中存放值,如果key相同,后面的会覆盖前面的值 。
Map 接口的实现类有和等 。
2. Map常用方法 方法摘要
void
clear()
从此映射中移除所有映射关系(可选操作) 。
()
如果此映射包含指定键的映射关系,则返回 true 。
()
如果此映射将一个或多个键映射到指定值 , 则返回 true 。
Set>
()
返回此映射中包含的映射关系的 Set 视图 。
()
比较指定的对象与此映射是否相等 。
get()
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null 。
int
()
返回此映射的哈希码值 。
()
如果此映射未包含键-值映射关系,则返回 true 。
Set
()
返回此映射中包含的键的 Set 视图 。
put(Kkey, )
将指定的值与此映射中的指定键关联(可选操作) 。
void
【Java 容器与集合】(Map