一、容器的概念
二、容器 API
特点:
1、能够寄存不同类型的数据,二数组只能寄存固定类型的数据
2、应用 Arraylist 子类实现的时候,初始化的长度是 10,当长度不够的时候会进行主动扩容操作
api 办法:
1、add:要求必须传入的参数是 Object 对象,因而写入根本数据类型的时候,蕴含了主动拆箱和主动装箱的过程
2、addAll: 增加另一个汇合的元素到此汇合中
3、clear: 清空集合的内容,然而汇合对象不会被回收
4、contains: 判断此汇合中是否蕴含指定的元素
5、containsAll: 判断此汇合中是否蕴含另一个汇合
6、equals: 也是比拟汇合外面的元素是否相等
7、isEmpty: 判断汇合是否为空
8、remove: 删除汇合中的一个元素
9、removeAll:删除此汇合中蕴含的另一个汇合的元素
10、removeIf: 判断此汇合是否领有另一个汇合的所有元素
11、size: 返回以后联合的元素个数
12、toArray: 将汇合转换成数组
示例
package com.msbline.basic.collectionPkg;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo {public static void main(String[] args) {Collection collection = new ArrayList();
collection.add(1); // 看起来是个 1,实际上是个包装类型,因为 add 办法要求的是 Object 类型
collection.add(true);
collection.add(1.23);
collection.add("abc");
System.out.println(collection);
// 增加一个元素到指定地位
((ArrayList)collection).add(0,"mashibing");
System.out.println(collection);
Collection collection1 = new ArrayList();
collection1.add("a");
collection1.add("b");
collection1.add("c");
collection1.add("c");
// 往汇合外面退出另一个汇合外面的内容
collection.addAll(collection1);
System.out.println(collection);
// collection.removeAll(collection1);
// System.out.println(collection);
System.out.println(collection1.retainAll(collection));
Object[] objects = collection.toArray();
System.out.println(objects[1]);
}
}
三、Collection 接口
1、List 接口
特点:
1、能够寄存不同类型的数据,二数组只能寄存固定类型的数据
2、应用 Arraylist 子类实现的时候,初始化的长度是 10,当长度不够的时候会进行主动扩容操作
Arraylist 示例
package com.msbline.basic.collectionPkg;
import java.util.ArrayList;
import java.util.List;
public class ListDemo {public static void main(String[] args) {List list = new ArrayList();
list.add("a");
list.add(1);
list.add(true);
list.add("a");
System.out.println(list);
System.out.println(list.get(0));
System.out.println(list.indexOf("a"));
System.out.println(list.lastIndexOf("a"));
System.out.println("---------------");
list.set(0,"b");
System.out.println(list);
System.out.println("----------------");
List list1 = list.subList(0,2);
System.out.println(list1);
}
}
LinkedList 示例
package com.msbline.basic.collectionPkg;
import java.util.LinkedList;
public class LinkedListDemo {public static void main(String[] args) {LinkedList linkedList = new LinkedList();
linkedList.add(123);
linkedList.add(false);
linkedList.add("abc");
System.out.println(linkedList);
linkedList.add(0,"mashibing");
System.out.println(linkedList);
linkedList.addFirst("a");
System.out.println(linkedList);
linkedList.addLast("b");
System.out.println(linkedList);
System.out.println("element:"+linkedList.element());
linkedList.offer("3333");
System.out.println(linkedList);
System.out.println("peek:"+linkedList.peek());
System.out.println("poll:"+linkedList.poll());
}
}
Vector 示例
1、Vector 也是 List 接口的一个实现
2、Vector 跟 Arraylist 一样,底层都是应用数组进行实现的
3、跟 Arraylist 的区别是:
(1)、Arraylist 是线程不平安的,效率高,Vector 是线程平安的效率低
(2)、Arraylist 扩容的时候,是扩容 1.5 倍,Vector 扩容的时候,是扩容 2 倍
package com.msbline.basic.collectionPkg;
import java.util.Vector;
public class VectorDemo {public static void main(String[] args) {Vector vector = new Vector();
vector.add(1);
vector.add("abc");
System.out.println(vector);
}
}
小结
2、Set 接口
TreeSet
1、底层是 TreeMap, 而 TreeMap 的底层又是红黑树实现的,依据树的个性,TreeSet 只能存储雷同类型的数据
2、红黑树也合乎二叉树(也叫二叉均衡树)的个性,右边节点的值小于双亲节点,左边节点的值大于双亲节点
3、红黑树左右子树的深度差规定是最长门路不超过最短门路的 2 倍,防止树歪斜太大,保障查找的速度
4、树中的元素是要默认进行排序操作的,如果是根本数据类型,主动比拟,如果是援用类型的话该怎么比拟呢,须要自定义比拟器,往 TreeSet 外面放的时候它才晓得该依据什么进行比拟和排序,也就是前面说的 Comparable
package com.msbline.basic.collectionPkg;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class SetDemo {public static void main(String[] args) {
// 底层是红黑树实现的
TreeSet treeSet = new TreeSet();
treeSet.add(65);
treeSet.add(1);
treeSet.add(3);
System.out.println(treeSet);
TreeSet treeSet = new TreeSet();
treeSet.add(new Person("a",20));
treeSet.add(new Person("b",60));
treeSet.add(new Person("c",80));
treeSet.add(new Person("d",14));
System.out.println(treeSet);
}
}
package com.msbline.basic.collectionPkg;
public class Person implements Comparable{
private String name;
private int age;
public Person(String name, int age) {
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;}
@Override
public int compareTo(Object o) {Person p = (Person) o;
if(p.age > this.age){return 1;} else if(p.age < this.age){return -1;} else {return 0;}
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '''+", age="+ age +'}';
}
}
HashSet
1、HashSet 应用的是 HashMap,而 HashMap 应用的是数组加链表来存储的,所以 HashSet 最终应用的也是数组加链表来存储数据的
2、如上图,如果有两个雷同的对象往 HashSet 外面放的时候,如果没有重写对象的 equals 和 HashCode 办法,那么比拟的是两个对象的地址,两个对象的地址不同,即便内容雷同也能同时存在与 HashSet 中,解决办法是重写 equals 和 HashCode 办法
3、小结
package com.msbline.basic.collectionPkg;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetDemo {public static void main(String[] args) {Set set = new HashSet();
set.add("123");
set.add("123");
set.add(1);
set.add(true);
System.out.println(set);
System.out.println(set.isEmpty());
Iterator iterator = set.iterator();
while (iterator.hasNext()){System.out.println(iterator.next());
}
// 将 while 循环改成 for 循环
for(Iterator iter = set.iterator();iter.hasNext();){System.out.println(iter.next());
}
}
}
四、Map 接口
五、Iterable 接口、Iterator 接口
在 Java 代码中蕴含三种循环形式,do…while,while,for
还有一种加强 for 循环的形式,能够简化循环的编写
所有汇合类都默认实现了 Iterable 的接口,实现此接口意味着具备了加强 for 循环的能力,也就是 for-each
Iterable 的接口:
(1) iterator() 返回一个 Iterator 的具体实现
(2) foreach() 加强 for 循环
Iterator 的接口:
(1) hasNext() 是否还有下一个元素
(2) next() 获取下一个元素
留神:
(1) 在应用 iterator 的过程中,如果删除 (list.remove(o)) 其中的某个元素会报错, 因为 list 和 iterator 是两个不同的对象,两个对象操作同一份数据,一个在遍历一个在删除,导致并发操作异样,因而,如果遍历的同时须要批改元素,就应用 iterator 来操作,由这一个对象对数据进行批改,便不会有并发操作这种异样
(2) ListIterator 不仅能够向后遍历,还能够向前遍历,不过得先向后再向前,始终是通过 cursor 和 lastret 的指针来获取元素值及向下的遍历索引
package com.msbline.basic.collectionPkg;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class IteratorDemo {public static void main(String[] args) {ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// for(int i = 0; i<list.size(); i++){// System.out.println(list.get(i));
// }
// 迭代器
ListIterator iterator = list.listIterator();
while (iterator.hasNext()){Object o = iterator.next();
if (o.equals(2)){iterator.remove();
}
System.out.println(o);
}
System.out.println("--------------");
while (iterator.hasPrevious()){System.out.println(iterator.previous());
}
System.out.println("--------------");
// // 加强 for 循环
// for (Object o : list){// System.out.println(o);
// }
}
}
六、泛型
当做一些汇合的对立操作的时候,须要保障汇合外面的数据类型是统一的,此时就须要泛型来进行限度
长处:
1、数据安全,只能放泛型规定的类型
2、获取数据时效率比拟高
泛型的高阶利用
1、泛型类
在定义类的时候,在类名的前面加, 起到占位的作用,类中的办法返回值类型和属性的类型都能够应用示例
package com.msbline.basic.collectionPkg;
public class FaxingClass<A> {
private String name;
private A a;
public FaxingClass() {}
public FaxingClass(String name, A a) {
this.name = name;
this.a = a;
}
public void show(){System.out.println("name:"+name+", id:"+a);
}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public A getA() {return a;}
public void setA(A a) {this.a = a;}
}
package com.msbline.basic.collectionPkg;
import java.util.ArrayList;
import java.util.List;
public class FanXingDemo {public static void main(String[] args) {FaxingClass<String> fxc = new FaxingClass<>();
fxc.setName("zhangsan");
fxc.setA("male");
fxc.show();
FaxingClass<Integer> fxc1 = new FaxingClass<>();
fxc1.setName("zhangsan");
fxc1.setA(1);
fxc1.show();
FaxingClass<Person> fxc3 = new FaxingClass<>();
fxc3.setName("zhangsan");
fxc3.setA(new Person("lisi",1));
fxc3.show();}
}
2、泛型接口
示例
package com.msbline.basic.collectionPkg;
public interface FanxingInterface<B> {public B test();
public void test2(B b);
}
package com.msbline.basic.collectionPkg;
public class FanXingInterfaceImpl implements FanxingInterface<String>{
@Override
public String test() {return "abc";}
@Override
public void test2(String s) {System.out.println(s);
}
}
FanXingInterfaceImpl fx1 = new FanXingInterfaceImpl();
System.out.println(fx1.test());
fx1.test2("1");
3、泛型办法
在定义方法的时候,指定办法的返回值和参数是自定义的占位符,能够是类名中的 T,也能够是自定义的 Q,只不过在应用 Q 的时候要定义在返回值的后面示例
package com.msbline.basic.collectionPkg;
public class FanXingMethod<T> {
private T t;
public T getT() {return t;}
public void setT(T t) {this.t = t;}
public T test() {
// return t;
return (T) "aaa";
}
public <Q> Q show(Q q){System.out.println(q);
System.out.println(t);
return q;
}
}
FanXingMethod fxm = new FanXingMethod();
fxm.setT("ttt");
fxm.show(123);
fxm.show(true);
System.out.println(fxm.test());
4、泛型的下限 (还不太了解)
如果父类确定了,所有子类都能够之间应用5、泛型的上限 (还不太了解)
如果子类确定了,子类的所有父类都能够间接传递参数值
一般泛型示例
package com.msbline.basic.collectionPkg;
import java.util.ArrayList;
import java.util.List;
public class FanXingDemo {public static void main(String[] args) {
// 加了泛型之后就只能放 Person 类型的对象
List<Person> list = new ArrayList();
list.add(new Person("zhangsan",10));
for(int i = 0; i<list.size(); i++){System.out.println(list.get(i));
}
for(Object iter:list){System.out.println(iter);
}
}
}