生成隨機(jī)可以用Random類,不能重復(fù)可以考慮放在HashSet中,因?yàn)镠ashSet的值是不能重復(fù)的,看代碼如下:
站在用戶的角度思考問題,與客戶深入溝通,找到清徐網(wǎng)站設(shè)計(jì)與清徐網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋清徐地區(qū)。
public?class?GenerateRandomLetterAndNum?{
public?static?void?main(String[]?args)?{
?SetString?store?=?getletterandnum(6);
?
?printSet(store);
}
public?static?SetString?getletterandnum(int?length)?{
SetString?set?=new?HashSetString();
for?(int?i?=?0;?i??length;?i++)?{
String?value?=?getrandom();
set.add(value);
}
if?(set.size()length)?{?//如果沒有生成6位
String?value?=?getrandom();//繼續(xù)調(diào)用生成隨機(jī)數(shù)的方法
set.add(value);
}
return??set;
}
private?static?String?getrandom()?{?//生成隨機(jī)字母和數(shù)字方法
String?value?=?"";
Random?random?=?new?Random();
int?gen?=?random.nextInt(2);//0、1、2
String?charornum?=?gen?%?2?==?0???"char"?:?"num";
if?("char".equals(charornum))?{
int?temp?=?random.nextInt(2)?%?2?==?0???65?:?97;
int?ascii?=?random.nextInt(26);
value?+=?(char)?(ascii?+?temp);
}?else?if?("num".equalsIgnoreCase(charornum))?{
value?+=?String.valueOf(random.nextInt(10));
}
return?value;
}
public?static??void?printSet(Set?set){?//打印set的方法
?Iterator?iterator?=?set.iterator();
?while?(iterator.hasNext())?{
String?ele?=?(String)?iterator.next();
System.out.print(ele+"?");
}
}
概述
java程序輸入需要用到Scanner工具類,輸出則使用println
解析
1、輸入:
從鍵盤輸入需要用到j(luò)ava的Scanner這個(gè)util包下的工具類
Scanner中輸入是需要對(duì)輸入的字符進(jìn)行分類,int類型為nextint()方法,double類型為nextDouble()方法,字符串類型為next()方法。
#code:
#out:
2、輸出:
java常用的輸出為println
#code:
#out:
除了println()方法之外,java還有print()和printf()兩種輸出方法,
print、println、printf的區(qū)別:
print--是函數(shù),可以返回一個(gè)值,只能有一個(gè)參數(shù)。
println 將它的參數(shù)顯示在命令窗口,并在結(jié)尾加上換行符,將輸出光標(biāo)定位在下一行的開始。
printf--函數(shù),把文字格式化以后輸出,直接調(diào)用系統(tǒng)調(diào)用進(jìn)行IO的,他是非緩沖的。
拓展內(nèi)容
java 輸入輸出流(I/O)
Java中I/O操作主要是指使用Java進(jìn)行輸入,輸出操作.?Java所有的I/O機(jī)制都是基于數(shù)據(jù)流進(jìn)行輸入輸出,這些數(shù)據(jù)流表示了字符或者字節(jié)數(shù)據(jù)的流動(dòng)序列。Java的I/O流提供了讀寫數(shù)據(jù)的標(biāo)準(zhǔn)方法。任何Java中表示數(shù)據(jù)源的對(duì)象都會(huì)提供以數(shù)據(jù)流的方式讀寫它的數(shù)據(jù)的方法。
Java.io是大多數(shù)面向數(shù)據(jù)流的輸入/輸出類的主要軟件包。此外,Java也對(duì)塊傳輸提供支持,在核心庫 java.nio中采用的便是塊IO。
流IO的好處是簡(jiǎn)單易用,缺點(diǎn)是效率較低。塊IO效率很高,但編程比較復(fù)雜。
Java IO模型 ?:
Java的IO模型設(shè)計(jì)非常優(yōu)秀,它使用Decorator模式,按功能劃分Stream,您可以動(dòng)態(tài)裝配這些Stream,以便獲得您需要的功能。例如,您需要一個(gè)具有緩沖的文件輸入流,則應(yīng)當(dāng)組合使用FileInputStream和BufferedInputStream。
輸入流(Input ?Stream):
程序從輸入流讀取數(shù)據(jù)源。數(shù)據(jù)源包括外界(鍵盤、文件、網(wǎng)絡(luò)…),即是將數(shù)據(jù)源讀入到程序的通信通道。
輸出流(output Stream):
程序向輸出流寫入數(shù)據(jù)。將程序中的數(shù)據(jù)輸出到外界(顯示器、打印機(jī)、文件、網(wǎng)絡(luò)…)的通信通道。
public?class?Test?{
public?static?void?main(String[]?args){
test1();
test2();
}
public?static?void?test1(){
int[]?ascs={(int)'A',(int)'B',(int)'C',(int)'D',(int)'E',(int)'F',(int)'G',
(int)'H',(int)'I',(int)'J',(int)'K',(int)'L',(int)'M',(int)'N',
(int)'O',(int)'P',(int)'Q',(int)'R',(int)'S',(int)'T',
(int)'U',(int)'V',(int)'W',(int)'X',(int)'Y',(int)'Z'};
for?(int?asc:ascs)?{
System.out.println(asc);
}
}
public?static?void?test2(){
char[]?chars={'A','B','C','D','E','F','G',
'H','I','J','K','L','M','N',
'O','P','Q','R','S','T',
'U','V','W','X','Y','Z',
'0','1','2','3','4','5','6','7','8','9'};
for?(char?c:chars)?{
System.out.println(c);
}
}
}
這段代碼定義了一個(gè)名為Point的類,該類有兩個(gè)變量x和y,表示點(diǎn)的橫縱坐標(biāo)。這個(gè)類有兩個(gè)方法:
Point(double _x, double _y):構(gòu)造函數(shù),用來創(chuàng)建一個(gè)點(diǎn)對(duì)象。該函數(shù)接收兩個(gè)參數(shù),分別表示該點(diǎn)的橫縱坐標(biāo)。
getDistance(Point p):計(jì)算兩個(gè)點(diǎn)之間的距離。該函數(shù)接收一個(gè)點(diǎn)對(duì)象作為參數(shù),返回兩個(gè)點(diǎn)之間的距離。
在main函數(shù)中,它會(huì)創(chuàng)建兩個(gè)點(diǎn)對(duì)象:p1和origin。p1的橫縱坐標(biāo)分別為3.0和4.0,origin的橫縱坐標(biāo)都為0。它會(huì)調(diào)用p1的getDistance方法,計(jì)算p1和原點(diǎn)origin之間的距離。最后,它會(huì)打印出這個(gè)距離。
在一般的Java應(yīng)用開發(fā)過程中,開發(fā)人員使用Java的方式比較簡(jiǎn)單。打開慣用的IDE,編寫Java源代碼,再利用IDE提供的功能直接運(yùn)行Java 程序就可以了。這種開發(fā)模式背后的過程是:開發(fā)人員編寫的是Java源代碼文件(.java),IDE會(huì)負(fù)責(zé)調(diào)用Java的編譯器把Java源代碼編譯成平臺(tái)無關(guān)的字節(jié)代碼(byte code),以類文件的形式保存在磁盤上(.class)。Java虛擬機(jī)(JVM)會(huì)負(fù)責(zé)把Java字節(jié)代碼加載并執(zhí)行。Java通過這種方式來實(shí)現(xiàn)其“編寫一次,到處運(yùn)行(Write once, run anywhere)” 的目標(biāo)。Java類文件中包含的字節(jié)代碼可以被不同平臺(tái)上的JVM所使用。Java字節(jié)代碼不僅可以以文件形式存在于磁盤上,也可以通過網(wǎng)絡(luò)方式來下載,還可以只存在于內(nèi)存中。JVM中的類加載器會(huì)負(fù)責(zé)從包含字節(jié)代碼的字節(jié)數(shù)組(byte[])中定義出Java類。在某些情況下,可能會(huì)需要?jiǎng)討B(tài)的生成 Java字節(jié)代碼,或是對(duì)已有的Java字節(jié)代碼進(jìn)行修改。這個(gè)時(shí)候就需要用到本文中將要介紹的相關(guān)技術(shù)。首先介紹一下如何動(dòng)態(tài)編譯Java源文件。
動(dòng)態(tài)編譯Java源文件
在一般情況下,開發(fā)人員都是在程序運(yùn)行之前就編寫完成了全部的Java源代碼并且成功編譯。對(duì)有些應(yīng)用來說,Java源代碼的內(nèi)容在運(yùn)行時(shí)刻才能確定。這個(gè)時(shí)候就需要?jiǎng)討B(tài)編譯源代碼來生成Java字節(jié)代碼,再由JVM來加載執(zhí)行。典型的場(chǎng)景是很多算法競(jìng)賽的在線評(píng)測(cè)系統(tǒng)(如PKU JudgeOnline),允許用戶上傳Java代碼,由系統(tǒng)在后臺(tái)編譯、運(yùn)行并進(jìn)行判定。在動(dòng)態(tài)編譯Java源文件時(shí),使用的做法是直接在程序中調(diào)用Java編譯器。
JSR 199引入了Java編譯器API。如果使用JDK 6的話,可以通過此API來動(dòng)態(tài)編譯Java代碼。比如下面的代碼用來動(dòng)態(tài)編譯最簡(jiǎn)單的Hello World類。該Java類的代碼是保存在一個(gè)字符串中的。
01 public class CompilerTest {
02 public static void main(String[] args) throws Exception {
03 String source = "public class Main { public static void main(String[] args) {System.out.println(\"Hello World!\");} }";
04 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
05 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
06 StringSourceJavaObject sourceObject = newCompilerTest.StringSourceJavaObject("Main", source);
07 Iterable extends JavaFileObject fileObjects = Arrays.asList(sourceObject);
08 CompilationTask task = compiler.getTask(null, fileManager, null,null, null, fileObjects);
09 boolean result = task.call();
10 if (result) {
11 System.out.println("編譯成功。");
12 }
13 }
14
15 static class StringSourceJavaObject extends SimpleJavaFileObject {
16
17 private String content = null;
18 public StringSourceJavaObject(String name, String content) ??throwsURISyntaxException {
19 super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
20 this.content = content;
21 }
22
23 public CharSequence getCharContent(boolean ignoreEncodingErrors) ??throws IOException {
24 return content;
25 }
26 }
27 }
如果不能使用JDK 6提供的Java編譯器API的話,可以使用JDK中的工具類com.sun.tools.javac.Main,不過該工具類只能編譯存放在磁盤上的文件,類似于直接使用javac命令。
另外一個(gè)可用的工具是Eclipse JDT Core提供的編譯器。這是Eclipse Java開發(fā)環(huán)境使用的增量式Java編譯器,支持運(yùn)行和調(diào)試有錯(cuò)誤的代碼。該編譯器也可以單獨(dú)使用。Play框架在內(nèi)部使用了JDT的編譯器來動(dòng)態(tài)編譯Java源代碼。在開發(fā)模式下,Play框架會(huì)定期掃描項(xiàng)目中的Java源代碼文件,一旦發(fā)現(xiàn)有修改,會(huì)自動(dòng)編譯 Java源代碼。因此在修改代碼之后,刷新頁面就可以看到變化。使用這些動(dòng)態(tài)編譯的方式的時(shí)候,需要確保JDK中的tools.jar在應(yīng)用的 CLASSPATH中。
下面介紹一個(gè)例子,是關(guān)于如何在Java里面做四則運(yùn)算,比如求出來(3+4)*7-10的值。一般的做法是分析輸入的運(yùn)算表達(dá)式,自己來模擬計(jì)算過程。考慮到括號(hào)的存在和運(yùn)算符的優(yōu)先級(jí)等問題,這樣的計(jì)算過程會(huì)比較復(fù)雜,而且容易出錯(cuò)。另外一種做法是可以用JSR 223引入的腳本語言支持,直接把輸入的表達(dá)式當(dāng)做JavaScript或是JavaFX腳本來執(zhí)行,得到結(jié)果。下面的代碼使用的做法是動(dòng)態(tài)生成Java源代碼并編譯,接著加載Java類來執(zhí)行并獲取結(jié)果。這種做法完全使用Java來實(shí)現(xiàn)。
01 private static double calculate(String expr) throws CalculationException {
02 String className = "CalculatorMain";
03 String methodName = "calculate";
04 String source = "public class " + className
05 + " { public static double " + methodName + "() { return " + expr +"; } }";
06 //省略動(dòng)態(tài)編譯Java源代碼的相關(guān)代碼,參見上一節(jié)
07 boolean result = task.call();
08 if (result) {
09 ClassLoader loader = Calculator.class.getClassLoader();
10 try {
11 Class? clazz = loader.loadClass(className);
12 Method method = clazz.getMethod(methodName, new Class?[] {});
13 Object value = method.invoke(null, new Object[] {});
14 return (Double) value;
15 } catch (Exception e) {
16 throw new CalculationException("內(nèi)部錯(cuò)誤。");
17 }
18 } else {
19 throw new CalculationException("錯(cuò)誤的表達(dá)式。");
20 }
21 }
上面的代碼給出了使用動(dòng)態(tài)生成的Java字節(jié)代碼的基本模式,即通過類加載器來加載字節(jié)代碼,創(chuàng)建Java類的對(duì)象的實(shí)例,再通過Java反射API來調(diào)用對(duì)象中的方法。
Java字節(jié)代碼增強(qiáng)
Java 字節(jié)代碼增強(qiáng)指的是在Java字節(jié)代碼生成之后,對(duì)其進(jìn)行修改,增強(qiáng)其功能。這種做法相當(dāng)于對(duì)應(yīng)用程序的二進(jìn)制文件進(jìn)行修改。在很多Java框架中都可以見到這種實(shí)現(xiàn)方式。Java字節(jié)代碼增強(qiáng)通常與Java源文件中的注解(annotation)一塊使用。注解在Java源代碼中聲明了需要增強(qiáng)的行為及相關(guān)的元數(shù)據(jù),由框架在運(yùn)行時(shí)刻完成對(duì)字節(jié)代碼的增強(qiáng)。Java字節(jié)代碼增強(qiáng)應(yīng)用的場(chǎng)景比較多,一般都集中在減少冗余代碼和對(duì)開發(fā)人員屏蔽底層的實(shí)現(xiàn)細(xì)節(jié)上。用過JavaBeans的人可能對(duì)其中那些必須添加的getter/setter方法感到很繁瑣,并且難以維護(hù)。而通過字節(jié)代碼增強(qiáng),開發(fā)人員只需要聲明Bean中的屬性即可,getter/setter方法可以通過修改字節(jié)代碼來自動(dòng)添加。用過JPA的人,在調(diào)試程序的時(shí)候,會(huì)發(fā)現(xiàn)實(shí)體類中被添加了一些額外的 域和方法。這些域和方法是在運(yùn)行時(shí)刻由JPA的實(shí)現(xiàn)動(dòng)態(tài)添加的。字節(jié)代碼增強(qiáng)在面向方面編程(AOP)的一些實(shí)現(xiàn)中也有使用。