java基础——有多少是你不知道的?

news2024/11/27 8:28:08

java基础——有多少是你不知道的?

  • 一、&&和||
  • 二、Integer和int
  • 三、String、StringBuffer、StringBuilder的区别
  • 四、i+1<i居然是成立的?
  • 五、一脸懵逼的null问题
  • 六、整数除法向上取整你知道多少种?
  • 七、这也能运行?

一、&&和||

1、下面的程序你猜会打印什么呢?
在这里插入图片描述

结果为以下:
在这里插入图片描述

2、解释
&&符号当左边为false的时候就不再执行右边的判断了,因为程序已经可以确定为false了,所以b++并没有执行

||符号当左边为true的时候就不在执行左边的判断了,因为程序已经可以确定为true了,所以d++被执行了

3、这种判断机制的用途
可以解决先后判断问题,例如以下程序
在这里插入图片描述
先判断非空再判断字符串长度是没有错的,因为s为空的时候,就不会去执行s.length()==5

反过来,先判断字符串长度的话会立马抛出空指针异常
在这里插入图片描述

二、Integer和int

1、下面的题你能做对吗?输出结果是什么呢?
在这里插入图片描述

结果:
在这里插入图片描述

2、解释
Integer是int的包装类,Integer引用的是堆内存新建的对象,int引用的是java常量池里的数据

Integer和int会有拆箱装箱机制
int和Integer比较时,Integer会自动拆箱为int
int赋值Integer数据时,Integer会自动拆箱为int
Integer赋值int数据时,int会自动装箱为Integer
int和int用==比较时,比较的是值的大小
int和Integer用==比较时,Integer会自动拆箱为int,比较的是值的大小
Integer和Integer用==比较时,比较的是两个对象是否是同一个的引用

int自动装箱的小细节:对于-128~127的数据,int会判断缓存里有没有相对应值的Integer对象,如果有,直接返回该对象,否则新创建一个对象,并把对象放到缓存中。这样做是为了对于频繁使用的数据只保存一份数据,减少内存的浪费

package com.wu.hello.main;

public class Main {
    public static void main(String[] args) {
        int a=0;
        int b=0;
//        true,int和Integer用==比较时,Integer会自动拆箱为int,比较的是值的大小
        System.out.println(a==b);

        Integer c=new Integer(1);
        Integer d=new Integer(1);
//        false,Integer和Integer用==比较时,比较的是两个对象是否是同一个的引用
        System.out.println(c==d);

        Integer e=2;
        Integer f=2;
//        true,int自动装箱的小细节:对于-128~127的数据,int会判断缓存里有没有相对应值的Integer对象,
//        如果有,直接返回该对象,否则新创建一个对象,并把对象放到缓存中。
        System.out.println(e==f);

        Integer g=200;
        Integer h=200;
//        false,int自动装箱的小细节:对于-128~127的数据,int会判断缓存里有没有相对应值的Integer对象,
//        如果有,直接返回该对象,否则新创建一个对象,并把对象放到缓存中。
        System.out.println(g==h);

        Integer i=new Integer(200);
        int j=new Integer(200);
//        true,int和Integer用\=\=比较时,Integer会自动拆箱为int,比较的是值的大小
        System.out.println(i==j);
    }
}

三、String、StringBuffer、StringBuilder的区别

1、区别

StringStringBufferStringBuilder
内存位置java常量池/堆空间堆空间堆空间
线程安全问题线程安全线程安全线程不安全
是否可变不可变可变可变
效率最慢一般最快
使用场景不需要更改时使用多线程单线程

2、String是不可变的是什么意思?
例如字符串s=“abc”,如果想要s=“adc”,不可以直接把字符 ‘b’ 修改为 ‘d’ ,而要新创建一个对象"adc",让s去引用它

3、String为什么是最慢的?
因为String对象是不可变的,每次修改的时候都需要产生一个新的对象
例如字符串拼接:“abc”+“d”,需要新创建一个字符串对象"abcd",而StringBuffer和StringBuilder可以直接修改当前对象

