一、容器的概念
二、容器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 com<div style="color:transparent">来源gaodai.ma#com搞#代!码网</div>pareTo(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); } } }