程序=算法(解决问题的步骤)+数据结构(合理的持有数据)
long start=System.currentTimeInMills();
处理步骤;
long end=System.currentTimeInMills();
System.out.println("该算法用时"+(end-start)+"ms");
是一个用于度量一个算法的运算时间的一个描述,本质是一个函数,根据这个函数能在不用具体的测试数据来测试的情况下,粗略地估计算法的执行效率
查找一个算法中执行次数最多的部分和算法规模的相互关系--函数
常用大O来表述,这个函数描述了算法执行所要时间的增长速度
存储区间是连续的,占用内存严重,故空间复杂度很大。但数组的二分查找(前提是必须有序)时间复杂度小,为O(logN);
存储区间离散(数据不是连续存放的),占用内存比较宽松,故空间复杂度很小,但时间复杂度很大O(N)。
==========================
Java集合类存放于 java.util 包中,是一个用来存放对象的容器
针对Java中的数组定长,Java提出了集合框架,实现了一种变长存储数据的容器---集合
数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合。如下:
Iterator迭代器:走访器,可以理解为集合中元素的指针
它是Java集合的顶层接口(不包括map系列的集合,Map接口是map系列集合的顶层接口)
- public interface Iterator
{ - boolean hasNext(); 判断是否有后续元素
- E next(); 指针向后移动,同时返回指向的数据
- default void remove() { 删除指针所指向的元素
- throw new UnsupportedOperationException("remove");
- }
- 使用lambda表达式的方式遍历所有元素
- default void forEachRemaining(Consumer super E> action) {
- Objects.requireNonNull(action);
- while (hasNext())
- action.accept(next());
- }
Iterable接口用以表示实现类是可以迭代的
Iterator
public interface Collection
java中提供了两种不同的方式加锁,synchronized和juc包下的Lock接口。
sychronized可重入、不可中断、非公平;Lock可重入、可中断、非公平和公平;
Lock是java 1.5中引入的线程同步工具,它主要用于多线程下共享资源的控制。
Lock有三个实现类,一个是ReentrantLock,另两个是ReentrantReadWriteLock类中的两个静态内部类ReadLock和WriteLock。这些类的底层使用都依赖于juc包抽象队列同步器AbstractQueuedSynchronizer
使用方法:多线程下访问(互斥)共享资源时, 访问前加锁,访问结束以后解锁,解锁的操作推荐放入finally块中。
- private static final ReentrantLock lock=new ReentrantLock(); 定义锁对象
- 在具体方法中
- lock.lock();
- try{
- 代码块;
- }finally{
- lock.unlock();
- }
Condition接口是一个可以带条件的线程通知接口,需要和Lock锁一起使用,用于实现比Object类种线程通知方法更精细的控制 wait/notify/notifyAll
await()类似于Object种的wait方法
signal()类似于Object中的notify方法
应用场景:线程如果不满足某个Condition将被暂停挂起,而等到线程满足条件时被唤醒