4、什么线程不安全?
在多线程的情况下会出现错误,例子:多个线程同时修改StringBuilder对象

package com.wu.hello.main;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        StringBuilder s=new StringBuilder();
        for (int i = 0; i < 10; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int j = 0; j < 1000; j++){
                        s.append("a");
                    }
                }
            }).start();
        }
        Thread.sleep(1000);
        System.out.println(s.length());
    }
}

在这里插入图片描述

报了异常,按道理应该输出10000的,因为多线程问题,使得结果发生了错误,这就是线程不安全

5、StringBuilder线程不安全的原因

因为多个线程操作的是同一个StringBuilder对象,而StringBuilder的方法调用时没有加锁,导致多个线程同时进入方法,出现不一致问题,例如线程1进入方法后获取了数据,线程2修改了字符串,那么线程1拿到的就是脏数据

而StringBuffer的每个方法是加了synchronized的,所以多线程是没问题的

在这里插入图片描述

6、同样地,HashMap 、HashSet都是非线程安全的,如果在多线程环境下,可以使用 ConcurrentHashMap、ConcurrentHashSet来代替,当然效率也会降低一些

四、i+1<i居然是成立的?

1、笔试题:是否存在数字 i+1<i?存在吗?
在计算机里面是存在的,Int类型的数占32位,当int是最大值的时候,再加1,那么就会变为最小值

package com.wu.hello.main;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        int maxValue = Integer.MAX_VALUE;
        System.out.println(maxValue);

        System.out.println(maxValue+1<maxValue);
    }
}

在这里插入图片描述

五、一脸懵逼的null问题

1、先看程序

package com.wu.hello.main;

public class NULL {

    public static void haha(){
        System.out.println("haha");
    }

    public static void main(String[] args) throws InterruptedException {
        ((NULL)null).haha();
    }
}

2、这嘛玩意?这个程序真的可以跑的吗?真的!
在这里插入图片描述

3、解释
其实NULL是类的名字,在java里面,null可以转成任何对象。转了之后也就相当于以下程序:

package com.wu.hello.main;

public class NULL {

    public static void haha(){
        System.out.println("haha");
    }

    public static void main(String[] args) throws InterruptedException {
        NULL n=null;
        n.haha();
    }
}

所以,你大概懂了吧!haha()是static方法,null对象同样可以调用!当然的,不是static方法的话就会报空指针异常了

在这里插入图片描述

六、整数除法向上取整你知道多少种?

package com.wu.hello.main;

public class Main {

    public static void main(String[] args) {
        int a=20;
        int b=6;

        //方法1
        System.out.println((int)Math.ceil((double) a/b));

        //方法2
        System.out.println(a/b+(((a%b)!=0)?1:0));

        //方法3
        System.out.println((a+b-1)/b);

    }
}


在这里插入图片描述

最常用的向上取整就是方法3啦

七、这也能运行?

1、先看程序

package com.wu.hello.main;

public class Main {

    public static void main(String[] args) {
        https://www.baidu.com/;
        System.out.println("haha");
    }
}

2、你觉得这个程序可以运行吗?
答案是可以滴
在这里插入图片描述

3、解释
实际上的程序是这样的:

package com.wu.hello.main;

public class Main {

    public static void main(String[] args) {
        https:
        System.out.println("haha");
    }
}

实际上https: 是goto语句的写法,这种写法已经快被弃用了,原因是goto语句会使程序变得杂乱无章,程序维护困难。

可以看以下程序理解goto用法:

package com.wu.hello.main;

public class Main {

    public static void main(String[] args) {
        https:
        while (true){
            break https;
        }
        System.out.println("haha");
    }
}

java对c++的goto语法做了优化,只能接在break、continue后面,跳出循环或者是重新执行循环

觉得写得不错就点个赞吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/651025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QML 与 Python 交互

