容器中泛型出现频率有点高,所以先介绍介绍泛型。当参数类型不确定,或者要经常变动时就可以用泛型来解决。直接看代码就可以了解泛型的用法。
注意泛型接口只能给泛型类来实现。泛型对泛型
public class GenericDemo {
//在类名后面加上代表E是编译时给什么类型就什么类型
//可以把E看作对像
static class A{
private E name;
public E getName() {
return name;
}
public void setName(E name) {
this.name = name;
}
}
// 泛型定义在方法上
public static void demo01(E e){
};
// 泛型定义在方法上 返回值也是泛型
public static E demo02(E e){
return e;
};
public static void main(String[] args) {
//这么new A类中的E就代表是String
//?问号代表通配符
A a1 = new A();
//这么new A类中的E就代表是Integer
a1= new A();
//如果不用通配符 只能定义两个变量
A a = new A();
A b = new A();
}
}
Comparable和Comparator
Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些 类是可以和自己比较的。一般用在类去实现其接口,实现compareTo方法。返回值负数:小于,0:等于,正数:大于。
Comparator。是外比较器。一般用于作为参数传达。如sort(,,)。要怎么排序就用到了Comparator接口。要实现compare方法。返回值负数:小于,0:等于,正数:大于。
从文章开头的图可知Collection接口被List,set,Queue接口给继承了。所以Collection有的方法List和Set也有。先介绍其基本的方法
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo {
public static void main(String[] args) {
//需要选择一个实现Collection的接口。
Collection c1 = new ArrayList();
//add();往里面加一个函数
c1.add("张三");
c1.add("李四");
Collection c2 = new ArrayList();
//add();往里面加一个函数
c2.add("zhangsan");
c2.add("lisi");
//获取集合的长度
int size = c1.size();
System.out.println(size);//2
//是否为空
boolean empty = c1.isEmpty();
System.out.println(empty);//false
//查看是否包含了该元素
boolean bool= c1.contains("张三");
System.out.println(bool);//true
//把c2加在c1里
//c1=c1+c2;
c1.addAll(c2);
System.out.println(c1);//[张三, 李四, zhangsan, lisi]
//清空c1中包含的c2值
c1.removeAll(c2);
System.out.println(c1);//[张三, 李四]
//清空指定的元素
c1.remove("张三");
System.out.println(c1);//[李四]
//清空集合
c1.clear();
System.out.println(c1);//[]
}
}
List
List是有序可重复的容器。
ArrayListArrayList是实现List接口的一个实现类。其内部是用数组来实现的。线性表。实现了自动扩充数组的长度。无需定义数组大小。查询效率高,增加删除效率低。这也是线性表的特性。
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List list = new ArrayList();
list.add("A");
list.add("B");
list.add("C");
list.add("B");
lsit.add("D");
//list.remove();根据参数值去删除集合中的元素
list.remove("D");
System.out.println(list);//[A, B, C,B]
//get(0);根据索引来获取值
String value01 = list.get(0);
System.out.println(value01);//A
//从开头开始找和B一样的。返回其索引
int startIndexb = list.indexOf("B");
System.out.println(startIndexb);//1
//从结尾开始找和B一样的。返回其索引
int endIndexb = list.lastIndexOf("B");
System.out.println(endIndexb);//3
//转换为数组
Object[] objects = list.toArray();
//和string的subList一样
List list1 = list.subList(0, 2);
System.out.println(list1);//[A, B]
//把索引为一的值修改为F
list1.set(1,"F");
System.out.println(list);//[A, F, C, B]
List list02 = new ArrayList();
list02.add("A");
list02.add("B");
list02.add("E");
//list的值是[A, F, C, B]
//取交值然后赋值给list
list.retainAll(list02);
System.out.println(list);//[A, B]
//list=[A, B]
//在一处插入一个C
list.add(1,"C");
System.out.println(list);//[A, C, B]
}
}
LinkedList
LinkedList也是List的实现类。使用方法和ArrayList区别不大。不同的是LinkedList是链表的方式来实现的。查询效率低,增加删除效率高
VectorVector和ArrayList去区别是Vector加了同步锁线程安全效率比ArrayList低。
SetSet接口继承了Collection接口。无序不可重复的集合。
HashSetHashSet底层是通过hash来存储的。就链表和线性表的结合。同过hashCode去指定数组的位置数组保存的是一条链表。java规定eq为true是hashCode一定相等。当对象重写了eq的方法也一个重写hashCode。像String类一样
用法可以参照Collection
public class Main {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("a");
set.add("a");
//重复插入只能接受一个。set不能重复
int size = set.size();
System.out.println(size);//1
}
}
LinkedHashSet+Comparable
LinkedHashSet和HashSet区别不大。
LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。
TreeSet对插入的值进行排序
public class Main {
static class User implements Comparable{
private Integer id;
private Integer money;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getMoney() {
return money;
}
public void setMoney(Integer money) {
this.money = money;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", money=" + money +
'}';
}
////负数:小于,0:等于,正数:大于
@Override
public int compareTo(User o) {
if(this.id>o.id){
return 1;
}else if(this.id<o.id){
return -1;
}
return 0;
}
}
public static void main(String[] args) {
TreeSet set = new TreeSet();
set.add(1);
set.add(4);
set.add(6);
set.add(5);
System.out.println(set);//[1, 4, 5, 6]
//如果是对象,需要实现Comparable接口
TreeSet userSet = new TreeSet();
User user01 = new User();
user01.setId(1);
user01.setMoney(1000);
User user02 = new User();
user02.setId(3);
user02.setMoney(5000);
User user03 = new User();
user03.setId(2);
user03.setMoney(2000);
userSet.add(user01);
userSet.add(user02);
userSet.add(user03);
System.out.println(userSet);//[User{id=1, money=1000}, User{id=2, money=2000}, User{id=3, money=5000}]
}
}
Queue
队列,先进先出
LinkedListLinkedList实现了队列的接口。链表形式,前面已经介绍过
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
Queue queue = new LinkedList();
// offer()方法往队列添加元素如果队列已满直接返回false,队列未满则直接插入并返回true;
queue.offer("A");
queue.offer("B");
// remove()方法直接删除队头的元素,返回删除的元素:队列没有元素时抛异常
String a = queue.remove();
System.out.println(a);//A
// poll()方法取出并删除队头的元素,当队列为空,返回null;
String poll = queue.poll();
System.out.println(poll);//B
System.out.println(queue.size());//0
// peek()方法直接取出队头的元素,并不删除.不存在时返回null
String peek = queue.peek();
System.out.println(peek);//null
int size = queue.size();
System.out.println(size);//0
}
}
ArrayQueue
线性表存储队列用法和LinkedList一样
PriorityQueuePriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。
Stack先进后出
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Stack stack = new Stack();
stack.push("A");
stack.push("B");
stack.push("C");
//移除栈顶对象,并作为函数的值 返回该对象。为空时会抛异常
String pop = stack.pop();
//查看栈顶对象而不移除它。。
String peek = stack.peek();//为空时会抛异常
//判断是否为空
boolean empty = stack.empty();
System.out.println(empty);
}
}
Map
按键值对存储数据。key:value。key不可重复。value可重复。Set其实就是Map的key
HashMapHashMap就是通过传入的键值对,通过hash算法指向一个连续的存储空间(数组存储),将键值对存入数组;对于指向相同的存储空间的hash值,再以链表方式存储;这样hashmap不仅具有了数据查询快速的特性,同时有了链表方便插入、删除的特性;因此hashMap对于数据的存储查询具有非常好的特性;
import java.util.HashMap;
import java.util.Set;
public class Main {
public static void main(String[] args) {
HashMap map = new HashMap();
//添加元素
map.put("一号","小明");
map.put("二号","小红");
map.put("三号","小李");
int size = map.size();
System.out.println(size);
//通过key获取value 不存在时返回null
String name = map.get("一号");
System.out.println(name);
//把一号的值替换成小米
map.replace("一号","小米");
name = map.get("一号");
System.out.println(name);
//Key存在时会覆盖
map.put("一号","大米");
name = map.get("一号");
System.out.println(name);
//获取key的set集合
Set strings = map.keySet();
//去掉一号
map.remove("一号");
}
}
TreeMap
可以参照TreeSet,一样的。这里不重复介绍
容器的遍历Iterator+listIteratorIterator和listIterator的区别。listIterator是List特有的
ListIterator有add()方法,可以向List中添加对象,而Iterator不能 ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。previous只是倒着走(i–,i开始是0的)开头是指向第一个元素 ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。 遍历List方法一Iteratorimport java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class Main {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
Iterator iterator = list.iterator();
ListIterator listIterator = list.listIterator();
System.out.println(list.size());//5
//iterator.hasNext()如果遍历结束会返回false
while (iterator.hasNext()){
//获取遍历中的值。会自动往后走。类似i++。
String next = iterator.next();
if(next.equals("d")||next.equals("a")){
// System.out.println(next);
//不要用list.remove。会报错
iterator.remove();
}
}
int size = list.size();
System.out.println(size);//3
}
}
遍历List方法二listIterator
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Main {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
ListIterator listIterator = list.listIterator();
//注意如果一开始就hasPrevious();会是false。因为都是从开头开始的
//hasPrevious()是代表向后走。开始都是指向0了
//先走到结尾
while (listIterator.hasNext()) {
listIterator.next();
}
//倒叙输出
while (listIterator.hasPrevious()){
String previous = listIterator.previous();
int index = listIterator.previousIndex();
System.out.println(index+":"+previous);
}
}
}
遍历Set
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set set = new HashSet();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
set.add("e");
Iterator iterator = set.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(next);
}
}
}
遍历Map方式一
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Map map1 = new HashMap();
map1.put(100, "aa");
map1.put(200, "bb");
map1.put(300, "cc");
//先获取set集合
Set<Map.Entry> ss = map1.entrySet();
//通过set集合遍历
Iterator<Entry> iterator = ss.iterator();
while (iterator.hasNext()){
Entry next = iterator.next();
//获取遍历的key
Integer key = next.getKey();
//获取value
String value = next.getValue();
System.out.println(key+":"+value);
}
}
}
遍历Map方式二
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Map map1 = new HashMap();
map1.put(100, "aa");
map1.put(200, "bb");
map1.put(300, "cc");
//先获取set集合.map的可以做元素
Set setKey = map1.keySet();
//通过set集合遍历
Iterator iterator = setKey.iterator();
while (iterator.hasNext()){
Integer key = iterator.next();
//获取value.通过key
String value = map1.get(key);
System.out.println(key+":"+value);
}
}
}
Collections是工具类不要Collection混淆
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List list = new ArrayList();
for(int i=0;i<10;i++){
list.add("list:"+i);
}
System.out.println(list);
Collections.shuffle(list); //随机排列list中的元素
System.out.println(list);
Collections.reverse(list); //逆序排列
System.out.println(list);
Collections.sort(list); //按照递增的方式排序。自定义的类使用:Comparable接口。
System.out.println(list);
System.out.println(Collections.binarySearch(list, "list:1")); //二分法查找,或者:折半查找
String max = Collections.max(list);
System.out.println(max);
}
}
会一直更新学习笔记。喜欢java的小伙伴可以关注我。