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处理,此时程序会异常终止

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目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.

新的甘特图功能,丰富你的文章

gantt dateFormat YYYY-MM-DD title Adding GANTT diagram functionality to mermaid section 现有任务 已完成 :done, des1, 2014-01-06,2014-01-08 进行中 :active, des2, 2014-01-09, 3d 计划一 : des3, after des2, 5d 计划二 : des4, after des3, 5d
  • 关于 甘特图 语法,参考 这儿,

UML图表

可以使用UML图表进行渲染,例如下面产生的一个序列图:

sequenceDiagram 张三 ->> 李四: 你好!李四, 最近怎么样? 李四-->>王五: 你最近怎么样,王五? 李四--x 张三: 我很好,谢谢! 李四-x 王五: 我很好,谢谢! Note right of 王五: 李四想了很长时间, 文字太长了<br/>不适合放在一行. 李四-->>张三: 打量着王五... 张三->>王五: 很好... 王五, 你怎么样?
  • 关于 UML图表 语法,参考 这儿,

流程图

graph LR A[长方形] -- 链接 --> B((圆)) A --> C(圆角长方形) B --> D{菱形} C --> D
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart.js的流程图语法:

flowchat st=>start: 开始 e=>end: 结束 op=>operation: 我的操作 cond=>condition: 确认? st->op->cond cond(yes)->e cond(no)->op
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

posted @ 2026-06-07 20:30  甜面包蘸酷可乐  阅读(4)  评论(0)    收藏  举报