首页
书籍
统计
友链
Search
1
wlop 4K 壁纸 4k8k 动态 壁纸
450 阅读
2
Docker搭建Typecho博客
384 阅读
3
keytool证书导入
295 阅读
4
JAVA IO
291 阅读
5
SpringBoot整合SpringCache
263 阅读
解决方案
JAVA基础
JVM
多线程
开源框架
数据库
前端
分布式
框架整合
中间件
容器部署
设计模式
数据结构与算法
开发工具
百度网盘资源
天翼网盘资源
阿里网盘资源
登录
Search
标签搜索
java
javase
java8
docker
springboot
thread
spring
分布式
锁
mysql
linux
redis
源码
typecho
map
lambda
stream
nginx
centos
software
少年
累计撰写
169
篇文章
累计收到
9
条评论
首页
栏目
解决方案
JAVA基础
JVM
多线程
开源框架
数据库
前端
分布式
框架整合
中间件
容器部署
设计模式
数据结构与算法
开发工具
百度网盘资源
天翼网盘资源
阿里网盘资源
页面
书籍
统计
友链
搜索到
53
篇与
java
的结果
2022-02-28
JAVA基础(第二篇)
JAVA流程控制语句JAVA中非常重要的基础知识点务必完全理解掌握,总结记录一下之前学习笔记。JAVA流程控制语句是编程的基础知识,主要是为了更好的组织代码的执行流程,下面将详细介绍java流程控制语句。一、选择结构ifif条件语句分为三种格式。if语句如果满足某种条件就执行。if语句格式:if(条件){ 语句的执行体 }条件:结果必须是布尔类型 1==1 true || false 执行体:当id条件为true的时候,执行大括号中的语句,否则什么都不做。例如:/** * if语句例子 */ public class IfDemo { public static void main(String[] args) { // TODO Auto-generated method stub int i = 5; if(i==5) { System.out.println("if中的条件是true"); i++; } System.out.println("i="+i); } }**注意:if()括号后面没有分号";"** if...else语句如果满足某种条件,就执行某种处理,否则就执行另一种处理。if ... else语法格式:if(条件){ if的执行体 }else{ else的执行体 }当if中的条件为true时,执行if的执行体,为false时,执行else的执行体。例如:** * if ... else 语句 * */ public class IfElseDemo { public static void main(String[] args) { int i = 13; if(i%2==0) { System.out.println(i+"是偶数"); }else { System.out.println(i+"是奇数"); } } }if...else if...else语句用于多条件进行判断,进行多种不同的处理。语句格式:if(条件1){ 执行语句1 }else if(条件2){ 执行语句2 } ... else if(条件n){ 执行语句n }else{ 执行语句n+1 }当判断条件1为true时,if后面{}中的执行语句1会执行。当判断条件1为false时,会继续执行判断条件2,如果为true则执行语句2,以此类推,如果所有的判断条件都为false,则意味着所有条件均未满足,else后面{}中的执行语句n+1会执行。注意:条件最后都是boolean值,要么true要么false。 例如: package java_learn_code; import java.util.Scanner; /** * if...else if...else * 多条件判断 */ public class IfElseIfElseDemo { public static void main(String[] args) { while(true) { System.out.print("请输入分数:"); Scanner scan = new Scanner(System.in); double sum = scan.nextDouble(); if(sum<90) { System.out.print("可以哦"); }else if(sum <=80) { System.out.println("合格"); }else if(sum <=60){ System.out.println("不及格"); }else { System.out.println("分数有问题"); } System.out.println(""); } } }注意:if...else只能进行单条件判断,而if...else if...else可以进行多条件进行判断了。if..else也可以实现,但是效率没有if..else .. if ... else效率高。二、三元运算符三元运算符得到一个结果,通常用于对某个变量进行赋值,当判断条件成立时,运算结果为表达式1的值,否则结果为表达式2的值。三元运算符和if...else类似,语法如下:判断条件 ? 表达式1 : 表达式2例如:package java_learn_code; /** * if..else 与三元运算符的转换 */ public class IfAllDemo { public static void main(String[] args) { int m = 10; int n = 8; //if...else运算 if(m>n) { System.out.println(m); }else { System.out.println(n); } //三元运算符运算 System.out.println(m>n ? m : n); } }注意:如果判断条件比较多,使用三元运算符,是必须有结果的,而if语句可以没有结果的。三、循环语句whilewhile语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会执行,直到条件不成立,while循环结束。while循环语句的语法结构:while(循环条件){ 执行语句 ……… }说明:{}中的执行语句被称作循环体,循环体是否执行取决于循环条件。当循环条件为true时,循环体就会执行。循环体执行完毕时会继续判断循环条件,如条件仍为true则会继续执行,直到循环条件为false时,整个循环过程才会结束。例如:/** * while循环语句 */ public class WhileDemo { public static void main(String[] args) { int i = 0; while(i<5) { System.out.println("i="+i); i++; } } }注意:i++用于在每次循环时改变变量i的值,从而达到最终改变循环条件的目的。如果没有这行代码,整个循环会进入无限循环的状态,永远不会结束。四、循环语句for语法格式:for(初始化表达式; 循环条件; 操作表达式){ 执行语句 ……… }说明:初始化变量:定义变量,用于控制循环的次数。条件:当条件是true的时候,执行循环体,为false时,结束循环。增量:变量自增情况/** * for循环 * @author Jole * */ public class ForDemoOne { public static void main(String[] args) { //1、变量 2、条件 3、增量 for(int i=0;i<5;i++) { System.out.println("i="+i); //两大括号之间:4、循环体 } } }执行过程:第一步:变量定义i,在整个循环中,只会执行一次(int i=0,在整个过程中至执行一次)。 第二步:如果条件为false,整个循环就结束了。 第三步:如果为true时,执行循环体。 第四步:增量,i++ 第五步:重复走条件(第二步或第三步) 后面继续循环 注意:int i=0;终其一生只运行一次。条件为false时,不会在走增量,而是直接结束了注意:int i=0;终其一生只运行一次。条件为false时,不会在走增量,而是直接结束了。分析for循环的执行流程:for(1 ; 2 ; 3){ 4 } 第一步,执行1 第二步,执行2,如果判断结果为true,执行第三步,如果判断结果为false,执行第五步 第三步,执行4 第四步,执行3,然后重复执行第二步 第五步,退出循环注意事项:1、初始化表达式、循环条件和操作表达式,它们之间用“;”分隔,{}中的执行语句为循环体。 2、int i=0;终其一生只运行一次。 3、条件为false时,不会在走增量i++,而是直接结束了。实例:用for循环进行累加求和。1+2+3+4...+100=?/** * 用for循环进行累加求和,1+2+3+4...+100=? */ public class ForSum { public static void main(String[] args) { int sum = 0; for(int i=1;i<=100;i++) { sum += i; } System.out.println("sum="+sum); } }五、do...while()循环do…while循环语句和while循环语句功能类似。语法格式:do { 执行语句 ……… } while(循环条件);说明:关键字do后面{}中的执行语句是循环体。do…while循环语句将循环条件放在了循环体的后面。意味着,循环体会无条件执行一次,然后再根据循环条件来决定是否继续执行。public class DowhileDemo { public static void main(String[] args) { int i = 1; do { i++; }while(i<0); System.out.println("i="+i); } }注意:无论条件是否成立,都会执行一次循环体。do …while循环和while循环能实现同样的功能,区别在于,如果循环条件在循环语句开始时就不成立,那么while循环的循环体一次都不会执行,而do…while循环的循环体还是会执行一次。(无论条件是否成立,do...while都会执行一次循环体)六、死循环(无限循环)最简单无限循环格式:while(true){} 或 for(;;){}注意:无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。/** * while、for死循环 */ public class DeadDemo { public static void main(String[] args) { //while死循环 while(true) { } //for死循环(注意:上面的while死循环,这个for死循环不会执行) for( ;true ; ) { } } }注意:上面的while死循环,这个for死循环不会执行。七、循环嵌套嵌套循环是指在一个循环语句的循环体中再定义一个循环语句的语法结构。while、do…while、for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套。在for循环中嵌套for循环,格式如下:for(初始化表达式; 循环条件; 操作表达式) { ……… for(初始化表达式; 循环条件; 操作表达式) { 执行语句 ……… } ……… }嵌套循环的执行顺序:public class ForForDemoTwo { public static void main(String[] args) { for(int i = 0;i < 2;i++) { for(int j = 0; j<2 ;j++) { } } } }执行顺序说明:1.i=0 2.i<2 3.执行循环体j=0 4.j<2 5.执行内循环的循环体 6.j++ 1 7.j<2 8.执行内循环的循环体 9.j++ 10.j<2 内循环结束 11.外循环的增量i++ 1 12.i<2 执行3到10步骤 13.外循环的增量i++ 2 14.i<2注意:循环次数=外循环次数*内循环次数。内循环是外循环的一个循环体。嵌套循环:主要是理解执行顺序实例:打印三角形public class ForForDemo { public static void main(String[] args) { for(int i=1;i<=5;i++) { for(int j=1;j<i;j++) { System.out.print("* "); } System.out.println("*"); } } }输出结果:***** ### 八、跳转语句(break、continue) **跳转语句用于实现循环执行过程中程序流程的跳转,在Java中的跳转语句有break语句和continue语句。** 1. **break语句** 1、在switch条件语句和循环语句中都可以使用break语句。当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。 2、当它出现在循环语句中,作用是跳出循环语句,执行后面的代码。public class BreakDemo { public static void main(String[] args) { int i=1; while(true) { if(i==3) { break; }else { System.out.println("i="+i); } i++; } }} 输出结果: i=1 i=2 **多循环,break是结束的哪个循环?** public class MostForBreakDemo { public static void main(String[] args) { for(int i=1;i<5;i++) { for(int j=1;j<7;j++) { if(j==4) { break; }else { System.out.print(" j="+j); } } System.out.println(" i="+i); } }} **注意:当break语句出现在嵌套循环中的内层循环时,它只能跳出内层循环,如果想使用break语句跳出外层循环则需要对外层循环添加标记。 标记:当多层循环时,想在内循环结束外循环通过加标记结束。** package java_learn_code; public class MostForBreakDemo { public static void main(String[] args) { a:for(int i=1;i<4;i++) { for(int j=1;j<7;j++) { if(j==4) { break a; }else { System.out.print(" j="+j); } } System.out.println(" i="+i); } }} 输出结果: j=1 j=2 j=3 **switch或循环遇到break就全结束。** 2. **continue语句** **continue语句用在循环语句中,它的作用是终止本次循环,执行下一次循环。** public class ContinueDemo { public static void main(String[] args) { for (int j = 1; j < 7; j++) { if (j == 4) { continue; } else { System.out.print(" j=" + j); } } }} 输出结果: j=1 j=2 j=3 j=5 j=6 多层循环,通过标记,跳过外层其中一次循环。 public class ContinueDemoTwo { public static void main(String[] args) { a:for(int i=1;i<7;i++) { for(int j=1;j<4;j++) { if(i==3) { continue a; }else { System.out.print(" j="+j); } } System.out.println(" i="+i); } }} 输出结果: j=1 j=2 j=3 i=1 j=1 j=2 j=3 i=2 j=1 j=2 j=3 i=4 j=1 j=2 j=3 i=5 j=1 j=2 j=3 i=6 **注意:同样支持标记,跳过某一次循环。** ### 九、综合实例:随机猜数字import java.util.Random; import java.util.Scanner;public class DemoOne { public static void main(String[] args) { while(true) { System.out.print("请输入猜的数字:"); Scanner scan = new Scanner(System.in); int number = scan.nextInt(); Random ran = new Random(); int yourNum = ran.nextInt(10)+1; if(number==yourNum) { System.out.println("恭喜你猜对了,么么哒!"); break; }else if(number>yourNum) { System.out.println("输入的值:"+number); System.out.println("随机值:"+yourNum); System.out.println("sorry....猜大了哦"); }else { System.out.println("输入值:"+number); System.out.println("随机值:"+yourNum); System.out.println("sorry....猜小洛"); } System.out.println(""); } }}### 十、选择结构switch 选择结构switch,switch 条件语句也是一种很常用的选择语句,它和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。 Switch语法格式: switch (表达式){case 目标值1: 执行语句1 break; case 目标值2: 执行语句2 break; ...... case 目标值n: 执行语句n break; default: 执行语句n+1 break;} 说明: switch语句将表达式的值与每个case中的目标值进行匹配,如果找到了匹配的值,会执行对应case后的语句,如果没找到任何匹配的值,就会执行default后的语句。break的作用是跳出switch语句。在switch语句中的表达式只能是byte、short、char、int类型的值,如果传入其它类型的值,程序会报错。 但上述说法并不严谨,实际上在JDK5.0中引入的新特性enum枚举也可以作为switch语句表达式的值,在JDK7.0中也引入了新特性,switch语句可以接收一个String类型的值。 实例:数字转星期public class SwitchDemo {public static void main(String[] args) { boolean flag=true; while(flag) { System.out.print("星期转换:"); Scanner scan = new Scanner(System.in); int num = scan.nextInt(); switch(num) { case 1: System.out.println("星期一"); break; case 2: System.out.println("星期二"); break; case 3: System.out.println("星期三"); break; case 4: System.out.println("星期四"); break; case 5: System.out.println("星期五"); break; case 6: System.out.println("星期六"); break; case 7: System.out.println("星期日"); break; default: flag = false; System.out.println("退出成功!"); } System.out.println(""); } }} Case的穿透性:在使用switch语句的过程中,如果多个case条件后面的执行语句是一样的,则该执行语句只需书写一次即可,这是一种简写的方式。 实例:判断一周中的某一天是否为工作日 import java.util.Scanner;public class SwitchCaseDemo {public static void main(String[] args) { boolean flag=true; while(flag) { System.out.print("星期转换:"); Scanner scan = new Scanner(System.in); int num = scan.nextInt(); switch(num) { case 1: case 2: case 3: case 4: case 5: System.out.println("工作日"); break; case 6: case 7: System.out.println("休息日"); break; default: flag = false; System.out.println("推出成功!"); } System.out.println(""); } }}
2022年02月28日
85 阅读
0 评论
2 点赞
2022-02-27
JAVA基础(第一篇)
总结一下JAVA基础知识如:注释、关键字、标识符、数据类型、变量、数据类型转换等基础语法。初学者可参考看看。1、程序注释单行注释://xxxxxx多行注释:/* xxxxxx */文档注释:/** xxxxxx */2、关键字关键字:是被Java语言赋予特殊含义,具有专门用途的单词。所有的Java关键词,都是小写。关键词比较多,不用刻意去背,以后用多了自己就记住了。3、标识符Java中除了关键字以外基本上都是标识符。我们自己定义的词,比如自己定义的HelloWorld。标志符命名规则:标志符组成:字母、数字、下划线、美元符号 字母:a~z、A~Z 数字:0-9 下划线:_ 美元符号:$注意:不能数字开头,不能是关键字,严格区分大小写,不限制长度起名时,尽量达到见名知意。4、数据类型数据类型分为基本数据类型和引用数据类型。A、基本数据类型:4类8种(4类展开后共8种基本类型),基本数据类型是JAVA中内置的类型。第一类:整型字节byte 1个字节 二进制位数:8 -128~127短整型short 2个字节 二进制位数:16 包装类:java.lang.Short 最小值:Short.MIN_VALUE=-32768 (-2的15此方) 最大值:Short.MAX_VALUE=32767 (2的15次方-1)整型int 4个字节 二进制位数:32 包装类:java.lang.Integer 最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方) 最大值:Integer.MAX_VALUE= 2147483647 (2的31次方-1)长整型long 8个字节 二进制位数:64 包装类:java.lang.Long 最小值:Long.MIN_VALUE=-9223372036854775808 (-2的63次方) 最大值:Long.MAX_VALUE=9223372036854775807 (2的63次方-1)第二类:浮点型单精度float 4个字节 二进制位数:32 包装类:java.lang.Float 最小值:Float.MIN_VALUE=1.4E-45 (2的-149次方) 最大值:Float.MAX_VALUE=3.4028235E38 (2的128次方-1)注意:必须已“F”结尾,java才认为是float类型,否则默认认为是double类型。双精度double 8个字节 二进制位数:64 包装类:java.lang.Double 最小值:Double.MIN_VALUE=4.9E-324 (2的-1074次方) 最大值:Double.MAX_VALUE=1.7976931348623157E308 (2的1024次方-1)注意:必须以“D”结尾,java中默认的浮点类型是double类型。第三类:字符型char 2个字节 二进制位数:16 表示一个字符,如('a','2','家')注意:用单引号包裹起来,并且其中只能包含一个字符,必须填写。一个汉字=2个字节=16位,所以一个中文字符刚好可以装下。第四类:布尔型boolean 1个字节 只有2个值true与false只记基本数据类型的字节数,以及byte取值范围127~-128即可,其它不用记,一般开发中使用int、double、char、boolean。B、引用数据类型:分别是数组、类、接口引用数据是强大的数据类型,它是基于基本数据类型创建的。JavaSE中提供了一个超级类库,类库中包含了近万种引用数据类型。5、常量JAVA中数据量分为常量和变量。常量就是不变的数据量,任何数据量都是有其类型的,常量就是整数类型。整数表示方式有十进制、二进制、十六进制、八进制,它们之间的转换(自行谷歌/百度)。整数常量是byte、short、int、long中的哪种类型呢?整数常量可以根据所在范围来确定类型,java中默认的整数类型是int类型。long类型必须添加“L”后缀,java才知道其类型,不加"L",java会将其当作int类型。默认浮点类型为doule类型。float需要加“F”后缀,double需加“D”后缀。1267:没有L后缀,为int类型,但是超出int范围,会报错。 12L:为long类型. 3.1:没有后缀,所以为double类型。 2.34D:为double类型。 1.45F:为float类型。6、变量Java变量应用最多的。内存数据运行时,临时存储数据的地方。变量就是内存中装载数据的小盒子,只能用来存数据和取数据,数据类型定义了就不能改变了,里面的数据可以变化的。定义变量格式:数据类型 变量名 数据值 int num = 100;注意:变量必须要有明确的类型,什么类型的变量装载什么类型的数据,同时也要指定变量能装载多大的数据。数据值不指定,不能使用,编译时不会报错,但是运行时会报错。变量名必须满足标识符规则,才能作为变量来使用。7、字符串字符串类型,值用""双引号包裹起来,属于引用数据类型。String str = "Hello World";注意:字符串Sring不属于基本数据类型,属于JAVA中的引用类型,但是定义、使用和基本数据类型定义类似。标记一下,后面详细记录String类型8、变量使用注意事项变量定义后可以不赋值,使用时再赋值。不赋值不能使用。错误演示:/** * 变量使用注意事项演示 * 错误演示:变量没有赋值 */ public class ErrorVariable{ public static void main(String[] args){ int i; System.out.println(i); } }输出结果:ErrorVariable.java:9: 错误: 可能尚未初始化变量i System.out.println(i);正确演示:/** * 变量使用注意事项演示 * 正确演示 */ public class CorrectVariable{ public static void main(String[] args){ int i; i = 100; int j = 200; System.out.println(i); System.out.println(j); } }输出结果:100变量是有自己的作用范围,变量的有效范围为:定义的一对大括号内.错误演示:/** * 变量使用注意事项演示 * 错误演示:变量有效范围 */ public class ErrorVariable2{ public static void main(String[] args){ { int i = 100; } System.out.println(i); } }输出结果:ErrorVariable2.java:11: 错误: 找不到符号 System.out.println(i); ^ 符号: 变量 i 位置: 类 ErrorVariable2 1 个错误变量不能重复定义错误演示:/** * 变量使用注意事项演示 * 错误演示:变量不能变量重复定义 */ public class ErrorVariable2{ public static void main(String[] args){ int a = 50; int a = 30; } }输出结果:ErrorVariable3.java:9: 错误: 已在方法 main(String[])中定义了变量 a int a = 30; ^ 1 个错误变量使用总结:1、变量没有赋值不能使用 2、变量有效范围 3、变量不能重复定义9、数据类型代码演示定义Java八种基本数据类型变量/** * 定义Java八种基本数据类型变量。 * 变量只能存一个值,以最后一个值为准。 */ public class DataType{ public static void main(String[] args){ //字节类型(127~-128) 1个字节 byte b = 127; //短整型 2个字节 short s = 128; //整型 4个字节 int i =111111; //长整型 8个字节 long l = 22222222222222L; System.out.println(b); System.out.println(s); System.out.println(i); System.out.println(l); //单精度 4个字节 float f =1.176F; //双精度 8个字节 double d =1.100D; System.out.println(f); System.out.println(d); //字符类型 2个字节 //注意:必须有值,空字符也可以,必须单引号包裹起来。 char c ='6'; //char c2 =''; 这个没有值,会报错。 char c3 =' '; System.out.println(c); System.out.println(c3); //布尔类型 1个字节 只有2个值,true和false boolean boo = true; boolean boo2 = false; System.out.println(boo); System.out.println(boo2); } }输出结果:127 128 111111 22222222222222 1.176 1.1 6 true false数据类型/** * 数据类型演示 */ public class DemoOne{ public static void main(String[] args){ //输出整数 十进制 System.out.println(50); //输出整数 二进制,数字开头oB System.out.println(0B11); //输出整数 八进制,数字开头0 System.out.println(0537); //输出整数 十六进制,数组开头0X 0-9 A-F System.out.println(0XE); //输出浮点数 System.out.println(3.2); //输出布尔数据,只有2个值,true/false System.out.println(true); System.out.println(false); //输出字符常量,单引号包裹,只能写1个字符(无论是汉字、数组、字母),都是一个字符。 //注意:不写也不行,不写会报错,但可以写一个空字符。 System.out.println('6'); System.out.println(' '); //输出字符串。 //注意:可以什么都不写,就为一个空字符。 System.out.println(""); } }输出结果:50 3 351 14 3.2 true false 6 注意:最后输出的2个为空。字符串类型演示/** * 字符串,引用类型 * 常量:字符串,""双引号包裹起来 * 注意:字符串Sring不属于基本数据类型,属于JAVA中的引用类型,但是定义、使用和基本数据类型定义类似。 */ public class StrVariable{ public static void main(String[] args){ String str = "Hello World"; System.out.println(str); } }输出结果:Hello World强烈推荐阿里巴巴JAVA开发手册,程序员必备手册。10、数据类型转换数据类型转换分为自动转换和强制转换。不同类型的变量是否可以一起运算?答案是可以的,但是需要先进行数据类型转换,再运算。数据转换遵循原则:范围小的数据类型值,可以直接转换为范围大的数据类型值。 范围大的数据类型值,不可以直接转换为范围小的数据类型值。各种数据类型按照数据范围从小到大依次列出:byte -> short -> int -> long -> float -> doubleA:自动类型转换:表示范围小的数据类型转换成范围大的数据类型,这种方式称为自动类型转换。自动转换格式:范围大的数据类型 变量 = 范围小的数据类型值;/** * 数据类型转换 * 自动转换:取值范围小的数据值,会自动转换成取值范围大的值。 * 注意:bolean类型不能参与转换 */ public class DataTypeConversion{ public static void main(String[] args){ //double类型变量 double d = 10000; //出现类型自动转换,int自动转换成double System.out.println(d); int i =100; double d2 = i; //出现类型自动转换,int自动转换成double System.out.println(d2); byte b =10; int j = b; //自动类型转换,byte类型自动转换成int类型 System.out.println(j); } }注意:bolean类型不能参与转换B:强制转换:把数据类型取值范围大的,转换成数据类型取值范围小的。数据类型强制转换公式:被转后的数据类型 变量名 = (被转换后数据类型)要被转的数据;/** * 强制数据类型转换 */ public class DataTypeConversion2{ public static void main(String[] args){ //double浮点,转成int double d = 3.14; //被转后的数据类型 变量名 = (被转换后数据类型)要被转的数据 int i = (int)d; System.out.println(i); //类似大桶中的水倒入小桶,水肯定会丢失(精度丢失) byte b = (byte)200; System.out.println(b); } }输出结果:3 -56注意:强制类型转换,实际开发中没有要求强制转换时,不转换,不然会丢失精度 ,除非要求转换才做强制转换。### 11、运算符运算符分为:算术运算符、赋值运算符、比较运算符、三元运算符。算术运算符运算符是用来计算数据的符号。数据可以是常量,也可以是变量。被运算符操作的数我们称为操作数。算术运算符最常见的操作是将操作数参与数学计算,如下:运算符 运算规则 范列 结果 + 正号 +3 3 + 加 2+3 5 + 字符串连接 "你"+"好" 你好 - 负号 int a=3;-a -3 - 减号 3-1 2 * 乘 2*3 6 / 除 5/2 2 % 取模 5/2 1 ++ 自增 int a=1;a++/++a 2 -- 自减 int b=3;b--/--b 2算术运算符演示:/** * + 加法,连 * - 减法 * * 乘法 * / 除法 * % 取模(求余数) * ++ 自增 * -- 自减 */ public class Operator{ public static void main(String[] args){ // + 连接作用,将一个字符串和其他数据连接起来 // 遇到字符串,变成连"5+4=54" // + 任何类型只要和字符串+,所有的数据都变成了字符串。 System.out.println("5+4="+5+4); //除法运算 //java中,整数除法运算最后只会得到整数 int i = 100; int j = 9; System.out.println(i/j); //取模运算,两数相除,获取的余数 int k =6; int m =4; System.out.println(k%m); //++/-- 自增/自减运算 int a = 3; int b = 3; a++; //变量a自己增加1 System.out.println(a); ++b; System.out.println(b); //====================================================== //++:写在变量前面,和写在后面的,区别 int c = 3; int d = 3; ++c; d++; //结论:符号写在前面,还是后面,在变量自己独立计算的时候,没有区别。 //但是变量,要是参与了其它运算,就有区别了。 //f = e++,++后算,先将e的值赋予f,然后e再自增1. //q = ++h,++先算,先将h自增1,后再赋值给q。 //======================测试============================ int e = 5; int f = e++; System.out.println(e); System.out.println(f); int h = 5; int q = ++h; System.out.println(h); System.out.println(q); } }输出结果:5+4=54 11 2 4 4 6 5 6 6++:写在变量前面,和写在后面的,区别:符号写在前面,还是后面,在变量自己独立计算的时候,没有区别。但是变量,要是参与了其它运算,就有区别了。f = e++,++后算,先将e的值赋予f,然后e再自增1. q = ++h,++先算,先将h自增1,后再赋值给q。-- 与++类似,不再做说明。赋值运算符赋值运算符就是为变量赋值的符号。赋值运算符的使用如下:运算符 运算规则 范例 结果 = 赋值 int a=2 2 += 加后赋值 int a=2,a+=2 4 -= 减后赋值 int a=2,a-=2 0 *= 乘后赋值 int a=2,a*=2 4 /= 整除后赋值 int a=2,a/=2 1 %= 取模后赋值 int a=2,a%=2 0注意:诸如+=这样形式的赋值运算符,会将结果自动强制转成等号左边的数据类型。public class Operator2{ public static void main(String[] args){ int a = 1; a+=4.8; System.out.println(a); int b = 10; b%=3.3; //会先把10转成double 10.0 然后相除余数0.1,去整数0. System.out.println(b); int h = 10; //h=h%3.3; 会报 不兼容的类型: 从double转换到int可能会有损失 System.out.println(h); int c = 10; double d=3.3; System.out.println(c/d); System.out.println(c%d); byte m =1; //m = m + 1; //出错,会丢失精度,类似把小桶加大桶的水,放到小桶。 m=(byte)(m+1);//通过强转就可以。 m+=1;//这种加就包含了上面的强转,因此推荐使用+=这种 System.out.println(m); } }输出结果:5 0 10 3.0303030303030303 0.10000000000000053 3注意:在运算时,都会往类型占有字节大的转换后再运算,除/余数运算,结果去整数。比较运算符比较运算符,又叫关系运算符,它是用来判断两个操作数的大小关系及是否相等关系的,结果是布尔值true/false。运算符 运算规则 范例 结果 == 相等于 4==3 false != 不等于 4!=3 true < 小于 4<3 false > 大于 4>3 true <= 小于等于 4<=3 false >= 大于等于 4>=3 true注意:赋值运算符的=符号与比较运算符的==符号是有区别的:赋值运算符的=符号,是用来将=符号右边的值,赋值给=符号左边的变量。比较运算符的==符号,是用来判断==符号左右变量的值是否相等的。/** * 赋值运算符 */ public class Operator3{ public static void main(String[] args){ int a = 3; int b = 4; System.out.println(a=b); System.out.println(a==b); System.out.println(a==3); System.out.println(a!=3); } }输出结果:4 true false true逻辑运算符逻辑运算符,是用于布尔值进行运算的,结果为布尔值true或false运算符 运算规则 范例 结果 & 与 false&true false | 或 false|true true ^ 异或 true^false true ! 非 !true false && 短路与 false&&true false || 段落或 false||false true逻辑运算符通常是对两个类型数据之间进行计算,结果也是boolean类型。/** * 逻辑运算符 */ public class Operator4{ public static void main(String[] args){ //一边是false,运算结果就是false System.out.println(false & false); System.out.println(false & true); System.out.println(true & true); //一边是true,结果就是true System.out.println(false | false); System.out.println(false | true); System.out.println(true | true); ////两相同就是false,不同为true System.out.println(false ^ false); System.out.println(false ^ true); System.out.println(true ^ true); //取反 System.out.println(!false); System.out.println(!true); //前边是false,后边不运行,结果为false。比&效率高 System.out.println(false && false); System.out.println(false && true); System.out.println(true && true); //前边是true,后边不运行,结果为true。比|效率高 System.out.println(false || false); System.out.println(false || true); System.out.println(true || true); } }输出结果:false false true false true true false true false true false false false true false true true重点:&与&&区别: 短路与&&,前面不成立(false),后面就不运算了,结果为不成立(false)。 |与||区别: 短路或||,前面成立,后面就不运算了,结果为成立(true)。三目运算符之前的均为一元或二元运算符,元就是参与运算的数据。例如: 3+5,使用算术运算符将操作数联系起来,这种情况,称为:算符表达式。 3>2,使用比较运算符(条件运算符)将操作数联系起来,称为:条件表达式 其它表达式类似。三目运算符格式:(条件表达式)? 表达式1 : 表达式2 表达式:几通过使用运算符将操作数联系起来的式子。三目运算符运算规则:先判断条件表达式的值,为true,结果则为表达式1,为false,结果为表达式2./** * 三目运算符 */ public class Operator5{ public static void main(String[] args){ int a =2; int b=6; System.out.println(a>b ? a+b : b-a); System.out.println(a<b ? a+b : b-a); String c = 9>4 ? "Hello" : "呵呵"; System.out.println(c); } }输出结果:4 8 Hello
2022年02月27日
105 阅读
0 评论
1 点赞
2022-02-27
keytool证书导入
最近项目对接时,中间B2B服务切换了域名,导致现有项目调用接口地址需要进行切换为https,同时需要安装SSL证书,这里记录一下JAVA工具keytool导入证书的过程。一、问题点切换域名后加上https,未导入证书报错:[ERROR] - [2022-02-25 08:49:40.861] - [http-nio-9999-exec-1] - [DealParamAction.java:needConfirmAction:133] - no confirm method, call actual method = getNSDDtailByInterface [INFO ] - [2022-02-25 08:50:04.483] - [http-nio-9999-exec-1] - [HttpMethodDirector.java:executeWithRetry:439] - I/O exception (java.net.ConnectException) caught when processing request: Connection timed out: connect [INFO ] - [2022-02-25 08:50:04.484] - [http-nio-9999-exec-1] - [HttpMethodDirector.java:executeWithRetry:445] - Retrying request [INFO ] - [2022-02-25 08:50:25.487] - [http-nio-9999-exec-1] - [HttpMethodDirector.java:executeWithRetry:439] - I/O exception (java.net.ConnectException) caught when processing request: Connection timed out: connect [INFO ] - [2022-02-25 08:50:25.489] - [http-nio-9999-exec-1] - [HttpMethodDirector.java:executeWithRetry:445] - Retrying request [INFO ] - [2022-02-25 08:50:46.493] - [http-nio-9999-exec-1] - [HttpMethodDirector.java:executeWithRetry:439] - I/O exception (java.net.ConnectException) caught when processing request: Connection timed out: connect [INFO ] - [2022-02-25 08:50:46.495] - [http-nio-9999-exec-1] - [HttpMethodDirector.java:executeWithRetry:445] - Retrying request [ERROR] - [2022-02-25 08:51:07.510] - [http-nio-9999-exec-1] - [IdeasSenderMessageClientService.java:sendMessage:540] - Connection timed out: connect java.net.ConnectException: Connection timed out: connect at java.base/java.net.PlainSocketImpl.connect0(Native Method) at java.base/java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:101) at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403) at java.base/java.net.Socket.connect(Socket.java:591) at java.base/sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:285) at java.base/sun.security.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:190) at java.base/sun.security.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:153) at org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:82) at org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:127) at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707) at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387) at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323) at com.vtradex.otwb.edi.server.service.send.pojo.IdeasSenderMessageClientService.sendMessage(IdeasSenderMessageClientService.java:532) at com.vtradex.otwb.edi.server.service.send.pojo.IdeasSenderMessageClientService.sendSynchronizInterfaceMessageHeadModel(IdeasSenderMessageClientService.java:634)二、解决思路1、查看报错日志。2、进入报错类HttpMethodDirector.java,方法executeWithRetry,可以查看到是因为授权权限问题。三、解决方案JDK自带工具keytool导入证书即可。由于keytool不支持直接导入p7b格式证书,因此需要进行转换一下,如下:1、p7b格式证书转cer格式证书:本地安装证书,打开选中证书,右键导出证书,选中cer格式,重命名保存为cer格式。2、准备工作:将cer格式证书放导D:jdk11libsecurity文件夹下。3、jdk导入cer格式证书:进入jdk安装目录的D:jdk11libsecurity文件夹下,执行如下命令:keytool -import -alias edigatewaytest01 -file edigatewaytest01.jusdaglobal.com.cer -keystore cacerts -trustcacerts说明:edigatewaytest01:证书别名edigatewaytest01.jusdaglobal.com.cer:需要导入的cer格式证书导入过程:3.1、提示输入密码,密码一般默认第一个先测试:changeit 第二个测试密码:changeme3.2、提示确认是否信任证书,直接输入Y回车确认即可。4、验证是否导入成功:查看是否成功,如果显示你导入的密码就说明成功了keytool -list -keystore cacerts -alias edigatewaytest01说明:edigatewaytest01:刚才导入的证书别名说明:java秘钥口令默认为 changeit,不需要重新设置秘钥口令;5、如果提示已存在,则先将证书删除,之后再重新导入即可;keytool -delete -alias edigatewaytest01 -keystore cacerts 说明:edigatewaytest01:刚才导入的证书别名6、查看证书列表:keytool -list -keystore cacerts 说明:java秘钥口令默认为 changeit,不需要重新设置秘钥口令;7、keytool工具更多参数说明:参考:(不同版本有差异,详细可参见的官方文档)--genkey:在用户主目录中创建一个默认文件”.keystore”,还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书(在没有指定生成位置的情况下,keystore会存在用户系统默认目录)--alias: 产生别名 每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写--keystore: 指定密钥库的名称(产生的各类信息将不在.keystore文件中)--keyalg: 指定密钥的算法 (如 RSA DSA,默认值为:DSA)--validity: 指定创建的证书有效期多少天(默认 90)--keysize: 指定密钥长度 (默认 1024)--storepass: 指定密钥库的密码(获取keystore信息所需的密码)--keypass: 指定别名条目的密码(私钥的密码)--dname: 指定证书发行者信息 其中: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名 称,ST=州或省份名称,C=单位的两字母国家代码”--list: 显示密钥库中的证书信息 keytool -list -v -keystore 指定keystore -storepass 密码--v: 显示密钥库中的证书详细信息--export: 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码--file: 参数指定导出到文件的文件名--delete: 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore – storepass 密码--printcert: 查看导出的证书信息 keytool -printcert -file g:ssomichael.crt--keypasswd: 修改密钥库中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore sage--storepasswd: 修改keystore口令 keytool -storepasswd -keystore g:ssomichael.keystore(需修改口令的keystore) -storepass pwdold(原始密码) -new pwdnew(新密码)--import: 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书
2022年02月27日
295 阅读
1 评论
9 点赞
1
...
10
11