java----java工具包
- System:
- Runtime:
- Random:
- Scanner:
- Arrays:
- MessageFormat:
- Math:
- 日期:
- Comparable:
- cloneable接口:
- 數(shù)字處理:
- MD5加密:
- lambda表達式:
- RandomAccessFile:
- Properties:
- StringUtils:
?System:
System.out.println(System.currentTimeMillis());//從1970年開始,打印時間戳格式的時間 System.exit(0);//0表示正常對出?
?Runtime:
Runtime rt = Runtime.getRuntime(); System.out.println("處理器數(shù)量:"+rt.availableProcessors()); System.out.println("JVM總內(nèi)存數(shù):"+rt.totalMemory()); System.out.println("JVM空閑內(nèi)存數(shù):"+rt.freeMemory()); System.out.println("JVM可用最大內(nèi)存數(shù):"+rt.maxMemory());try {rt.exec("notepad"); //調(diào)用其他的應用程序 } catch (IOException e) {e.printStackTrace(); }
?
?Random:
生成隨機數(shù)
import java.util.Random; public class Demo {public static void main(String[] args){Random r = new Random();//如果給一個固定的數(shù)字,則生成的隨機數(shù)不變System.out.print(r.nextInt(50)); //不包含50} }
?Scanner:
鍵盤輸入
//類似 python 中的 input import java.util.Scanner;; public class Demo {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("輸入一個整數(shù)")int x = input.nextInt(); //input.next() 輸入一個字符串System.out.println(x); //0 } }
?Arrays:
二分法查找
import java.util.Arrays; public class Demo {public static void main(String[] args){int[] num = {1,2,3,4};int index = Arrays.binarySearch(num, 4); //使用這個方法之前必須手動對數(shù)據(jù)進行排序。否則可能返回(-2):表示為找到System.out.println(index);} }原樣返回一個數(shù)組
import java.util.Arrays; public class Demo {public static void main(String[] args){int[] num = {1,2,3,4};System.out.println(Arrays.toString(num));} }快速排序
comparable:可以實現(xiàn)自定義排序
import java.util.Arrays; public class Demo {public static void main(String[] args){int[] num = {1,5,2,3,4};Arrays.sort(num);System.out.println(Arrays.toString(num));} }數(shù)組的copy
import java.util.Arrays; public class Demo {public static void main(String[] args){int[] num = {1,5,2,3,4};int[] num1 = Arrays.copyOf(num, 8); //實現(xiàn)方式為System.arraycopySystem.out.println(Arrays.toString(num1)); //[1, 5, 2, 3, 4, 0, 0, 0]num = Arrays.copyOf(num, 3);System.out.println(Arrays.toString(num)); //[1, 5, 2]} }使用System.arraycopy 進行數(shù)組的復制
import java.util.Arrays; public class Demo {public static void main(String[] args){int[] num1 = {1,2,3};int[] num2 = new int[num1.length];System.arraycopy(num1, 0, num2, 0, num1.length);System.out.print(Arrays.toString(num2));} }判斷兩個數(shù)組是否相等
import java.util.Arrays; public class Demo {public static void main(String[] args){int[] num1 = {1,2,3};int[] num2 = {2,3};System.out.println(Arrays.equals(num1, num2));} }填充數(shù)組
import java.util.Arrays; public class Demo {public static void main(String[] args){int[] num1 = {1,2,3};Arrays.fill(num1, 0);System.out.println(Arrays.toString(num1));} }
?MessageFormat:
格式化文本
import java.text.MessageFormat; public class Demo {public static void main(String[] args) {String s = "歡迎{0}";s =MessageFormat.format(s, "小明");System.out.println(s); } }?String.format
public class T {public static void main(String[] args) {test();}public static void test(){String s = "xx%s";String str = String.format(s, "sdf");System.out.println(str);} }
?Math:
import static java.lang.Math.floor; //靜態(tài)導入 public class Demo {public static void main(String[] args) {System.out.println(Math.abs(-1)); //去絕對值System.out.println(Math.random());//取(0,1)的double數(shù)System.out.println(Math.round((Math.random()*100)));//將一個double數(shù)取整System.out.println(Math.sqrt(2));//取根號2;System.out.println(Math.round(1.5));//2System.out.println(floor(1.5));//1.0} }
?日期:
SimpleDateFormat 使用
?
import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class Demo {public static void main(String[] args) {DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss SSS");String s = df.format(new Date());//String s = df.format(343423);System.out.println(s);} }?
calendar使用
import java.util.Calendar; public class Demo {public static void main(String[] args) {Calendar c = Calendar.getInstance();int year = c.get(Calendar.YEAR);int day = c.get(Calendar.DAY_OF_MONTH);int day1 = c.get(Calendar.DAY_OF_YEAR);System.out.println(year+","+day+","+day1);} }Date 使用
import java.util.Date; public class Demo {public static void main(String[] args) {Date d = new Date();System.out.println(d); //Thu Apr 11 14:07:40 CST 2019} }
?Comparable:
使用Comparable接口實現(xiàn)對象之間排序
package com.zy; import java.util.Arrays; public class Demo {public static void main(String[] args) {Dog[] dog = {new Dog("花花",40),new Dog("天天",20)};Arrays.sort(dog);System.out.println(Arrays.toString(dog));} }class Dog implements Comparable<Dog>{private String name;private int age;public Dog(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic String toString() {return "Dog [name=" + name + ", age=" + age + "]";}@Overridepublic int compareTo(Dog o) {// TODO Auto-generated method stubreturn this.age-o.age;} }如果對源碼不修改的話使用:Comparator接口
package com.zy; import java.util.Arrays; import java.util.Comparator; public class Demo {public static void main(String[] args) {Dog[] dog = {new Dog("花花",40),new Dog("天天",20)};Arrays.sort(dog,new DogComparator());System.out.println(Arrays.toString(dog));} }class Dog{private String name;private int age;public Dog(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic String toString() {return "Dog [name=" + name + ", age=" + age + "]";}public int getAge() {return age;} }class DogComparator implements Comparator<Dog>{@Overridepublic int compare(Dog o1, Dog o2) {return o1.getAge()-o2.getAge();}}
?cloneable接口:
對象的克隆
import java.util.Arrays; import java.util.Comparator; public class Demo {public static void main(String[] args) {Dog dog1 = new Dog("花花",10);try {Dog dog2 = (Dog) dog1.clone();System.out.println(dog1);System.out.println(dog2);} catch (CloneNotSupportedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} }class Dog implements Cloneable{private String name;private int age;public Dog(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic String toString() {return "Dog [name=" + name + ", age=" + age + "]";}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();} }
?數(shù)字處理:
import java.math.BigDecimal; import java.math.BigInteger; import java.util.Arrays; public class Demo {public static void main(String[] args) {//大整數(shù)運算String v1 = "8242343242343";String v2 = "3242432424342";BigInteger b1 = new BigInteger(v1);BigInteger b2 = new BigInteger(v2);System.out.println(b1.add(b2));System.out.println(b1.subtract(b2)); //減法System.out.println(b1.multiply(b2));System.out.println(b1.divide(b2)); //取余(/)System.out.println(b1.remainder(b2)); //取模(%)System.out.println(Arrays.toString(b1.divideAndRemainder(b2))); //返回一個數(shù)組//小數(shù)運算String v3 = "713.123213123";String v4 = "2";BigDecimal b3 = new BigDecimal(v3); BigDecimal b4 = new BigDecimal(v4);System.out.println(b3.add(b4));System.out.println(b3.subtract(b4)); //減法System.out.println(b3.multiply(b4));System.out.println(b3.divide(b4)); //取余(/)可能會報錯。原因除不盡} }數(shù)字格式化
import java.text.DecimalFormat; public class Demo {public static void main(String[] args) {double x = 423.64634324;//測試結果 #和0 的結果一樣System.out.println(new DecimalFormat("0").format(x)); //424; 取整數(shù)(四舍五入)System.out.println(new DecimalFormat("0.00").format(x)); //42364.63;保留兩位有效數(shù)字(四舍五入)System.out.println(new DecimalFormat("0.00%").format(x)); //42364.63%System.out.println(new DecimalFormat("#").format(x)); //424;保留全部整數(shù),和0效果一樣System.out.println(new DecimalFormat("#.##").format(x)); //42364.63System.out.println(new DecimalFormat("#.##%").format(x)); //42364.63%//區(qū)別System.out.println(new DecimalFormat("000000").format(x)); //000424System.out.println(new DecimalFormat("######").format(x)); //424long t = 2324324;System.out.println(new DecimalFormat("000,000").format(t)); //2,324,324System.out.println(new DecimalFormat("###,###").format(t)); //2,324,324} }
?MD5加密:
需要配合Base64使用,加密成Base64字符串格式
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Base64; public class Demo {public static void main(String[] args) {try {MessageDigest md = MessageDigest.getInstance("MD5");String password = "qwert";byte[] bytes = md.digest(password.getBytes()); //md5加密后變成了數(shù)組的格式String str = Base64.getEncoder().encodeToString(bytes);//通過Base64加密成字符串System.out.println(str); //o4S2Rj/CFqX47LZnD4ZFag==} catch (NoSuchAlgorithmException e) {e.printStackTrace();}} }生成哈希值
public class T {public static void main(String[] args) {try {MessageDigest md = MessageDigest.getInstance("MD5");md.update("sss".getBytes());// digest()最后確定返回md5 hash值,返回值為8位字符串。因為md5 hash值是16位的hex值,實際上就是8位的字符// BigInteger函數(shù)則將8位的字符串轉換成16位hex值,用字符串來表示;得到字符串形式的hash值//一個byte是八位二進制,也就是2位十六進制字符(2的8次方等于16的2次方)String s = new BigInteger(1, md.digest()).toString(16);System.out.println(s);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}} }maven中依賴的一個jar包(具體不太清楚了)
DigestUtils.md5DigestAsHex("1111".getBytes())?jar包:?http://maven.ibiblio.org/maven2/commons-codec/commons-codec/1.6/
System.out.println(DigestUtils.md5Hex("111".getBytes()))
?lambda表達式:
lambda表達式的實現(xiàn):說明了java承認函數(shù)式編程
如果需求是定義了一個接口,需要創(chuàng)建該接口的實現(xiàn)類,重寫接口的方法,而lambda可以簡化了這種寫法
lambda 不會生成class文件
接口只能有一個(抽象方法)-->函數(shù)式接口
1.8之后默認方法可以加,靜態(tài)方法可以添加
public class Demo {public static void main(String[] args) { //無參使用Test t = ()->{System.out.println("嗨");};t.eat();//有參使用 String x 中String可以省略Test2 t2 = (String x)->{System.out.println("我是"+x);};t2.eat("小名");//待返回值Test3 t3 = ()->{System.out.println("Test3");return 10;};t3.eat();//可以簡寫,如果只有一句代碼,就是返回值的話;直接簡寫即可,不能加return,如果加return必須加上{}Test3 t4 = ()->10;System.out.println(t4.eat());} } interface Test{public void eat();//只能有一個接口 } interface Test2{public void eat(String x);//只能有一個接口 } interface Test3{public int eat();//只能有一個接口 }?
四大基礎函數(shù)接口
函數(shù)接口,你可以理解為對一段行為的抽象,簡單點說可以在方法就是將一段行為作為參數(shù)進行傳遞,這個行為呢,可以是一段代碼,也可以是一個方法,那你可以想象在java8之前要將一段方法作為參數(shù)傳遞只能通過匿名內(nèi)部類來實現(xiàn),而且代碼很難看,也很長,函數(shù)接口就是對匿名內(nèi)部類的優(yōu)化。
??雖然類庫中的基本函數(shù)接口特別多,但其實總體可以分成四類,就好像阿拉伯數(shù)字是無限多的,但總共就10個基本數(shù)字一樣,理解了這4個,其他的就都明白了。
?
?
1、Customer接口
Consumer?接口翻譯過來就是消費者,顧名思義,該接口對應的方法類型為接收一個參數(shù),沒有返回值,可以通俗的理解成將這個參數(shù)'消費掉了',一般來說使用Consumer接口往往伴隨著一些期望狀態(tài)的改變或者事件的發(fā)生,例如最典型的forEach就是使用的Consumer接口,雖然沒有任何的返回值,但是卻向控制臺輸出了語句。
示例1:
import java.util.ArrayList; import java.util.List;public class Test {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("7");list.add("2");list.add("3");//list.forEach((String s)->{System.out.println(s);});list.forEach(s->System.out.println(s));//簡寫list.forEach(System.out::println); //另一個中寫法,‘::’表示調(diào)用方法,此時的調(diào)用println方法,將s傳進去} }示例2
?
public static void main(String[] args) {Consumer<String> printString = s -> System.out.println(s);printString.accept("helloWorld!");//控制臺輸出 helloWorld!}?
2、Function接口
Function<T,R>
Funtion接口是對接受一個T類型參數(shù),返回R類型的結果的方法的抽象,通過調(diào)用apply方法執(zhí)行內(nèi)容。
示例1;
public class Test {public static void main(String[] args) {functiontest();} public static void functiontest(){String x = strToUpper("dfs", s->s.toUpperCase()); //{s.toUpperCase();}不能這樣寫System.out.println(x);}public static String strToUpper(String str,Function<String, String> f){return f.apply(str);} }示例2
?
public class Operation{/* 下面這個方法接受一個int類型參數(shù)a,返回a+1,符合我上面說的接受一個參數(shù),返回一個值所以呢這個方法就符合Function接口的定義,那要怎么用呢,繼續(xù)看例子 */ public static final int addOne(int a){return a+1; }/* 該方法第二個參數(shù)接受一個function類型的行為,然后調(diào)用apply,對a執(zhí)行這段行為 */ public static int oper(int a, Function<Integer,Integer> action){return action.apply(a); }/* 下面調(diào)用這個oper方法,將addOne方法作為參數(shù)傳遞 */ pulic static void main(String[] args){int x = 1;int y = oper(x,x -> addOne(x));//這里可以換成方法引用的寫法 int y = oper(x,Operation::addOne)System.out.printf("x= %d, y = %d", x, y); // 打印結果 x=1, y=2/* 當然你也可以使用lambda表達式來表示這段行為,只要保證一個參數(shù),一個返回值就能匹配 */y = oper(x, x -> x + 3 ); // y = 4y = oper(x, x -> x * 3 ); // y = 3 } }?
Supplier接口
Supplier?接口翻譯過來就是提供者,和上面的消費者相反,該接口對應的方法類型為不接受參數(shù),但是提供一個返回值,通俗的理解為這種接口是無私的奉獻者,不僅不要參數(shù),還返回一個值,使用get()方法獲得這個返回值
示例1:
import java.util.ArrayList; import java.util.List; import java.util.function.Supplier;public class Test {public static void main(String[] args) {suppliertest();} public static void suppliertest(){List li = getNum(10, ()->(int)(Math.random()*100));li.forEach(System.out::println);}public static List<Integer> getNum(int num,Supplier<Integer> sup){List<Integer> list = new ArrayList<>();for(int i=0;i<num;i++){list.add(sup.get()); //表示執(zhí)行了10次sup.get()方法 等于(int)(Math.random()*100)}return list;} }?示例2
?
Supplier<String> getInstance = () -> "HelloWorld!";System.out.println(getInstance.get());// 控偶值臺輸出 HelloWorld?
Predicate接口
predicate<T,Boolean> 謂語接口,顧名思義,中文中的‘是’與‘不是’是中文語法的謂語,同樣的該接口對應的方法為接收一個參數(shù),返回一個Boolean類型值,多用于判斷與過濾,當然你可以把他理解成特殊的Funcation<T,R>,但是為了便于區(qū)分語義,還是單獨的劃了一個接口,使用test()方法執(zhí)行這段行為
示例1:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Predicate;public class Test {public static void main(String[] args) {predicatetest();} public static void predicatetest(){//List<String> list = new ArrayList<>();//list.add("dd");//list.add("ddd");//list.add("ff");List<String> list = Arrays.asList("dd","ddd","ff");List<String> result = filter(list, (s)->s.contains("d"));System.out.println(result);}public static List<String> filter(List<String> list,Predicate<String> p){List<String> result = new ArrayList<>();for(String s:list){if(p.test(s)){ //測試是否符合要求; 需要有參數(shù)sresult.add(s);}}return result;} }示例2
?
public static void main(String[] args) {Predicate<Integer> predOdd = integer -> integer % 2 == 1;System.out.println(predOdd.test(5));//控制臺輸出 true}關于lambda的限制
Java8中的lambda表達式,并不是完全閉包,lambda表達式對值封閉,不對變量封閉。簡單點來說就是局部變量在lambda表達式中如果要使用,必須是聲明final類型或者是隱式的final例如
int num = 123; Consumer<Integer> print = () -> System.out.println(num);就是可以的,雖然num沒有被聲明為final,但從整體來看,他和final類型的變量的表現(xiàn)是一致的,可如果是這樣的代碼
int num = 123; num ++; Consumer<Integer> print = () -> System.out.println(num);則無法通過編譯器,這就是對值封閉(也就是棧上的變量封閉)
如果上文中的num是實例變量或者是靜態(tài)變量就沒有這個限制。
看到這里,自然而然就會有疑問為什么會這樣?或者說為什么要這么設計。理由有很多,例如函數(shù)的不變性,線程安全等等等,這里我給一個簡單的說明
- 為什么局部變量會有限制而靜態(tài)變量和全局變量就沒有限制,因為局部變量是保存在棧上的,而眾所周知,棧上的變量都隱式的表現(xiàn)了它們僅限于它們所在的線程,而靜態(tài)變量與實例變量是保存在靜態(tài)區(qū)與堆中的,而這兩塊區(qū)域是線程共享的,所以訪問并沒有問題。
- 現(xiàn)在我們假設如果lambda表達式可以局部變量的情況,實例變量存儲在堆中,局部變量存儲在棧上,而lambda表達式是在另外一個線程中使用的,那么在訪問局部變量的時候,因為線程不共享,因此lambda可能會在分配該變量的線程將這個變量收回之后,去訪問該變量。所以說,Java在訪問自由局部變量時,實際上是在訪問它的副本,而不是訪問原始變量。如果局部變量僅僅賦值一次那就沒有什么區(qū)別了。
- 嚴格保證這種限制會讓你的代碼變得無比安全,如果你學習或了解過一些經(jīng)典的函數(shù)式語言的話,就會知道不變性的重要性,這也是為什么stream流可以十分方便的改成并行流的重要原因之一。
?
?
Stream接口? (1.8 之后的新特性)
import java.util.stream.Stream;public class Test {public static void main(String[] args) {Stream<String> stream = Stream.of("good","good","study","day","day","up");//foreach//stream.forEach((s)->System.out.println(s)); //結束操作,不返任何東西//filter 過濾//stream.filter(s->s.length()>3).forEach(System.out::println);//中間操作;filter返回一個stream;//distinct//stream.distinct().forEach(System.out::println); //去重,中間操作//map,實現(xiàn)了Function接口,Function接口是需要傳遞一個函數(shù);每一個元素都需要執(zhí)行這個函數(shù);然后生成一個新的集合//stream.map((s)->s.toUpperCase()).forEach(System.out::println);//reduce,steam中的兩個元素進行操作//Optional<String> op = stream.reduce((s1,s2)->s1.length()>s2.length()?s1:s2);//Optional<String> op = stream.reduce((s1,s2)->s1+s2);//System.out.println(op.get());//collect 將stream轉化成數(shù)組;//List<String> list = stream.collect(Collectors.toList());//list.forEach(System.out::println);//flatMap可以合并多和流;//Stream<List<Integer>> ss = Stream.of(Arrays.asList(1,2,3),Arrays.asList(4,5));//ss.flatMap(list->list.stream()).forEach(System.out::println);} }@FunctionalInterface函數(shù)式接口注解
1、該注解只能標記在”有且僅有一個抽象方法”的接口上。
2、JDK8接口中的靜態(tài)方法和默認方法,都不算是抽象方法。
3、接口默認繼承Java.lang.Object,所以如果接口顯示聲明覆蓋了Object中方法,那么也不算抽象方法。
4、該注解不是必須的,如果一個接口符合”函數(shù)式接口”定義,那么加不加該注解都沒有影響。加上該注解能夠更好地讓編譯器進行檢查。如果編寫的不是函數(shù)式接口,但是加上了@FunctionInterface,那么編譯器會報錯。
// 正確的函數(shù)式接口 @FunctionalInterface public interface TestInterface { // 抽象方法 public void sub(); // java.lang.Object中的方法不是抽象方法 public boolean equals(Object var1); // default不是抽象方法 public default void defaultMethod(){ } // static不是抽象方法 public static void staticMethod(){ } }
?RandomAccessFile:
只可以對文件進行操作,當模式為r,文件不存在會報錯,當模式為rw,文件不存在會自動創(chuàng)建文件,文件存在不會覆蓋原文件;
對文件進行寫入操作是,必須有r模式,只有先有讀的權限,才能有寫的權限(rw)
示例:復制文件
import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile;public class Demo {public static void main(String[] args) throws IOException{run();}public static void run(){try {RandomAccessFile rf = new RandomAccessFile("C:\\Users\\zhengyan\\Desktop\\test1\\all.jpg", "r");RandomAccessFile wf = new RandomAccessFile("C:\\Users\\zhengyan\\Desktop\\test1\\new_all.jpg", "rw");byte bytes[] = new byte[1024];int len=-1;while((len=rf.read(bytes))!=-1){wf.write(bytes,0,len);}System.out.println("復制成功");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} }
?Properties:
使用環(huán)境:當代碼已經(jīng)上傳的服務器后,如果需要對參數(shù)進行修改,而不需要對源代碼重新編譯,就會利用到配置文件,對配置文件進行修改,是不需要對源代碼重新編譯的
源代碼--->編譯(.class文件)--->打包上傳到服務器
1、創(chuàng)建config.properties配置文件
username=admin password=1232、代碼
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Properties;public class Demo {private static String username;private static String password;public static void main(String[] args) throws IOException{readConfig();System.out.println(Demo.username);System.out.println(Demo.password);writeConfig("小明", "123456");//對配置文件寫入操作readConfig();System.out.println(Demo.username);System.out.println(Demo.password);}public static void readConfig(){Properties p = new Properties();try {//InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("com\\zy\\config.properties"); //是有問題的InputStream inStream = new FileInputStream("src\\com\\zy\\config.properties");p.load(inStream);username = p.getProperty("username");password = p.getProperty("password");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static void writeConfig(String username,String password){Properties p = new Properties();p.put("username", username);p.put("password", password);try {OutputStream out = new FileOutputStream("src\\com\\zy\\config.properties");p.store(out, "updata config"); //updata config是描述信息out.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} }
?StringUtils:
需要引入這個jar包
isBlank:“? ?”:false
isEmpty:“? ” :true
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId> </dependency>
轉載于:https://www.cnblogs.com/yanxiaoge/p/10650926.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java----java工具包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JenKins使用pm2部署.net c
- 下一篇: 量子计算是什么领域 是量子科技的多种应用