java----java工具包
- System:
- Runtime:
- Random:
- Scanner:
- Arrays:
- MessageFormat:
- Math:
- 日期:
- Comparable:
- cloneable接口:
- 数字处理:
- MD5加密:
- lambda表达式:
- RandomAccessFile:
- Properties:
- StringUtils:
System:
System.out.println(System.currentTimeMillis());//从1970年开始,打印时间戳格式的时间
System.exit(0);//0表示正常对出
Runtime:
Runtime rt = Runtime.getRuntime();
System.out.println("处理器数量:"+rt.availableProcessors());
System.out.println("JVM总内存数:"+rt.totalMemory());
System.out.println("JVM空闲内存数:"+rt.freeMemory());
System.out.println("JVM可用最大内存数:"+rt.maxMemory());try {rt.exec("notepad"); //调用其他的应用程序
} catch (IOException e) {e.printStackTrace();
}
Random:
生成随机数
import java.util.Random;
public class Demo {public static void main(String[] args){Random r = new Random();//如果给一个固定的数字,则生成的随机数不变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("输入一个整数")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); //使用这个方法之前必须手动对数据进行排序。否则可能返回(-2):表示为找到System.out.println(index);}
}
原样返回一个数组
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:可以实现自定义排序
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));}
}
数组的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); //实现方式为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 进行数组的复制
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));}
}
判断两个数组是否相等
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));}
}
填充数组
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; //静态导入
public class Demo {public static void main(String[] args) {System.out.println(Math.abs(-1)); //去绝对值System.out.println(Math.random());//取(0,1)的double数System.out.println(Math.round((Math.random()*100)));//将一个double数取整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接口实现对象之间排序
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();}
}
数字处理:
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Arrays;
public class Demo {public static void main(String[] args) {//大整数运算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))); //返回一个数组//小数运算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)); //取余(/)可能会报错。原因除不尽}
}
数字格式化
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; 取整数(四舍五入)System.out.println(new DecimalFormat("0.00").format(x)); //42364.63;保留两位有效数字(四舍五入)System.out.println(new DecimalFormat("0.00%").format(x)); //42364.63%System.out.println(new DecimalFormat("#").format(x)); //424;保留全部整数,和0效果一样System.out.println(new DecimalFormat("#.##").format(x)); //42364.63System.out.println(new DecimalFormat("#.##%").format(x)); //42364.63%//区别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加密后变成了数组的格式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函数则将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表达式的实现:说明了java承认函数式编程
如果需求是定义了一个接口,需要创建该接口的实现类,重写接口的方法,而lambda可以简化了这种写法
lambda 不会生成class文件
接口只能有一个(抽象方法)-->函数式接口
1.8之后默认方法可以加,静态方法可以添加
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();//只能有一个接口
}
四大基础函数接口
函数接口,你可以理解为对一段行为的抽象,简单点说可以在方法就是将一段行为作为参数进行传递,这个行为呢,可以是一段代码,也可以是一个方法,那你可以想象在java8之前要将一段方法作为参数传递只能通过匿名内部类来实现,而且代码很难看,也很长,函数接口就是对匿名内部类的优化。
虽然类库中的基本函数接口特别多,但其实总体可以分成四类,就好像阿拉伯数字是无限多的,但总共就10个基本数字一样,理解了这4个,其他的就都明白了。
1、Customer接口
Consumer 接口翻译过来就是消费者,顾名思义,该接口对应的方法类型为接收一个参数,没有返回值,可以通俗的理解成将这个参数'消费掉了',一般来说使用Consumer接口往往伴随着一些期望状态的改变或者事件的发生,例如最典型的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); //另一个中写法,‘::’表示调用方法,此时的调用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类型参数,返回R类型的结果的方法的抽象,通过调用apply方法执行内容。
示例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类型参数a,返回a+1,符合我上面说的接受一个参数,返回一个值所以呢这个方法就符合Function接口的定义,那要怎么用呢,继续看例子
*/
public static final int addOne(int a){return a+1;
}/* 该方法第二个参数接受一个function类型的行为,然后调用apply,对a执行这段行为
*/
public static int oper(int a, Function<Integer,Integer> action){return action.apply(a);
}/* 下面调用这个oper方法,将addOne方法作为参数传递 */
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表达式来表示这段行为,只要保证一个参数,一个返回值就能匹配 */y = oper(x, x -> x + 3 ); // y = 4y = oper(x, x -> x * 3 ); // y = 3
}
}
Supplier接口
Supplier 接口翻译过来就是提供者,和上面的消费者相反,该接口对应的方法类型为不接受参数,但是提供一个返回值,通俗的理解为这种接口是无私的奉献者,不仅不要参数,还返回一个值,使用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()); //表示执行了10次sup.get()方法 等于(int)(Math.random()*100)}return list;}
}
示例2
Supplier<String> getInstance = () -> "HelloWorld!";System.out.println(getInstance.get());// 控偶值台输出 HelloWorld
Predicate接口
predicate<T,Boolean> 谓语接口,顾名思义,中文中的‘是’与‘不是’是中文语法的谓语,同样的该接口对应的方法为接收一个参数,返回一个Boolean类型值,多用于判断与过滤,当然你可以把他理解成特殊的Funcation<T,R>,但是为了便于区分语义,还是单独的划了一个接口,使用test()方法执行这段行为
示例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)){ //测试是否符合要求; 需要有参数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类型的变量的表现是一致的,可如果是这样的代码
int num = 123;
num ++;
Consumer<Integer> print = () -> System.out.println(num);
则无法通过编译器,这就是对值封闭(也就是栈上的变量封闭)
如果上文中的num是实例变量或者是静态变量就没有这个限制。
看到这里,自然而然就会有疑问为什么会这样?或者说为什么要这么设计。理由有很多,例如函数的不变性,线程安全等等等,这里我给一个简单的说明
- 为什么局部变量会有限制而静态变量和全局变量就没有限制,因为局部变量是保存在栈上的,而众所周知,栈上的变量都隐式的表现了它们仅限于它们所在的线程,而静态变量与实例变量是保存在静态区与堆中的,而这两块区域是线程共享的,所以访问并没有问题。
- 现在我们假设如果lambda表达式可以局部变量的情况,实例变量存储在堆中,局部变量存储在栈上,而lambda表达式是在另外一个线程中使用的,那么在访问局部变量的时候,因为线程不共享,因此lambda可能会在分配该变量的线程将这个变量收回之后,去访问该变量。所以说,Java在访问自由局部变量时,实际上是在访问它的副本,而不是访问原始变量。如果局部变量仅仅赋值一次那就没有什么区别了。
- 严格保证这种限制会让你的代码变得无比安全,如果你学习或了解过一些经典的函数式语言的话,就会知道不变性的重要性,这也是为什么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,实现了Function接口,Function接口是需要传递一个函数;每一个元素都需要执行这个函数;然后生成一个新的集合//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转化成数组;//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函数式接口注解
1、该注解只能标记在”有且仅有一个抽象方法”的接口上。
2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。
3、接口默认继承Java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
4、该注解不是必须的,如果一个接口符合”函数式接口”定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
// 正确的函数式接口
@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,文件不存在会自动创建文件,文件存在不会覆盖原文件;
对文件进行写入操作是,必须有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:
使用环境:当代码已经上传的服务器后,如果需要对参数进行修改,而不需要对源代码重新编译,就会利用到配置文件,对配置文件进行修改,是不需要对源代码重新编译的
源代码--->编译(.class文件)--->打包上传到服务器
1、创建config.properties配置文件
username=admin
password=123
2、代码
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
java----java工具包相关推荐
- 2017可以兼容那些jdk_2019从头跃——核心基础:何为JDK?Java开发工具包须知总览...
摘要:JDK是构建Java应用程序的关键平台组件. 其核心是Java编译器. 1.导引 Java Development Kit(JDK)是Java编程中使用的三个核心技术包之一,相伴随的另两个是JV ...
- java开发可重用代码包工具包_[Java教程]彻底搞懂Java开发工具包(JDK)安装及环境变量配置...
[Java教程]彻底搞懂Java开发工具包(JDK)安装及环境变量配置 0 2021-01-04 04:00:04 安装并配置JDK环境变量,不但要知道怎样做,也要知道为什么这样做,知其然知其所以然. ...
- 此安装程序必须使用 java 开发工具包 (jdk) 执行_彻底搞懂Java开发工具包(JDK)安装及环境变量配置...
[官方正版]java jdk 9学习笔记 78.4元 包邮 (需用券) 去购买 > 一.Java 和 JDK 是什么 Java:Java是一种优秀的程序设计语言,它有非常多的语言特性,如简单性. ...
- java apache commons_Apache commons(Java常用工具包)简介
Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...
- 【Java基础1】Java开发工具包JDK
文章目录 JavaSE.JDK和JRE有什么区别? Java包的主要内容有哪些? JDK和OpenJDK有什么区别? JavaSE.JDK和JRE有什么区别? Java Development K ...
- java项目中没有jdk包_彻底搞懂Java开发工具包(JDK)安装及环境变量配置
一.Java 和 JDK 是什么 Java:Java是一种优秀的程序设计语言,它有非常多的语言特性,如简单性.面向对象.可移植性等.Java 并不只是一种语言,而是一个完整的平台,它有一个庞大的库,其 ...
- java开发工具包 jdk_什么是JDK? Java开发工具包简介
java开发工具包 jdk Java开发工具包(JDK)与JVM(Java虚拟机)和JRE(Java运行时环境)一起是Java编程中使用的三个核心技术软件包之一. 重要的是要区分这三种技术,并了解它们 ...
- 【解决】Java开发工具包(JDK)目录未设置或无效。请在“首选项“>“外部工具“中将其修复
游戏引擎:Unity 版本:2019.4.6f1 [2017版本以上均可] 编译平台:Visual Studio 2019 问题截图 问题描述 Java开发工具包目录未设置或无效.请在"首选 ...
- 初学Java--JDK(java development kit java 开发工具包)的下载与安装教程
初学Java–JDK(java development kit java 开发工具包)的下载与安装教程 1. 下载安装包 点开链接可以找到JDK的版本安装界面 可以看到如下图所示的界面: 下面是我选择 ...
- Java反射工具包reflections
文章目录 1. 简介 2. maven 3. 配置 4. 通过类型扫描 5. 通过注解扫描 6. 方法相关 7. 工具类 8. 资料文档 1. 简介 reflections是一个Java反射工具包,使 ...
最新文章
- .NET4.0并行计算技术基础(8)
- 消息中间件—RocketMQ的RPC通信(二
- 【组合数学】生成函数 ( 生成函数示例 | 给定通项公式求生成函数 | 给定生成函数求通项公式 )
- 如何在Ubuntu 14.04中使用Samba共享文件
- 系统相机裁剪比例_从单反到手机,三种黄金比例构图方法,让你的照片与众不同...
- 针对新手的Java EE7和Maven项目–第5部分–使用Arquillian / Wildfly 8进行单元测试
- Eclipse无法查看Servlet源代码的解决方案
- 已知s=1×2×3×…×n,计算出s不大于5000时n的最大值。
- 基于FFmpeg的Qt视频播放器
- 多选框取值和默认勾选
- 发布一款小软件:和讯博客助手-新闻采集测试版- 0.2.0
- 2014,为了梦想宁愿破釜沉舟
- jquery省份城市联动选择下拉框
- 视频播放–AVPlayer
- 台式计算机的主流配置,台式机主流配置型号参数
- linux系统编程之网络编程
- c语言程序学生籍贯信息记录,C语言程序设计学生籍贯信息记录簿
- 数据结构之完全二叉树
- 学习笔记69—金蝶财务软件安装教程(KIS12.3,win10)
- 计算机应用设计大赛获奖信息,北京大学第六届“计算机应用设计大赛”圆满落幕...
热门文章
- gorm查询降序排列
- linux diff diffstat组合使用示例
- Hadoop集群添加新节点正确操作步骤
- Oracle不带传出参数的存储过程创建及调用
- 安装python的twisted_如何在Python3.5上安装 Twisted(为了Scrapy)
- 多序列比对的c语言程序,多序列比对的实际应用
- Spring 框架所有版本大集合下载
- Qt QML页面翻转控件封装
- 很酷的word技巧---删除行前的空格
- NFS mount failed, reason given by server: Permission denied ---nfs挂载失败