标签:实现原理 stream 比较 范围 copy 原理 不可用 动态 pre
注意:
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素索引来访问
Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集合里元素不允许重复的原因)
方法 | 描述 |
---|---|
boolean add(E e); / int size(); | 向集合中添加元素e / 返回集合中的元素个数 |
boolean addAll(Collection<? extends E> c); | 将集合c 中的所有元素添加到当前这个集合 |
boolean contains(Object o); | 如果该集合中包含对象o,返回true |
boolean containsAll(Collection<?> c); | 如果该集合中包含集合c的所有元素,返回true |
boolean isEmpty(); / void clear(); | 如果集合不包含任何元素,返回true / 删除集合中所有元素 |
Iterator |
返回集合中元素所用的迭代器 |
boolean remove(Object o); | 从集合中删除元素o |
boolean removeAll(Collection<?> c); | 从集合中删除集合c拥有的所有元素 |
boolean retainAll(Collection<?> c); | 保留c和当前集合都有的元素(交集) |
Object[] toArray(); | 返回该集合元素构成的Object数组 |
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
public abstract class ListDemo {
public static void main(String[] args) {
List<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(1); arrayList.add(3); arrayList.add(4);
arrayList.add(1); arrayList.add(2);
arrayList.add(0,10);
arrayList.add(3,30);
System.out.println(arrayList);
LinkedList<Object> linkedList = new LinkedList<Object>(arrayList);
linkedList.add(1,"red");
linkedList.removeFirst();
linkedList.addFirst("green");
ListIterator<Object> listIt = linkedList.listIterator();
while(listIt.hasNext()) {
System.out.print(listIt.next() + ";");
}
System.out.println();
listIt = linkedList.listIterator(linkedList.size());
System.out.println("倒序访问:");
while(listIt.hasPrevious()) {
System.out.print(listIt.previous() + ";");
}
LinkedList<String> list = new LinkedList<String>();
System.out.println();
list.add("哈哈");
list.add("嘻嘻");
list.add("呵呵");
System.out.println(list);
}
}
打印结果:
[10, 1, 3, 30, 4, 1, 2]
green;red;1;3;30;4;1;2;
倒序访问:
2;1;4;30;3;1;red;green;
[哈哈, 嘻嘻, 呵呵]
实现原理相同,功能相同,很多情况可以互用
Set接口:用来操作存储一组唯一、无序的对象
HashSet:用来存储互不相同的任何元素
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* HashSet集合的使用
* @author
* @version
* @data
*/
public class SetDemo {
public static void main(String[] args) {
Set<String> set1 = new HashSet<String>();
set1.add("London");
set1.add("Paris");
set1.add("New York");
set1.add("San Francisco");
set1.add("Beijing");
set1.add("New York");//set是无序集合,不可以有重复的元素
System.out.println(set1);
Iterator<String> it = set1.iterator();//迭代器遍历
while(it.hasNext()) {
System.out.print(it.next() + "; ");
}
System.out.println();
Set<String> set2 = new HashSet<String>();
set2.add("Paris");
set2.add("广东");
set2.add("广西");
set2.add("上海");
set2.add("New York");
set1.removeAll(set2);//在set1中移除set2的所有元素
set1.retainAll(set2);//在set1中保留set2的所有元素
System.out.println(set1);
}
}
LinkedHashSet:使用链表扩展实现HashSet类,支持对元素的排序
TreeSet:可以确保所有元素都是有序的
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
/**
* TreeSet集合使用
* @author
* @version
* @data
*/
public class TreeSetDemo {
public static void main(String[] args) {
/**
* 当更新一个规则集时,如果不需要保持元素的排序关系,就应该使用散列集
* 因为在散列集中插入,删除元素所花的时间比较少
* 当需要一个排好序的集合时,可以从这个散列集创建一个树形集
*/
Set<String> set1 = new HashSet<String>();
set1.add("London");
set1.add("Paris");
set1.add("San Francisco");
set1.add("Beijing");
set1.add("New York");
TreeSet<String> treeSet = new TreeSet<String>(set1);//会自动按照字母顺序排序
System.out.println("排序:" + treeSet);
/**
* 方法first和last:返回第一个和最后一个元素
* headSet(toElement)和tailSet(fromElement):返回Set中小于element的元素;返回Set中大于等于element的元素
*/
System.out.println("首元素:" + treeSet.first());
System.out.println("尾元素:" + treeSet.last());
System.out.println("New York之前的元素:" + treeSet.headSet("New York"));
System.out.println("New York之后的元素:" + treeSet.tailSet("New York",false));
/**
* lower(e),floor(e),ceiling(e)和higher(e):分别返回小于、小于等于、大于等于、大于一个给定的元素,若没有这个元素,返回null
*/
System.out.println(treeSet.lower("P"));//返回集合中小于P的最大元素
System.out.println(treeSet.higher("P"));//返回集合中大于P的最小元素
System.out.println(treeSet.floor("P"));//返回集合中小于等于P的最大元素
System.out.println(treeSet.ceiling("P"));//返回集合中大于等于P的最小元素
/**
* pollFirst():删除并返回集合中的第一个元素
* pollLast():删除并返回集合中最后一个元素
*/
System.out.println("删除前:" + treeSet);
System.out.println("删除第一个元素:" + treeSet.pollFirst());//删除并返回集合中第一个元素
System.out.println("删除最后一个元素:" + treeSet.pollLast());//删除并返回集合中最后一个元素
System.out.println("删除后:" + treeSet);
}
}
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
import java.util.Comparator;
public class CompareDemo {
static final int N = 50000;
public static void main(String[] args) {
Set<Student> hashSet = new HashSet<Student>();
hashSet.add(new Student(5,"曹冲"));
hashSet.add(new Student(1,"曹操"));
hashSet.add(new Student(3,"曹丕"));
hashSet.add(new Student(2,"曹仁"));
hashSet.add(new Student(4,"曹植"));
System.out.println("排序前:" + hashSet);
Set<Student> treeSet = new TreeSet<Student>(new StudentComparator());
treeSet.addAll(hashSet);
treeSet.add(new Student(6,"关羽"));
System.out.println("排序后:" + treeSet);
}
}
public class Student {
private int id;
private String name;
public Student(int id, String name) {
setId(id);
setName(name);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return id + "-" + name;
}
}
/**
* 定义一个比较类,实现Comparator接口
* @author
* @version
* @data
*/
public class StudentComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
if(o1.getId() == o2.getId()) {
return 0;
}
if(o1.getId() < o2.getId()) {
return -1;
}
return 1;
}
}
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class CollectionDemo {
public static void main(String[] args) {
List<String> list = Arrays.asList("are","you","ok");
Collections.sort(list);//对指定列表进行排序
System.out.println(list);
Collections.sort(list, Collections.reverseOrder());//使用指定比较器进行排序,reverseOrder():返回逆序的比较器
System.out.println(list);
int index = Collections.binarySearch(list, "ok");//使用二分查找法搜索有序列表的键值
System.out.println(index);
Collections.shuffle(list);//随机打乱顺序
Collections.shuffle(list,new Random(20));//使用随机对象打乱指定列表
System.out.println(list);
List<String> list2 = Arrays.asList("my","name","is","cai");
Collections.copy(list2, list);//复制list给list2
System.out.println(list);
System.out.println(list2);
Collections.fill(list, "abc");//使用对象填充列表
System.out.println("list:" + list);
System.out.println("list2" + list2);
System.out.println("没有相同的元素:" + Collections.disjoint(list, list2));//若没有公共元素返回true
System.out.println("abc出现次数" + Collections.frequency(list, "abc"));//返回集合中指定元素出现的次数
}
}
打印结果:
[are, ok, you]
[you, ok, are]
1
[ok, you, are]
[ok, you, are]
[ok, you, are, cai]
list:[abc, abc, abc]
list2[ok, you, are, cai]
没有相同的元素:true
abc出现次数3
Queue通常用于操作存储一组队列方式的对象信息
一般存储方式为先进先出(FIFO)
方法 | 描述 |
---|---|
boolean offer(element) | 向队列中插入一个元素(类似于add方法) |
E poll() | 获取并删除队列头元素,如果队列为空返回null |
E remove() | 获取并删除队列头元素,若为空抛出异常 |
E peek() | 获取但不删除队列头元素,如果队列为空返回null |
E element() | 获取并删除队列头元素,若为空抛出异常 |
以键 - 值存储元素的容器
方法 | 描述 |
---|---|
V put(key, value) | 将一个键/值映射放入图中 |
V get(key) | 根据键获取对应的value值 |
Set |
返回包含键的规则集 |
Collection |
返回包含值的集合 |
boolean containsKey(key) | 返回图中是否包含键值key |
Set<Map.Entry<K.V>> entrySet() | 返回一个图中包含条目的规则集 |
int size() | 返回图中的键值对个数 |
V remove(key) | 删除指定键对应的条目 |
注意:
使用建议
键值对集合
方法 | 描述 |
---|---|
String getProperty(key) | 通过指定的键(key)获取配置文件中对应的值(value) |
Object setProperty(key, value) | 通过调用父类的put方法来设置键-值对 |
void load(instream) | 从输入流读取属性列表 |
void store(outStream, comments) | 将属性列表(键值对)写入到对应的配置文件中 |
void clear() | 清除所有的键值对 |
泛型类就是具有一个或多个类型变量的类
泛型
注意
public class Main {
public static void main(String[] args) {
Holder<AutoMobile> holder = new Holder<AutoMobile>(new Trunk());
AutoMobile auto = holder.getA();//无需转类型
auto.run();
}
}
/**
* 泛型类
*/
public class Holder<T> {
private T a;
public Holder(T a) {
this.a = a;
}
public T getA() {
return a;
}
public void setA(T a) {
this.a = a;
}
}
abstract class AutoMobile {
public abstract void run();
}
public class Car extends AutoMobile{
@Override
public void run() {
System.out.println("小车在跑");
}
}
public class Trunk extends AutoMobile{
@Override
public void run() {
System.out.println("卡车在跑");
}
}
打印结果:卡车在跑
不能使用泛型类型参数创建实例:错误语句: E object = new E(); 原因:运行时执行的是new E(),但运行时泛型类型是不可用的
不能使用泛型类型创建数组:
E[] elements = new E[capacity];//错误
ArrayList<String>[] list = new ArrayList<String>[10];//错误
E[] elements = (E[])new Object[capacity];//正确
ArrayList<String>[] list = (ArrayList<String>)new ArrayList[10];//正确
静态环境下不允许类的参数是泛型类型。由于泛型类的所有实例都有相同的运行时类,所以泛型类的精通变量和方法是被他所有实例共享的。因此,在静态方法中,数据域或初始化语句中,为了类而引用泛型类型参数是非法的
public class Test<E>{
public static test1(E o1){}//非法
public static E o1;//非法
static{
E o2;//非法
}
}
异常类不能是泛型的,泛型类不能扩展java.lang.Throwable
public class MyException<T> extends Exception{}
捕获异常时:
try{}catch(MyException<T> e){}//JVM必须检查这个从try中抛出的异常,以确定它是否与catch子句指定的类型匹配,但在运行时类型的信息是不出现的
标签:实现原理 stream 比较 范围 copy 原理 不可用 动态 pre
原文地址:https://www.cnblogs.com/Zhouge6/p/12262789.html