在 Qt 中&#xff0c;C 和 QML 交互一般有如下三种方法 上下文属性&#xff1a;setContextProperty( )向引擎注册类型&#xff1a;调用 qmlRegisterType( )QML 扩展插件&#xff1a;虽然有很大的灵活性&#xff0c;但是用 Python 创建 QML 插件比较麻烦&#xff0c;所以这种方法…

【补充:CAN卡通信的下位机-STM32cubeIDE-hal库+STMF1xx+数据发送和接收+中断接收方式+基础样例3】

【CAN卡通信的下位机-STM32cubeIDE-hal库STMF4xx数据发送和接收中断接收方式基础样例3】 1、概述2、实验环境3、问题描述4、大佬指点与解决问题5、实验效果截图6、代码连接7、细节部分8、总结 ) 1、概述 从第一篇F1和F4上采用轮询的方式调试can&#xff0c; 【CAN卡通信的下位…

如何用Jmeter进行接口测试 ,这应该是全网最详细的教程了

一、Jmeter 的使用步骤 打开Jmeter 安装包&#xff0c;进入\bin 中&#xff0c;找到"jmeter.bat", 点击打开即可。 在下图打开的Jmeter 页面中&#xff0c;右键“测试计划” -> “添加” -> "Threads(Users)" -> “线程组”&#xff0c; 建立线…

Allure安装、使用、Jenkins集成

目录 一、allure介绍 二、安装allure服务 三、安装pytest、allure-pytest 插件 四、生成报告 五、allure其他使用 5.1 给测试报告添加各种附件 5.2 添加用例标题和描述信息 5.3 添加链接 5.4 标记测试用例 5.5 优先级 六、allure和jenkins集成 一、allure介绍 all…

2023年5月青少年软件编程(图形化) 等级考试试卷(三级)

青少年软件编程&#xff08;图形化&#xff09; 等级考试试卷&#xff08;三级&#xff09; 一、 单选题(共 25 题&#xff0c; 共 50 分) 1.关于变量&#xff0c; 下列描述错误的是&#xff1f; &#xff08; &#xff09; A.只能建一个变量 B.变量可以隐藏 C.变量可以删除 D.…

【抽样调查】实验

文章目录 1、数组矩阵简单抽样&#xff08;1&#xff09;构造数组&#xff08;2&#xff09;构造矩阵&#xff08;3&#xff09;产生来自正态分布的随机数&#xff08;4&#xff09;从正态总体中抽取若干个样本&#xff08;5&#xff09;对矩阵的行或列进行统计计算 2、R软件作…

输入信号、冲激响应与卷积

输入信号与冲激响应的离散卷积 系统冲激响应&#xff1a; h ( t ) ∑ τ 0 ∞ x ( t ) δ ( t − τ ) h(t)\sum_{\tau0}^{\infty}x(t)\delta(t-\tau ) h(t)τ0∑∞​x(t)δ(t−τ) 上式中 h ( t ) h(t) h(t)是冲激信号输入到系统后系统的输出&#xff0c;也是系统对外在激…

stl容器vector笔记

Vector 一、初始化二、常用方法1. 访问元素at()、下标、data()、front()、back()2. push_back()、pop_back()尾部增删元素3. insert()在pos前插入元素&#xff0c;返回插入位置4. erase()擦除元素&#xff0c;返回擦除元素后的元素位置5. clear()清空容器6. resize()改变容器元…

C语言中函数返回数组(一维和二维)

文章目录 函数返回一维数组函数返回二维数组 C语言中函数返回数组是很重要的一种应用&#xff0c;有时候在程序中调用函数返回数组可以更容易的实现我们想要的某些操作&#xff0c;比如一次返回多个值&#xff0c;这篇文章带来的是C语言中函数返回一维数组和二维数组的例子。 函…

Python自动化测试框架我到底应该学哪一个?

企业中&#xff0c;自动化必定会演变成搭建测试框架&#xff0c;这是为什么呢&#xff1f; 可能有一些刚刚进入软件测试行业的朋友还不理解什么是测试框架&#xff0c;没关系&#xff0c;首先我们知道一点&#xff0c;为什么自动化会演变成搭建测试框架呢&#xff1f; 第一个…

Ribbon和 Nacos服务注册中心

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 微服务探索之旅 ✨特色专…

软件测试面试自己都不上心,就不要抱怨别人对你冷眼旁观

昨日表哥恳请帮他的学生投递一下开发岗的简历&#xff0c;举手之劳&#xff0c;这忙必须得帮。但当发来学生的简历后&#xff0c;我吐槽了“这简历平平无奇&#xff0c;没有任何亮点&#xff0c;如何令人另眼相看&#xff1f;”表哥说&#xff0c;学生经历不多&#xff0c;总不…

离散数学题目收集整理练习(期末过关进度20%)

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 ✨博主的其他文章&#xff1a;点击…

一文看懂什么是广告联盟,未来可期吗?

日常学习一些行业内的相关基础知识&#xff0c;可以在工作中更好地理解业务。在互联网广告行业中&#xff0c;广告联盟是很重要的存在&#xff0c;我们今天一起来了解下什么是广告联盟吧。 文中GG联盟广告联盟 GG广告 一. 定义 GG联盟通指网络GG联盟&#xff0c;指集合中小网…

【链表复习】C++ 链表复习及题目解析 (3)

目录 剑指offer 中的链表题目 JZ6 从尾到头打印链表 JZ18 删除链表的结点 JZ24 反转链表 JZ25 合并两个排序的链表 JZ52 两个链表的第一个公共结点 JZ23 链表中环的入口结点 JZ22 链表中倒数第k 个结点 JZ35 复杂链表的复制 JZ76 删除链表中重复的结点 本次给大家带来…

用注解实现方法开关

一、自定义注解的基本使用 java.lang.annotation 提供了四种元注解&#xff0c;专门注解其他的注解&#xff08;在自定义注解的时候&#xff0c;需要使用到元注解&#xff09;&#xff1a; Documented – 注解是否将包含在JavaDoc中 Retention – 什么时候使用该注解 Target –…

【算法】动态规划-斐波那契模型

文章目录 结论斐波那契模型第 N 个泰波那契数三步问题使用最小花费爬楼梯**方法1&#xff1a;**以i位置为结尾....方法2&#xff1a;以i位置为起点.... 解码方法 结论 对于线性dp&#xff0c;一般是用经验题目要求来定义状态表示&#xff1a; 以某个位置为结尾…以某个位置为…

React 通过一个输入内容加入列表案例熟悉 Hook 基本使用

我们创建一个react项目 在src下创建components文件夹 在下面创建一个index.jsx index.jsx 参考代码如下 import React, { useState } from "react";const useInputValue (initialValue) > {const [value,setValue] useState(initialValue);return {value,onCha…

【2023,学点儿新Java-01】从查看本机 jdk版本 开始 | Java基础全程脉络图、Java工程师全程技术路线、Java职业晋升路线图

一个人把生命耗尽&#xff0c;应该是为了一些美好的东西&#xff0c;值得的东西&#xff0c;用蓬勃如烈火的生命力 去战胜一个又一个人生的悲剧&#xff0c;这本身就是人生的意义之一吧&#xff01; &#x1f3af;作者主页&#xff1a; 追光者♂&#x1f525; &#x1f338;个人…

Win10 系统专业版远程桌面如何才能多用户同时登录使用?

环境&#xff1a; Win10专业版19041 RDPWrap-v1.6.2 dell5493笔记本 问题描述&#xff1a; Win10 系统专业版远程桌面如何才能多用户同时登录使用&#xff1f; 解决方案&#xff1a; 安装RDPWrap 1.关闭remote desktop services服务 安装RDP之前&#xff0c;要先关闭re…