Java学习随笔
问题一
public class Demo {
boolean b ;
public static void main(String[] args) {
int a =128;//byte类型的数据(-128——127)
System.out.println(a);
Demo demo = new Demo();
System.out.println( demo.b);//不初始化的默认值是false
}
}
-
问题描述:当我把未初始化的b写在main里面时,想直接用sout输出时报错
b写在方法内属于局部变量,局部变量没有默认值。如上的写法把b写在方法外面,类里面,b作为成员变量,不用手动初始化,虚拟机自动分配默认值。但注意b在这里作为实例成员变量,依附于Demo对象,必须new Demo()后才存在。如果更改一下—>static boolean b,这样静态成员变量跟着类走,类加载就存在,静态方法可以直接调用(非静态方法也可以直接调用)。
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
System.out.println(Long.MAX_VALUE);//可以通过这种方法得到类型的表示范围
int a=10;
int b=20;
System.out.println(a/b);//0
System.out.println("====================");
int c=6;
int d=4;
System.out.println(c/d);//1
运行结果是0,Java里int/int的值还是int(直接舍弃小数点部分)
关于小数部分
-
整数类型/0直接报错,小数类型/0,为了科学计算方便,设计成无穷大。
-
两侧操作数类型不一致时,像类型大的提升。
int g=0;
double x=1.5;
double y=2.5;
System.out.println("====================");
System.out.println(x/a);//0.15
System.out.println("====================");
System.out.println(y/x);//1.6666666666666667
System.out.println("====================");
System.out.println(x/g);//Infinity,无穷大
System.out.println("=====================");
System.out.println(c*g);//0
double z=1.555555555555555555555555555555555555555555555555;
System.out.println(z*z);//2.419753086419753
//乘法再大也不会无穷大,double存不下超长小数,会自动截取。
//二进制里1.1是无限循环小数,存不准确算出来就有误差。
System.out.println(num1*x);//1.6500000000000001,只要分母不是 2 的次方,统统存不准!
System.out.println(a/g);//ArithmeticException: / by zero 报错
-
增值运算符在计算时可以不进行强制类型转换。
System.out.println(b+=x);//21 // b=b+x;//不兼容类型 System.out.println(x+=c);//7.5
BigDecimal
BigDecimal n = new BigDecimal("1.1");
BigDecimal m = new BigDecimal("1.1");
System.out.println(m.multiply(n)); // 输出 1.21 完全精确
java使用Unicode表示字符,因此一个字符占据两个字节,表示的字符种类更多
字符转换
- 数据范围小的转换为数据范围大的时,自动转换。
- 数据范围大的转换为小的,强制类型转换
int a = 1;
float f = 1.1f;
double d = 1.2d;
long l = 13L;
a=(int)l;
System.out.println(a);//13
l=a;
System.out.println(l);//13
byte num1=1;
byte num2=2;
byte num3=(byte)(num1+num2);
System.out.println(num3);//3
计算机的CPU通常按照四个字节为单位从内存里读取数据,为了硬件实现方便,像byte,short这种低于四个字节的类型会先提升成int,再参与计算。
String和int互转
int num4=1900;
String str="9000";
int num5=Integer.parseInt(str);
System.out.println(num5);
System.out.println("==================");
String str1=String.valueOf(num4);
System.out.println(str1);
Integer.parseInt()和String.valueOf()
自加自减
- 前置++,先+后用
- 后置++,先用后用
只有变量可以使用自增自减运算符,常量不能用,因为常量不能修改。
逻辑运算符
&&:有假为假,左右表达式为boolean
||:有真为真,左右表达式为boolean
以上两个短路求值规则,&(按位与,有0为0)和|(按位或 有1为1)表达式结果为boolean时,也表示逻辑运算,但和上面两个相比不支持短路求值。
!:逻辑非
~(按位取反)
int num5=0xf;//0x前缀的数字为16进制
System.out.println(num5);//15
System.out.println(~num5);//-16
问题二:为什么按位取反后会是-16?
Java int类型是32位,num5的十进制是15,转换为二进制 00000000 00000000 00000000 00001111,按位取反 11111111 11111111 11111111 11110000,此时这串取反后的二进制数被存入Java内部,要输出~num5的时候,Java按照自己的原则,最高位作为符号位不变其他位按位取反,再+1。正数的补码=原码=反码
^(按位异或) 两个数相同,异或结果为0
<<左移 a<<1 a *2(正数)
右移>> a>>1 a/2(正数)
条件运算符 表达式1?表达式2:表达式3 (注:表达式2和表达式3的结果要是同类型的,除非可以发生隐式类型转换(范围小的转向范围大的))
int a=21;
int b=22;
int x=a>b?a:b;
// a>b?a:b; 要接收判断结果,注意结果类型,是int还是boolean还是其他。
System.out.println(x);//22
问题三:判定0~999里的素数
{
/* for(int j=2;j<999;j++){
for(int i=2;i<Math.sqrt(j);i++){
if((j%i==0)){
System.out.println(j+"不是素数");
}else {
System.out.print(j+"是素数");
}
}
}*/
for (int i = 2; i < 1000; i++) {
boolean flg = true;
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
flg = false;
break;
} else {
flg = true;
}
}
if (flg) {
System.out.println(i+"是素数");
}
/*else {
System.out.println(i+"不是素数");
}*/
}
}
注:
-
一个数可以被大于二且小于自身根号范围内的数字整除就不是素数。
-
必须要等判断全部完成才可以输出,不能边判断边输出。
-
flg需要初始化为flg,这样后面一旦可以整除就改为flase,比如说3,当i=3时,j=2;j<=1.7...;j++。此时根本不会进入内层循环,如果我们把flg初始化为false,那么最后的判断打印就无法完成,前面的3就无法照常打印。
问题三:求水仙花数
{
for ( int i = 0; i < 1000; i++) {
int sum=0;
int ge=0;
int shi=0;
int bai=0;
if(i<10){
ge=i/1;
sum=ge;
} else if (i<100&&i>10) {
ge=i%10;
shi=i/10;
sum=ge*ge+shi*shi;
} else if (i<1000&&i>100) {
bai=i/100;
shi=i/10-bai*10;
ge=i-bai*100-shi*10;
sum=ge*ge*ge+bai*bai*bai+shi*shi*shi;
}
if(sum==i){
System.out.println(i+" is ArmstrongNumber!");
}
}
}
注:先弄明白个十百怎么求的。
输入输出
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
int age = sc.nextInt();
double salary = sc.nextDouble();
float bonus = sc.nextFloat();
方法
- 命名方法:小驼峰
- 有返回值写对应类型,无返回值写void,注意接受返回值结果
- 方法的重载:多个放法名字相同,参数列表不同,与返回值类型无关
- 递归
数组
- 引用类型的数组,默认值为null
- for-each遍历数组
{
/* int [] array ={6,9,8,7,3};
for(int x:array){
System.out.print(x+" ");
}*/
double [] array1 ={6.9,9.1,8.5,7.3,3.0};
for(double x:array1){
System.out.print(x+" ");
}
}
异常
- 算数异常:ArithmeticException
- 数组越界异常:ArrayIndexOutOfBoundsExpection
- 空指针异常:NullPointerExpection
Throwable:异常体系的顶层类,派生出了两个重要子类:Error,Expection
Error: Java虚拟机无法解决的问题,比如StackOverfloeError,OutOfMemoryError
Excepction: 异常产生后程序员可以通过代码进行处理,使程序执行
编译时异常:
java.lang.CloneNotSupportedExpection,必须进行捕获或声明以便抛出
运行时异常(RunTimeExpection):
异常处理方式:先执行try中的代码,try中代码出现异常看和catch中的异常类类型是否匹配,找到匹配类型执行catch中的代码,没有找到就将异常向上传递给上层调用者。无论是否找到匹配的异常类型,finally中的代码都会被执行到。如果上层调用者也没有处理的了异常就继续向上传递,一直main也没有合适的代码处理异常就会交给JVM处理,此时程序会异常终止
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
创建一个表格
一个简单的表格是这么创建的:
| 项目 | Value |
|---|---|
| 电脑 | $1600 |
| 手机 | $12 |
| 导管 | $1 |
设定内容居中、居左、居右
使用:---------:居中
使用:----------居左
使用----------:居右
| 第一列 | 第二列 | 第三列 |
|---|---|---|
| 第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants 是一个文本转换工具,主要功能是将普通的 ASCII 标点符号自动转换为更美观的印刷体标点符号。例如:
| 原始符号 | 转换后 | 说明 |
|---|---|---|
"引号" |
“引号” | 直引号变弯引号 |
'单引号' |
‘单引号’ | 直单引号变弯单引号 |
-- |
– | 两个连字符变短破折号 |
--- |
— | 三个连字符变长破折号 |
... |
… | 三个点变省略号 |
创建一个自定义列表
- Markdown
- Text-to-HTML conversion tool
- Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。[1]
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 $\Gamma(n) = (n-1)!\quad\forall
n\in\mathbb N$ 是通过欧拉积分
$$
\Gamma(z) = \int_0^\infty t{z-1}edt,.
$$
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML图表
可以使用UML图表进行渲染,例如下面产生的一个序列图:
- 关于 UML图表 语法,参考 这儿,
流程图
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart.js的流程图语法:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎

浙公网安备 33010602011771号