文章目錄
-
- 1、Java ==和equals有什麼差別?
- 2、Java 的運作機制
- 3、實作線程的兩種方式
- 4、getResource方法
- 5、删除字元串最後一個字元的幾種方法
- 6、字元串分割[split()]和截取[substring()]
- 7、判斷一個字元串是否包含某個字元
- 8、String方法的總結
- 9、List集合實作倒倒序排列
- 10、JDK指定D盤安裝及環境變量配置
- 11、bug記錄
- 12、BufferReader中的readLine()方法
- 13、java.lang.NullPointerException - 如何處理空指針異常
- 14、報錯:Parameter index out of range (1 > number of parameters, which is 0).
- 15、字元串怎麼轉換成整數
- 16、 API中文版
- 17、InputStream.read(),response.getOutputStream(),OutputStream().write【IO流】
- 18、Map.keySet()、Map.put()、Map.get()【Map類、Set類】
- 19、Arrays.toString(string[]) + Enumeration.hasMoreElements()【Arrays類、Enumeration接口】
- 20、如何産生随機數(Random類)
- 21、如何實作保留兩位小數 — DecimalFormat
喜歡記得點個贊喲,我是王睿,很高興認識大家!
1、Java ==和equals有什麼差別?
1、概念分析
基本資料類型 == 比較的是值
引用資料類型 == 比較的是記憶體位址
- “==” :判斷兩個對象的位址是不是相等。即判斷兩個對象是不是同一個對象。
- equals():判斷兩個對象的内容是否相等。
2、代碼分析
"==" 比較基本資料類型
結果:相等
int num1=20,num2=20;
if(num1==num2)
System.out.println("相等");
else
System.out.println("不相等");
"==" 比較引用資料類型
結果:不相等
String str1="123";
String str2 = new String("123");
if(str1==str2)
System.out.println("相等");
else
System.out.println("不相等");
equals() 比較引用資料類型
結果:相等
String str1="123";
String str2 = new String("123");
if(str1.equals(str2))
System.out.println("相等");
else
System.out.println("不相等");
2、Java 的運作機制
一丶講之前,我先給大家提個問題:
Java究竟是編譯型語言還是解釋型語言呢?
二丶Java 的運作機制
三丶解答提問
答案:Java是解釋性語言
Java虛拟機在這裡擔當的是解釋器的角色,他會在程式運作時編譯後的 class 檔案解釋成計算機可識别的二進制檔案資料後再執行。
3、實作線程的兩種方式
方式一:繼承 Thread 類
繼承 Thread 類建立一個新的線程文法:
public class ThreadTest extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
}
}
别怕,我們一層層分析。
當我們的自定義類繼承了 Thread 類後,必須要實作run()方法。要算是一個有意義的線程
為什麼這麼說?
簡單了解:
把線程要做的事情放到run()方法裡,當線程啟動後,會直接執行run()方法裡面的所有代碼。
好,那麼問題來了。
提問:這個run()方法究竟是從哪裡來的呢?
問得很好,run() 方法上方有一個@Override 标記,代表它是一個抽象方法,我們都知道子類是必須要繼承父類 Thread的抽象方法的,而 Thread 又實作了Runnable 接口,接口中的方法全都是抽象方法,且不能有方法體,是以說,知道怎麼來的了吧!
要想讓線程能夠得到執行,我們需要啟動線程,這時候線程才能拿到cpu時間片進而才能啟動
啟動線程文法:
public static void main(String[] args){
new ThreadTest().start();
}
例1:
public class ThreadTest extends Thread { //繼承 Thread 類
private int count = 10;
public void run() { //重寫 run() 方法
while(true) {
System.out.print(count + " "); //列印 count 變量
if(--count == 0) { //使 count 變量自減,當自減為 0 時,退出循環
return;
}
}
}
public static void main(String[] args) {
new ThreadTest().start();
}
}
class A extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
}
}
結果為:
重要結論:
如果不調用start() 方法,線程永遠都不會啟動,在主方法沒有調用start()方法之前,Thread 對象隻是一個執行個體,而不是一個真正的線程。
為什麼要有第二種啟動線程的方式
學習第二種方式之前,我們需要知道,為什麼有1種實作了以後還要搞第二種不是浪費時間嗎,不,開發者可比我們聰明多了,針對不同的情景,我們會使用不同的方式去實作。
具體原因:
如果程式員需要繼承其他類(非Thread 類),因為Java不能支援多繼承,此時還要使目前類實作多線程,那麼就可以通過 Runnable 接口來實作。
是以我們知道了第二種方式誕生原因後,就一起來學習吧
方式二:實作 Runnable 接口
文法:
其實 Thread 類它實作了 Runnable 對象,其中的 run()方法正是對 Runnable 接口中的 run() 方法的具體實作。
實作 Runnable 接口建立線程的流程圖
例1:
import java.awt.Container;
import java.net.URL;
import javax.swing.*;
public class SwingAndThread extends JFrame {
private JLabel jl = new JLabel(); //聲明 JLabel 對象
private static Thread t; //聲明線程對象
private int count = 0; //聲明計數變量
private Container container = getContentPane(); //聲明容器
public SwingAndThread() {
setBounds(300,200,250,100); //絕對定位窗體大小與位置
container.setLayout(null); //使窗體不适用任何布局管理器
URL url = SwingAndThread.class.getResource("1.png"); //擷取圖檔的URL
Icon icon = new ImageIcon(url); //執行個體化一個 Icon
jl.setIcon(icon); //将圖示放置再标簽中
jl.setHorizontalAlignment(SwingConstants.LEFT); //設定圖檔在标簽的最左方
jl.setBounds(10, 10, 200, 50); //設定标簽的位置與大小
jl.setOpaque(true);
t = new Thread(new Runnable() { //定義匿名内部類,該類實作 Runnable 接口
@Override
public void run() { //重寫run() 方法
while(count <= 200) { //設定循環條件
jl.setBounds(count, 10, 200, 50); //将标簽的橫坐标用變量表示
try {
Thread.sleep(1000); //将線程休眠 1000 毫秒
}catch (Exception e) {
e.printStackTrace();
}
count += 30; //使橫坐标每次增加4
if(count >= 200) { //當圖示到達标簽的最右邊時,使其回到标簽最左邊
count=10;
}
}
}
});
t.start(); //啟動線程
container.add(jl); //将标簽添加到容器中
setVisible(true); //設定窗體可見
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); //設定窗體關閉方式
}
public static void main(String[] args) {
new SwingAndThread(); //執行個體化一個 SwingAndThread 對象
// System.out.println(SwingAndThread.class.getResource(""));
}
}
運作結果(有水印望各位請體諒了解):
注意:這裡我要講解下面這行代碼
當時我有卡在這裡,因為不知道圖檔放在哪裡,getResource() 方法才能擷取到。後面百度了下,才找到了解決的方法:
可以看到,我在 main() 方法裡注釋了一行代碼:
這行代碼,是用來擷取目前目前項目的運作路徑的。結果為:
是以能夠得出,圖檔肯定放在bin目錄下才能擷取到。
總結:
- run() 方法用來存放 線程執行邏輯
- 隻有調用 start() 方法才會産生線程實體,并且運作。
4、getResource方法
參考:原文連結
5、删除字元串最後一個字元的幾種方法
參考:
java删除字元串最後一個字元的幾種方法
6、字元串分割[split()]和截取[substring()]
字元串分割[split()]和截取[substring()]
7、判斷一個字元串是否包含某個字元
判斷一個字元串是否包含某個字元
8、String方法的總結
String方法的總結
9、List集合實作倒倒序排列
10、JDK指定D盤安裝及環境變量配置
一丶下載下傳JDK,并将它放到我們D盤的任意一個目錄下(不要放在含有中文的檔案目錄)
我的網盤
連結:https://pan.baidu.com/s/1qDWpLmYYknlaYrjismk0rA&shfl=sharepset
提取碼:r8mq
二丶配置環境變量
%JAVA_HOME%\bin;%JAVE_HOME%\jre\bin;
D:\program\JAVA\jdk\jdk1.8.0_171
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib;\tools.jar
%JAVA_HOME%\bin;%JAVE_HOME%\jre\bin;
三丶檢測是否成功
打開指令:Ctrl+R
1.輸入java,顯示如下内容,表示成功
2.java -version
到此,就已經完全成功了!
11、bug記錄
今天來跟大家談一下一個,我在做一個新聞項目的時候,遇到的一個很有意思的小Bug
報錯的資訊如下:
原因分析:
解決方法:
12、BufferReader中的readLine()方法
BufferReader:字元讀取流緩沖去,在BufferReader中有一個readLine()方法,表示每次讀取一行資料。
readLine()方法傳回包含該行内容的字元串,不包含任何行終止符,如果已到達流末尾,則傳回 null,即傳回的資料為回車符自己的資料,不包括回車符。
readLine()方法的原理:
readLine()方法無論讀取一行資料還是讀取多個字元,最終調用的方法還是讀取字元流(Reader)中的read()方法,一次讀取一個字元。
import java.io.FileReader;
import java.io.IOException;
/*
* 模拟實作BufferedReader中的readLine()方法
* */
public class MyBufferedReader {
private FileReader fr = null;
public MyBufferedReader(FileReader fr) {
this.fr = fr;
}
public String readLine() throws IOException {
// 定義一個臨時容器,用于存放讀取的資料
StringBuilder sb = new StringBuilder();
// 定義一個字元,用于判斷是否讀取到檔案末尾
int ch = 0;
while ((ch = fr.read()) != -1) {
if (ch == '\r') {
continue;
}
if (ch == '\n') {
return sb.toString();
}else{
sb.append((char)ch);
}
}
//判斷緩沖區是否還有資料,要是有資料就輸出,(這種情況是避免最後一行資料沒有回車符造成資料沒有讀出的問題)
if(sb.length() !=0){
return sb.toString();
}
return null;
}
//定義關閉方法
public void close() throws IOException{
if(fr != null){
fr.close();
}
}
}
原文連結:https://blog.csdn.net/peituanjie/article/details/17421773
13、java.lang.NullPointerException - 如何處理空指針異常
原文:java.lang.NullPointerException - 如何處理空指針異常
14、報錯:Parameter index out of range (1 > number of parameters, which is 0).
這種情況,肯定是某一個步的執行語句下表越界了,注意檢查代碼!
可能是解析結果集的時候,也有可能是存儲值的時候
15、字元串怎麼轉換成整數
String s=“123”;
int i;
方法一
第一種方法:i=Integer.parseInt(s);
方法二
第二種方法:i=Integer.valueOf(s).intValue();
16、 API中文版
API中文版
17、InputStream.read(),response.getOutputStream(),OutputStream().write【IO流】
一丶 FileInputStream類:
Class FileInputStream
java.lang.Object
java.io.InputStream
java.io.FileInputStream
All Implemented Interfaces:
Closeable , AutoCloseable
public class FileInputStream
extends InputStream
A FileInputStream從檔案系統中的檔案擷取輸入位元組。 什麼檔案可用取決于主機環境。
FileInputStream用于讀取諸如圖像資料的原始位元組流。 要閱讀字元串,請考慮使用FileReader 。
從以下版本開始:
JDK1.0
另請參見:
File , FileDescriptor , FileOutputStream , Files.newInputStream(java.nio.file.Path, java.nio.file.OpenOption…)
二丶 public FileInputStream(String name)
簡介:
FileInputStream(String name)
通過打開與實際檔案的連接配接來建立一個 FileInputStream ,該檔案由檔案系統中的路徑名 name命名。
詳情:
構造方法詳細資訊
FileInputStream
public FileInputStream(String name)
throws FileNotFoundException
通過打開與實際檔案的連接配接建立一個FileInputStream檔案,該檔案由檔案系統中的路徑名name命名。 建立一個新的FileDescriptor對象來表示此檔案連接配接。
首先,如果有一個安全管理器,它的checkRead方法被調用與name參數作為其參數。
如果命名檔案不存在,則是一個目錄而不是正常檔案,或者由于某些其他原因無法打開讀取,是以抛出一個FileNotFoundException 。
參數
name - 與系統相關的檔案名。
異常
FileNotFoundException - 如果檔案不存在,是一個目錄而不是正常檔案,或者由于某些其他原因無法打開閱讀。
SecurityException - 如果安全管理器存在,并且其 checkRead方法拒絕對該檔案的讀取通路。
另請參見:
SecurityManager.checkRead(java.lang.String)
三丶 InputStream 類
org.omg.CORBA_2_3.portable
Class InputStream
java.lang.Object
java.io.InputStream
org.omg.CORBA.portable.InputStream
org.omg.CORBA_2_3.portable.InputStream
All Implemented Interfaces:
Closeable , AutoCloseable
public abstract class InputStream
extends InputStream
InputStream提供從流中讀取所有映射的IDL類型。 它擴充了org.omg.CORBA.portable.InputStream。 該類定義了為CORBA 2.3添加的新方法。
從以下版本開始:
JDK1.2
另請參見:
InputStream
四丶 InputStream.read(數組)
得到數組的長度
byte[] b = new byte[1024];
length= inputStream.read(b)
有值就會傳回數組長度,沒值就會傳回-1
五丶 OutputStream 類
compact1, compact2, compact3
java.io
Class OutputStream
java.lang.Object
java.io.OutputStream
All Implemented Interfaces:
Closeable , Flushable , AutoCloseable
已知直接子類:
ByteArrayOutputStream , FileOutputStream , FilterOutputStream , ObjectOutputStream , OutputStream , PipedOutputStream
public abstract class OutputStream
extends Object
implements Closeable, Flushable
這個抽象類是表示位元組輸出流的所有類的超類。 輸出流接收輸出位元組并将其發送到某個接收器。
需要定義OutputStream子類的應用OutputStream必須至少提供一個寫入一個位元組輸出的方法。
從以下版本開始:
JDK1.0
另請參見:
BufferedOutputStream , ByteArrayOutputStream , DataOutputStream , FilterOutputStream , InputStream , write(int)
六丶 OutputStream.write()
簡介
void write(byte[] b, int off, int len)
從指定的位元組數組寫入 len個位元組,從偏移 off開始輸出到此輸出流。
詳情
public void write(byte[] b,
int off,
int len)
throws IOException
從指定的位元組數組寫入len位元組,從偏移off開始輸出到此輸出流。 write(b, off, len)的一般合同是數組b中的一些位元組按順序寫入輸出流; 元素b[off]是寫入的第一個位元組, b[off+len-1]是此操作寫入的最後一個位元組。
該write的方法OutputStream調用寫出在每個位元組中的一個參數的寫入方法。 鼓勵子類覆寫此方法并提供更有效的實作。
如果b是null ,則抛出NullPointerException 。
如果off為負數,或len為負數,或off+len大于數組b的長度,則抛出IndexOutOfBoundsException 。
參數
b - 資料。
off - 資料中的起始偏移量。
len - 要寫入的位元組數。
異常
IOException - 如果發生I / O錯誤。 特别地,如果輸出流關閉,則抛出IOException 。
七丶 OutputStream.close()
簡介
close()
關閉此輸出流并釋放與此流相關聯的任何系統資源。
詳情
public void close()
throws IOException
關閉此輸出流并釋放與此流相關聯的任何系統資源。 close的一般合同是關閉輸出流。 封閉流不能執行輸出操作,無法重新打開。
該close的方法OutputStream什麼都不做。
Specified by:
close在界面 Closeable
Specified by:
close在界面 AutoCloseable
異常
IOException - 如果發生I / O錯誤。
八丶 InputStream.close()
同上
九丶 代碼解析
//要下載下傳哪一個檔案,擷取檔案名
String fileName = request.getParameter("fileName");
fileName = new String(fileName.getBytes("iso-8859-1"), "utf-8");
System.out.println("fileName:"+fileName);
//找到要下載下傳的這個檔案路徑 如果項目部署在安裝的Tomcat下
//F:\\online\\servlet\\teach\\day01\\soft\\apache-tomcat-7.0.52\\webapps\\Servlet06\\upload
String path = getServletContext().getRealPath("/upload");
System.out.println("path:"+path);
System.out.println("File.separator:"+File.separator);
//檔案名需要根據不同的浏覽器進行轉碼,否則如果下載下傳的檔案,檔案名是中文的話,就好出問題
//attachment:通知浏覽器以下載下傳的形勢打開這個頁面
response.setHeader("Content-Disposition", "attachment;fileName="+getStr(request,fileName));
//輸入流
InputStream inputStream = new FileInputStream(path+File.separator+fileName);
//響應輸出流
OutputStream outputStream = response.getOutputStream();
int length = 0;
//桶
byte[] b = new byte[1024];
while ((length= inputStream.read(b)) != -1) {
outputStream.write(b, 0, length);
}
outputStream.close();
inputStream.close();
}
18、Map.keySet()、Map.put()、Map.get()【Map類、Set類】
首先,不要慌,大家來看一下API的介紹,最後會用一個代碼例子進行解析:
一丶 Map<K,V>
Interface Map<K,V>
參數類型
K - 由此地圖維護的鍵的類型
V - 映射值的類型
All Known Subinterfaces:
Bindings , ConcurrentMap <K,V>, ConcurrentNavigableMap <K,V>, LogicalMessageContext , MessageContext , NavigableMap <K,V>, SOAPMessageContext , SortedMap <K,V>
所有已知實作類:
AbstractMap , Attributes , AuthProvider , ConcurrentHashMap , ConcurrentSkipListMap , EnumMap , HashMap , Hashtable , IdentityHashMap , LinkedHashMap , PrinterStateReasons , Properties , Provider , RenderingHints , SimpleBindings , TabularDataSupport , TreeMap , UIDefaults , WeakHashMap
public interface Map<K,V>
将鍵映射到值的對象。 地圖不能包含重複的鍵; 每個鍵可以映射到最多一個值。
這個接口取代了Dictionary類,它是一個完全抽象的類而不是接口。
Map界面提供了三個集合視圖 ,允許将映射内容視為一組鍵,值集合或鍵值映射集合。 地圖的順序被定義為其中在地圖上的集合視圖疊代傳回元素的順序。 一些地圖實作,如TreeMap課程,對他們的訂單做出了具體的保證; 其他人,像HashMap班,不要。
注意:如果使用可變對象作為地圖鍵,必須非常小心。 如果對象的值以影響equals比較的方式更改,而對象是地圖中的鍵,則不會指定地圖的行為。 這個禁令的一個特殊情況是,地圖不允許将自己包含在内。 雖然地圖可以将其本身作為一個值,但建議您非常小心: equals和hashCode方法在這樣的地圖上已經不太明确。
所有通用映射實作類應提供兩個“标準”構造函數:一個建立空映射的void(無參數)構造函數,以及一個具有類型為Map的單個參數的構造函數 ,它建立一個具有相同鍵值的新映射映射作為參數。 實際上,後一個構造函數允許使用者複制任何地圖,産生所需類的等效地圖。 沒有辦法強制執行此建議(因為接口不能包含構造函數),而JDK中的所有通用映射實作都符合要求。
包含在該界面中的“破壞性”的方法,即,修改其操作地圖的方法,被指定抛出UnsupportedOperationException如果此映射不支援該操作。 如果是這種情況,如果調用對地圖沒有影響,這些方法可能會但不是必須抛出UnsupportedOperationException 。 例如,如果映射映射為“疊加”的地圖為空,則可以在不可修改的映射上調用putAll(Map)方法,但不是必須抛出異常。
一些地圖實作對它們可能包含的鍵和值有限制。 例如,一些實作禁止空鍵和值,有些對鍵的類型有限制。 嘗試插入不合格的鍵或值會抛出未經檢查的異常,通常為NullPointerException或ClassCastException 。 嘗試查詢不合格鍵或值的存在可能會引發異常,或者可能隻是傳回false; 一些實作将展現出前者的行為,一些實作将展現出後者。 更一般來說,嘗試對不符合條件的密鑰或值的操作,其完成不會導緻将不合格元素插入到地圖中可能會導緻異常或可能成功執行該選項。 此異常在此接口的規範中标記為“可選”。
Collections Framework接口中的許多方法都是按照equals方法定義的。 例如,對于在本說明書containsKey(Object key)方法表示:“傳回true當且僅當此映射包含一個鍵k使得(keynull ? knull : key.equals(k))的映射。” 該規範不應該被解釋為意味着具有非空參數調用key Map.containsKey會導緻key.equals(k)被調用的任意鍵k。 實作可以實作優化,進而避免equals的調用,例如,首先比較兩個密鑰的哈希碼。 ( Object.hashCode()規範保證具有不等的哈希碼的兩個對象不能相等。)更一般地,各種Collections Framework接口的實作可以随意使用底層Object方法的指定行為,無論執行者認為适當。
執行遞歸周遊地圖的一些地圖操作可能會失敗,并且地圖直接或間接包含自身的自引用執行個體有異常。 這包括clone() , equals() , hashCode()和toString()方法。 實作可以可選地處理自引用場景,然而大多數目前實作不這樣做。
此接口是成員Java Collections Framework 。
從以下版本開始:
1.2
另請參見:
Collection , List , SortedSet , HashSet , TreeSet , AbstractSet , Collections.singleton(java.lang.Object) , Collections.EMPTY_SET
二丶 Map.keySet()
簡介:
Set keySet()
傳回此地圖中包含的鍵的Set視圖。
詳情:
keySet
Set keySet()
傳回此地圖中包含的鍵的Set視圖。 該集合由地圖支援,是以對地圖的更改将反映在集合中,反之亦然。 如果在集合中的疊代正在進行中修改映射(除了通過疊代器自己的remove操作),疊代的結果是未定義的。 該組支援元件移除,即從映射中相應的映射,經由Iterator.remove,Set.remove,removeAll,retainAll和clear操作。 它不支援add或addAll操作。
結果
該地圖中包含的鍵的集合視圖
三丶 Map.get()
簡介:
V get(Object key)
傳回到指定鍵所映射的值,或 null如果此映射包含該鍵的映射。
詳情:
V get(Object key)
傳回到指定鍵所映射的值,或null如果此映射包含該鍵的映射。
更正式地,如果該映射包含從鍵k到值v ,使得(keynull ? knull : key.equals(k)) ,則該方法傳回v ; 否則傳回null 。 (最多可以有一個這樣的映射。)
如果此映射允許空值,則傳回值null并不一定表明該映射不包含該鍵的映射關系; 地圖也可能明确地将密鑰映射到null 。 可以使用containsKey操作來區分這兩種情況。
參數
key - 要傳回其關聯值的鍵
結果
指定鍵映射到的值,如果此映射不包含鍵的映射, null
異常
ClassCastException - 如果密鑰是該地圖不合适的類型( optional )
NullPointerException - 如果指定的鍵為空,并且此映射不允許空鍵( optional )
四丶 Map.put()
簡介:
V put(K key, V value)
将指定的值與該映射中的指定鍵相關聯(可選操作)。
詳情:
V put(K key,
V value)
将指定的值與該映射中的指定鍵相關聯(可選操作)。 如果映射先前包含了密鑰的映射,則舊值将被指定的值替換。 (映射m被認為包含關鍵字的映射k當且僅當m.containsKey(k)将傳回true )。
參數
key - 指定值與之關聯的鍵
value - 與指定鍵相關聯的值
結果
前一個值與key相關聯 ,或null,如果沒有key的映射。 (A null傳回也可以表示該地圖以前關聯的null與key ,如果實作支援null的值)
異常
UnsupportedOperationException -如果 put操作不受此地圖支援
ClassCastException - 如果指定的鍵或值的類阻止它存儲在此映射中
NullPointerException - 如果指定的鍵或值為空,并且此映射不允許空值或值
IllegalArgumentException - 如果指定鍵或值的某些屬性阻止其存儲在此映射中
五丶 Set 類
compact1, compact2, compact3
java.util
Interface Set
參數類型
E - 由此集合維護的元素的類型
All Superinterfaces:
Collection , Iterable
All Known Subinterfaces:
NavigableSet , SortedSet
所有已知實作類:
AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet
public interface Set
extends Collection
不包含重複元素的集合。 更正式地,集合不包含一對元素e1和e2 ,使得e1.equals(e2) ,并且最多一個空元素。 正如其名稱所暗示的那樣,這個接口模拟了數學集抽象。
Set接口除了繼承自Collection接口的所有構造函數的合同以及add,equals和hashCode方法的合同外 , 還 增加了其他規定。 其他繼承方法的聲明也包括在這裡以友善。 (伴随這些聲明的規範已經量身定做Set接口,但它們不包含任何附加的規定。)
構造函數的額外規定并不奇怪,所有構造函數都必須建立一個不包含重複元素的集合(如上所定義)。
注意:如果可變對象用作設定元素,則必須非常小心。 如果對象的值以影響equals比較的方式更改,而對象是集合中的元素, 則不指定集合的行為。 這種禁止的一個特殊情況是,一個集合不允許将其本身作為一個元素。
一些集合實作對它們可能包含的元素有限制。 例如,一些實作禁止空元素,有些實作對元素的類型有限制。 嘗試添加不合格元素會引發未經檢查的異常,通常為NullPointerException或ClassCastException 。 嘗試查詢不合格元素的存在可能會引發異常,或者可能隻是傳回false; 一些實作将展現出前者的行為,一些實作将展現出後者。 更一般來說,嘗試對不符合條件的元素的操作,其完成不會導緻不合格元素插入到集合中,可能會導緻異常,或者可能會成功執行該選項。 此異常在此接口的規範中标記為“可選”。
此接口是成員Java Collections Framework 。
從以下版本開始:
1.2
另請參見:
Collection , List , SortedSet , HashSet , TreeSet , AbstractSet , Collections.singleton(java.lang.Object) , Collections.EMPTY_SET
六丶 代碼講解:
Map<String, String[]> map = request.getParameterMap();
//擷取所有的name屬性值
//map.keySet()擷取map全部的key值
Set<String> keys=map.keySet();
for (String key : keys) {
//通過name屬性值,擷取使用者輸入的值
String[] values = map.get(key);
System.out.println(key+":"+Arrays.toString(values));
}
}
結果:
那麼到此,我們的介紹就結束了!相信聰明的你們一定有所了解了,如果不明白代碼的意思就翻到上面去看我的API介紹,好了那麼這一章就介紹到這裡,感謝大家的收看,我叫王睿,謝謝你們能夠看我的部落格,感謝!
19、Arrays.toString(string[]) + Enumeration.hasMoreElements()【Arrays類、Enumeration接口】
首先,不要慌,大家來看一下API的介紹,最後會用一個代碼例子進行解析:
一丶 Enumeration 接口
Interface Enumeration
All Known Subinterfaces:
NamingEnumeration
所有已知實作類:
StringTokenizer
public interface Enumeration
實作枚舉接口的對象生成一系列元素,一次一個。 連續調用nextElement方法傳回系列的連續元素。
例如,列印所有元素的一個Vector v :
for (Enumeration e = v.elements(); e.hasMoreElements()😉
System.out.println(e.nextElement());
提供了通過向量的元素,散清單的鍵和哈希表中的值來枚舉方法。 枚舉也用于指定輸入流到SequenceInputStream 。
注意:該接口的功能由Iterator接口複制。 此外,Iterator還添加了一個可選的删除操作,并具有較短的方法名稱。 新的實作應該考慮使用疊代器優先于枚舉。
從以下版本開始:
JDK1.0
另請參見:
Iterator , SequenceInputStream , nextElement() , Hashtable , Hashtable.elements() , Hashtable.keys() , Vector , Vector.elements()
二丶 Enumeration .hasMoreElements()方法:
boolean hasMoreElements()
測試此枚舉是否包含更多元素。
結果
true當且僅當此枚舉對象至少包含一個要提供的元素時; false否則。
三丶 Enumeration .nextElement()方法:
E nextElement()
如果此枚舉對象至少有一個要提供的元素,則傳回此枚舉的下一個元素。
結果
這個枚舉的下一個元素。
異常
NoSuchElementException - 如果不存在更多元素。
四丶 Arrays 類:
Class Arrays
java.lang.Object
java.util.Arrays
public class Arrays
extends Object
該類包含用于操作數組的各種方法(如排序和搜尋)。 該類還包含一個靜态工廠,可以将數組視為清單。
如果指定的數組引用為空,則該類中的方法都抛出一個NullPointerException ,除非另有說明。
該類中包含的方法的文檔包括實作的簡要描述 。 這些描述應被視為實施說明 ,而不是說明書的一部分 。 隻要規範本身得到遵守,實作者就可以随意替代其他算法。 (例如,sort(Object[])使用的sort(Object[])不一定是MergeSort,但它必須是穩定的 。)
這個班是Java Collections Framework的成員。
五丶 Arrays.toString(string[])
所有相關方法:
static String toString(boolean[] a)
傳回指定數組的内容的字元串表示形式。
static String toString(byte[] a)
傳回指定數組的内容的字元串表示形式。
static String toString(char[] a)
傳回指定數組的内容的字元串表示形式。
static String toString(double[] a)
傳回指定數組的内容的字元串表示形式。
static String toString(float[] a)
傳回指定數組的内容的字元串表示形式。
static String toString(int[] a)
傳回指定數組的内容的字元串表示形式。
static String toString(long[] a)
傳回指定數組的内容的字元串表示形式。
static String toString(Object[] a)
傳回指定數組的内容的字元串表示形式。
static String toString(short[] a)
傳回指定數組的内容的字元串表示形式。
具體介紹:
toString
public static String toString(long[] a)
傳回指定數組的内容的字元串表示形式。 字元串表示由數組元素的清單組成,括在方括号( “[]” )中。 相鄰的元素由字元", " (逗号後跟一個空格)分隔開。 元素被轉換為字元串由String.valueOf(long)。 傳回"null"如果a是null。
參數
a - 要傳回的字元串表示形式的數組
結果
一個字元串表示 a
從以下版本開始:
1.5
其他的都是以此類推,我就不一一列舉了!相信聰明的你們一定能舉一反三!
六丶 代碼講解:
//擷取所有的參數名字
//得到請求的網頁所有參數
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()) { //如果還有值則繼續循環
String name = (String) names.nextElement(); //将參數名一一指派給name,一次隻指派一個,跟随循環
String[] values = request.getParameterValues(name);//根據參數名name—key,取出對應的value值
System.out.println(name+":"+Arrays.toString(values));//列印結果
}
結果:
那麼到此,我們的介紹就結束了!相信聰明的你們一定有所了解了,如果不明白代碼的意思就翻到上面去看我的API介紹,好了那麼這一章就介紹到這裡,感謝大家的收看,我叫王睿,謝謝你們能夠看我的部落格,感謝!
20、如何産生随機數(Random類)
import java.util.Random;
public class Test {
public static void main(String[] args){
Random rand = new Random();
int num = rand.nextInt(10); 表示生成0~9内的随機數
// 100 表示0~99 以此類推
}
21、如何實作保留兩位小數 — DecimalFormat
float money = 0;
String strMoney = "0";
DecimalFormat df = new DecimalFormat("#.00"); // 保留兩位小數
strMoney = df.format(money); // 得到的結果是字元串類型
喜歡記得點個贊喲,我是王睿,很高興認識大家!