目录
一.集合与数组的区别
二. 集合的框架
2.1集合框架图
2.2 List集合 -ArrayList
三.ArrayList集合的创建及增删改查
3.1 ArrayList集合的创建
3.2 ArrayList集合的增加;
3.3 ArrayList集合的删除;
3.4 ArrayList集合的修改;
3.5 ArrayList集合的查询;
四.LinkedList集合的创建及增删改查
4.1 LinkedList集合的创建
4.2 LinkedList集合的增加
4.3 LinkedList集合的删除
4.4 LinkedList集合的修改
4.5 LikedList集合的查询
五. HashSet 集合的创建及增删查(ps:增删查没有改哦)
5.1 HashSet集合的创建
5.2 HashSet集合的增加
5.3 HashSet集合的删除
5.4 HashSet集合的查询
5.5 HashSet的源码
六. TreeSet集合的创建及增删查(ps:又没有改)
6.1 TreeSet 集合的创建
6.2 TreeSet 集合的添加
6.3 TreeSet 集合的删除
6.4 TreeSet 集合的查询
6.5 TreeSet 的排序方式
七. HashMap 集合的创建及增删改查
7.1 HashMap 集合的创建
7.2 HashMap 集合的增加
7.3 HashMap 集合的删除
7.4 HashMap 集合的修改
7.5 HahsMap 集合的查询
//创建一个集合对象 如果没有指定集合容器的长度默认为10
List list = new ArrayList();
ArrayList list2 = new ArrayList();
//创建一个集合对象 ,集合容器的长度为20
List list3 = new ArrayList(20);
// 集合内可以添加任意类型的元素
ArrayList list = new ArrayList();//创建一个空集合
//向集合内添加元素
list.add("设酒杀鸡作食"); //下标为0
list.add("i"); //下标为1
list.add(4); //下标为2
list.add(2.3); //下标为3
list.add(true); //下标为4
list.add(new Date()); //下标为5 //像new的构造需要import导入;
System.out.println(list);//输出集合元素
// list.add(7,"张三"); 在指定位置添加元素(即在下标为7的位置添加元素“张三”),但若下标为6的地方没有元素,不可以直接往下标为7的地方添加元素
List list2= new ArrayList();//创建一个新的空集合
list2.add(3);//添加一个元素 //下标为0
list2.addAll(list);//将list中的元素全部添加到list2中 //下标依次排列
System.out.println(list2);//输出list2集合元素
list2.remove(2); //删除list2集合中下标为2的元素
System.out.println(list2);
list.clear();//清空list集合内数组,使其变回空集合
System.out.println(list);
list2.set(1,"牛德华");//修改下标为1的元素为“牛德华”;
System.out.println(list2);
Object s = list.get(1); //获取list集合中下标为1的元素并赋值给s;
System.out.println(s); // 输出这个元素
int a = list.size(); //获取list集合中的数组长度(元素个数)
System.out.println(a);
boolean f = list.contains("i"); //查看元素i是否在list集合中
System.out.println(f); //输出true或false;
int indexs = list.indexOf("i"); //查询元素i在list的集合中第一次出现的位置;
System.out.println("indexs"); //输出下标
//通过遍历输出集合中的每一个元素
//方法一
for(int i=0;i
扩展(ArrayList的底层源码)
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) { //大于0
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) { //等于初始化为一个空数组
this.elementData = EMPTY_ELEMENTDATA;
} else { //抛出一个异常
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
==========add("i")添加元素i======E理解为Object类型================
public boolean add(E e) {
ensureCapacityInternal(size + 1); // 扩容
elementData[size++] = e; //把元素赋值给数组的相应位置
return true;
}
==========indexOf("i") 判断元素i在集合中第一次出现的位置=============
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i])) //和数组中的每个元素内容进行比对
return i; //返回元素在集合中位置
}
return -1;
}
===========size() 请求数组的长度======================
public int size() {
return size;
}
============contain("i")判断元素i是否在集合中==============
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
===============get(1) 获取指定位置的元素========
public E get(int index) {
rangeCheck(index); //判断指定的位置是否合法
return elementData(index);
}
E elementData(int index) {
return (E) elementData[index];
}
============toString() 为什么不打印对象的引用地址
[java01, java02, java03, java02]因为重写了Object里面的toString方法。
public String toString() {
Iterator it = iterator();
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
//通过对ArrayList方法的底层代码分析:底层就是对数组的操作。
//ArrayList的底层就是基于数组实现的。
LinkedList lst = new LinkedList();
//add默认依次向下排列,下标从0依次增加
lst.add("第一个元素"); // 向lst集合内添加元素
lst.add("第二个元素"); // 向lst集合内添加元素
lst.addFirst(3.45); //向lst集合的头部添加元素 (下标自动变为0,后面的元素依次向后增加)
lst.addLast(true) // 向lst集合的尾部添加元素(下标自动变为lst.size()-1)
//当程序中出现多个addFirst时,后一个adddFirst的元素自动添加到集合的首位,原先的首位依次向后排列
lst.addFirst("添加到头部");
//当程序中出现多个addLast时,后一个adddLast的元素自动添加到集合的末位,原先的末位变为(末位-1);
lst.addLast("添加到尾部");
lst.remove(3); //删除下标为3的元素;
System.out.println(lst);
lst.removeFirst(); //删除集合的首位元素;
System.out.println(lst);
lst.removeLast(); //删除集合的末位元素
System.out.println(lst);
lst.set(2,"修改下标为2的元素"); //修改下标为2的元素
System.out.println(lst);
int size = lst.size(); //获取集合的长度
System.out.println(size);
int empty = lst.isEmpty(); //查询集合是否为空(为空返回true,不为空则返回false)
System.out.println("===================================================================");
Object s = lst.get(1); //获取下标为1的集合元素;
System.out.println(lst);
Object f = lst.getFirst(); //获取集合内的首位元素;
System.out.println(lst); //获取集合内的末位元素
Object l = lst.getLast(lst);
//HashSet是无序的集合
HashSet hs = new HashSet(); //默认情况下,HashSet容器大小为16,负载因子为0.75f;
HashSet hs2 = new HashSet(18); //设置HashSet容器大小为18;
//设置HashSet容器大小为16,负载因子为0.7f(即当容器占用率达到70%时进行自动扩容)
HashSet hs3 = new HashSet(16,0.7f);
HashSet hs = new HashSet();
//将每个元素添加到hs集合中,但添加位置是无序的,且元素不能重复
hs.add("1");
hs.add(2);
hs.add(3);
hs.add(3);
hs.add("牛德华");
hs.add("黎明");
hs.add("张学友");
System.out.println(hs); //输出hs集合,集合元素无序,且不能重复
HashSet hs2 = new HashSet(20,0.8f); //新建hs2集合
hs2.add("灵明石猴"); //向集合内添加元素
hs2.add("通臂猿猴");
hs2.add("赤尻马猴");
hs2.add("六耳猕猴");
System.out.println(hs2) //输出hs2中的所有元素
hs.addAll(hs2); //将hs2中的所有元素都添加到hs中
System.out.println(hs); //输出hs集合的所有元素
hs.remove("牛德华"); //HashSet类型的集合删除元素时,直接指定元素内容,而不是指定下标
System.out.println(hs);
hs2.clear(); //清空hs2集合
System.out.println(hs2); //输出清空后的空集合hs2
boolean empty = hs.isEmpty(); //判断集合hs是否为空
System.out.println(empty); //若为空则输出为true,不为空则输出false
boolean ct = hs.contains("牛德华"); //判断元素“牛德华”是否在集合内
System.out.println(ct) //在返回true,否则返回false
//遍历查询
for(Object xx:hs){
System.out.println(xx);
}
//迭代器查询
Iterator it = hs.iterator(); //获取迭代器对象
while(it.hasNext()){ //判断指针是否能够移动
Object next = it.next(); //指针移动并获取当前元素
System.out.println(next); //输出指针获取的元素
}
Iterator :迭代器
hasNext():判断指针是否能够移动,可以移动返回true,否则返回false;
next():指针移动并获取当前元素
TreeSet 中的方法和HashSet中的方法一模一样 ,只是他们的实现不同。
TreeSet 基于TreeMap 实现。 TreeSet 可以实现有序集合, 但是有序性需要通过比较器实现
TreeSet 集合只能存储同一种类型的元素,存储其他类型的元素需要新建TreeSet集合。
TreeSet ts = new TreeSet(); //TreeSet集合的创建
例子:存储不同类型的元素
TreeSet ts = new TreeSet();
ts.add("张飞");
//ts.add(4);
System.out.println(ts); //若在ts中存储不同类型的元素,则程序会报错
存储String类型
TreeSet ts2 = new TreeSet();
ts2.add("java03"); //向ts2中添加元素
ts2.add("java05");
ts2.add("java02");
ts2.add("java03");
ts2.add("java01");
ts2.add("java04");
System.out.println(ts2); //输出内容是有序的,但不能出现重复值
存储对象类型
TreeSet ts3 = ts3 TreeSet();
ts3.add(new Student("张三",18));
ts3.add(new Student("李四",17));
ts3.add(new Student("王五",17));
ts3.add(new Student("赵六",16));
System.out.printlnt(ts3);
通过运行发现错误
发现TreeSet中的元素必须实现compareable接口,才能放入TreeSet中
解决方法(详情看完整代码):
package com.test1;
import sun.reflect.generics.tree.Tree;
import java.util.TreeSet;
public class TreeSetList2 {
public static void main(String[] args) {
TreeSet ts = new TreeSet(); //TreeSet不能出现重复元素
ts.add(new Student("张三",28));
ts.add(new Student("李四",27));//李四和王五中都有重复元素27,
ts.add(new Student("王五",27));//则他们只会出现一个(先添加的出现,后添加的默认删除)
ts.add(new Student("赵六",25));
System.out.println(ts);
}
}
class Student implements Comparable{ //代码改变处:在类中增加接口Comparable
private String name;
private Integer age;
public Student() {
}
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//排序:---返回如果大于0 表示当前元素比o大 如果返回-1 当前添加的元素比o小 返回0表示相同元素。
@Override
public int compareTo(Object o) { //接口增加后添加的代码
Student st = (Student)o;
//判断添加的元素是否符合TreeSet的标准并进行比较排序,重复的则自动删除
if (this.age>st.age) {
return 1; //当返回值为1时,表示当前元素比o大,向后添加元素
}
if (this.age
//TreeSet ts = new TreeSet();
//ts.add(new Student("张三",28));
//ts.add(new Student("李四",27));
//ts.add(new Student("王五",27));
//ts.add(new Student("赵六",25));
//new Student中只要满足一个条件就会删除你想删除的那条信息
//ps:ts.remove(new Student("张",28));
//ts.remove(new Student("张三",2));这两行代码都可以删除"new Student("张三",28)"这个元素
ts.remove(new Student("张三",28) //删除"new Student("张三",28)"这个元素
System.out.println(ts);
ts.clear(); //清空集合元素
System.out.println(ts); //输出清空后的空集合ts
boolean empty = ts.isEmpty(); //判断集合是否为空
System.out.println(empty);
// ts中存储的都是对象类型的数据,若判断条件输入的是字符串,则程序会报错
//boolean ss = ts.contains("张三");
boolean s = ts.contains(new Student("赵六",39)); //查询对象类型的数据,条件满足其一即可
System.out.println(s);
//遍历查询
for(Object xx: ts){
System.out.println(xx);
}
//迭代器查询
Iterator th = ts.iterator(); //获取迭代器对象
while(th.hasNext){ //判断指针是否移动,移动返回true,否则返回false
Object next = th.next(); //指针移动并获取指针当前所指的元素
System.out.println(next); //输出指针所指的元素
}
方法一
//排序:---返回如果大于0 表示当前元素比o大 如果返回-1 当前添加的元素比o小 返回0表示相同元素。
@Override
public int compareTo(Object o) { //接口增加后添加的代码
Student st = (Student)o;
//判断添加的元素是否符合TreeSet的标准并进行比较排序,重复的则自动删除
if (this.age>st.age) {
return 1; //当返回值为1时,表示当前元素比o大,向后添加元素
}
if (this.age
方法二(在创建TreeSet时,为其指定排序)
package xx.com.test;
import java.util.TreeSet;
public class Demo01 {
public static void main(String[] args) {
//按照指定规则进行排序(new MyComparator())
TreeSet ts = new TreeSet(new MyComparator());
ts.add(new Student("张三",16));
ts.add(new Student("李四",18));
ts.add(new Student("王五",18));
ts.add(new Student("赵六",19));
System.out.println(ts);
}
}
class Student{ //创建内部类
private String name;
private int age;
public Student() {
}
public Student( String name,int age) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
排序规则
package xx.com.test;
import java.util.Comparator;
public class MyComparator implements Comparator { //连接接口Comparator
@Override
public int compare(Object o1,Object o2) {
//集合初始时添加的两个值不进行if判断,当出现第三个值时开始执行if判断
Student s1 = (Student) o1;
Student s2 = (Student) o2;
if (s1.getAge()>s2.getAge()){
return 1;
}else if(s1.getAge()
HashMap hm = new HashMap(); //HashMap集合的默认初始化大小为16,负载因子为0.75
Map hm2= new HashMap();
Map hm3 = new HashMap(18); //设置HashMap的容量为18
HashMap hm4 = new HashMap(18,0.8f); //设置HashMap容量为18,负载因子为0.8f;
HashMap hm = new HashMap();
hm.put("name","熏悟空"); //HashMap内的元素默认以键值对方式存储(即key:name;value:熏悟空)
hm.put("name2","别龙马"); //HashMap使用put向集合内添加元素
//新添加的元素中的键(key)与集合内的key值重复时,vlaue值自动覆盖前面的,不再出现新元素
hm.put("name","孙悟空");
hm.put("age",18);
System.out.println(hm);
Map hm2 = new HashMap(); //创建新的HashMap集合
hm2.put("k1","v1");
hm2.put("k2","v2");
System.out.println(hm2);
hm.putAll(hm2); //将hm2中的所有元素添加到hm中
System.out.println(hm);
//如果指定的key值在集合hm内不存在,则添加新元素,若指定的key存在,则不添加
hm.putIfAbsent("age",28);
hm.putIfAbsent("k3","v3");
System.out.println(hm);
hm.remove("k1"); //删除key值为k1的元素
System.out.println(hm);
//删除集合内key为name,vlaue为猪八戒的元素,必须同时满足key和value;否则不删除
hm.remove("name","猪八戒");
System.out.println(hm);
hm2.clear(); //清空集合hm2中的所有元素
System.out.println(hm2); //输出空集合
hm.replace("k2","我稀罕你"); //修改集合内key值为k2的元素的value值为“我稀罕你”
System.out.println(hm);
//hm.put("name","xxx"); //当添加元素时出现重复key值时,原理相当于replace
boolean s = hm.isEmpty(); //判断集合hm内的元素是否为空
System.out.println(s);
boolean k = hm.containsKey("k3"); //通过指定的key值判断该元素是否在集合内
boolean v = hm.containsValue("我稀罕你"); //通过指定的value值判断集合内是否有该元素
System.out.println(k); //返回true或false,存在则为true,不存在为false
System.out.println(v);
Object r = hm.get("k3"); //获取key值为k3的vlaue值
System.out.println(r);
Object e = hm.getOrDefault("k3",99);
System.out.println(e);
Set keys = hm.keySet(); //返回该集合中的所有key值
System.out.println(keys);
//遍历查询
for(Object xx:keys){ //遍历上面代码返回的所有key值,
Object values = hm.get(xx); //通过key值获取集合中的value值
System.out.println(values);
}