🐼
type
status
date
slug
summary
tags
category
icon
password
Property
Queue
是队列,只能一头进,另一头出。如果把条件放松一下,允许两头都进,两头都出,这种队列叫双端队列(Double Ended Queue),学名Deque
。Java集合提供了接口
Deque
来实现一个双端队列,它的功能是:- 既可以添加到队尾,也可以添加到队首;
- 既可以从队首获取,又可以从队尾获取。
比较
Queue
和Deque
出队和入队的方法:对于添加元素到队尾的操作,
Queue
提供了add()
/offer()
方法,而Deque
提供了addLast()
/offerLast()
方法。添加元素到对首、取队尾元素的操作在Queue
中不存在,在Deque
中由addFirst()
/removeLast()
等方法提供。Deque
接口实际上扩展自Queue
:因此,
Queue
提供的add()
/offer()
方法在Deque
中也可以使用,但是,使用Deque
,最好不要调用offer()
,而是调用offerLast()
:type
status
date
slug
summary
tags
category
icon
password
Property
JavaScript的
Array
可以包含任意数据类型,并通过索引来访问每个元素。要取得
Array
的长度,直接访问length
属性:直接给
Array
的length
赋一个新的值会导致Array
大小的变化:Array
可以通过索引把对应的元素修改为新的值,因此,对Array
的索引进行赋值会直接修改这个Array
:如果通过索引赋值时,索引超过了范围,同样会引起
Array
大小的变化:大多数其他编程语言不允许直接改变数组的大小,越界访问索引会报错。然而,JavaScript的
Array
却不会有任何错误。在编写代码时,不建议直接修改Array
的大小,访问索引时要确保索引不会越界。🐼
type
status
date
slug
summary
tags
category
icon
password
Property
栈(Stack)是一种后进先出(LIFO:Last In First Out)的数据结构。
只能不断地往
Stack
中压入(push)元素,最后进去的必须最早弹出(pop)来。Stack
只有入栈和出栈的操作:- 把元素压栈:
push(E)
- 把栈顶的元素“弹出”:
pop()
- 取栈顶元素但不弹出:
peek()
在Java中,用
Deque
可以实现Stack
的功能:- 把元素压栈:
push(E)
/addFirst(E)
- 把栈顶的元素“弹出”:
pop()
/removeFirst()
- 取栈顶元素但不弹出:
peek()
/peekFirst()
type
status
date
slug
summary
tags
category
icon
password
Property
总结,有哪些方法可以通过浏览器往服务器发请求?
- 表单form的提交
- 超链接。<a href="http://localhost:8080/oa/save?username=zhangsan&password=123">用户只能点击这个超链接</a>
document.location
window.location
window.open("url")
- 直接在浏览器地址栏上输入URL,然后回车(这个也可以手动输入,提交数据也可以成为动态的)
以上所有的请求方式均可以携带数据给服务器,只有通过表单提交的数据才是动态的。
🍂
type
status
date
slug
summary
tags
category
icon
password
Property
JProcessBar、ProcessMonitor、BoundedRangeModel实现进度条
进度条是图形界面中广泛使用的GUI 组件,当复制一个较大的文件时,操作系统会显示一个进度条,用于标识复制操作完成的比例 : 当启动 Eclipse 等程序时, 因为需要加载较多的资源 , 故而启动速度较慢 , 程序也会在启动过程中显示一个进度条 , 用以表示该软件启动完成的比例 ……
创建进度条
使用JProgressBar创建进度条的步骤:
- 创建JProgressBar对象
- 设置属性
- 获取和设置当前进度条的进度状态
演示代码:
🦛
type
status
date
slug
summary
tags
category
icon
password
Property
前面已经通过
ReentrantLock
和Condition
实现了一个BlockingQueue
:BlockingQueue
的意思就是说,当一个线程调用这个TaskQueue
的getTask()
方法时,该方法内部可能会让线程变成等待状态,直到队列条件满足不为空,线程被唤醒后,getTask()
方法才会返回。因为
BlockingQueue
非常有用,所以我们不必自己编写,可以直接使用Java标准库的java.util.concurrent
包提供的线程安全的集合:ArrayBlockingQueue
。除了
BlockingQueue
外,针对List
、Map
、Set
、Deque
等,java.util.concurrent
包也提供了对应的并发集合类。归纳一下:使用这些并发集合与使用非线程安全的集合类完全相同。我们以
ConcurrentHashMap
为例:因为所有的同步和加锁的逻辑都在集合内部实现,对外部调用者来说,只需要正常按接口引用,其他代码和原来的非线程安全代码完全一样。即当我们需要多线程访问时,把:
改为: