2023-05-17 题目

2023-05-17

1、JDK、JRE和JVM

  • jvm:java的虚拟机,主要用来运行字节码文件,java针对不同的系统(windows,mac,linux)都有特定的实现,为了就是使用同一套字节码,可以在不同的系统上跑出同样的结果

字节码:java可以理解的代码叫做字节码(打包之后的.class文件),在一定程度上解决了传统解释型语言执行效率低问题,同时又保留了解释型语言可移植特定,所以java程序运行比较高效,而且字节码的好处是在不同的系统上运行的结果是一致的,无需针对系统进行重新编译打包等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-egpYnRpq-1684320335562)(E:\笔记\面试\1.png)]

从字节码文件到机器码文件步骤:老的方式:JVM类加载器先加载字节码文件,然后通过解释器逐行解释执行,执行速度比较慢,有些方法和代码块是需要经常被调用的(热点代码)所以
后续引进JIT编译器原理:运行时编译,当JIT编译器完成第一次编译后,会将字节码对应的机器码保存下来,下次可以直接使用(针
对热点代码)

  • JDk:java开发者工具,是功能齐全的java SDk,包括 JRE,编译器(javac)和一些工具(如javadoc),可以用来创建和编译程序

  • JRE:java运行时环境,运行已经编译好的java的程序,包含虚拟机,java的类库,java命令和其他的一些基础构件,但是不能用来编写程序,只能运行;

2、8大基本类型

基本类型大小大小(字节)最小值最大值包装类默认值
byte8bit1-2^72^7-1Byte0
short16bit2-2^72^7-1Short0
int32bit4-2^312^31-1Integer0
long64bit8-2^632^63-1Long0L
char16bit2Unicode 字符Unicode字符Character‘u0000’
float32bit832位 IEEE 75432位 IEEE 754Float0f
double64bit1664位 IEEE 75464位 IEEE 754Double0d
boolean1true或falsetrue或falseBooleanfalse

3、自动装箱拆箱

装箱:将基本数据类型用他们的引用类型包装起来

拆箱:将包装类型转换成为他们的基本类型

java基本类型的包装类基本都实现了常量池技术,Byte,Short,Integer,Long,Character,Boolean;

4中数字类型的包装类默认创建了数值[-128,127]的相应类型的缓存数据,Character创建了数值在[0,127]范围的缓存数据,Boolean直接返回了True or false。如果超出对应的范围,则去创建新的对象。

public static void main(String[] args) {
   Integer a1 = 10,a2=10,a3= 180,a4=180;
    System.out.println(a1==a2);  true
    System.out.println(a3==a4);  false
}

超过常量池,则会取new一个新的对象

自动拆箱调用valueOf方法,源码如下:

先查看是否在-128 - 127之间

如果在这之间去常量池拿数据,否则new一个新对象

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

 private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

4、自增自减运算符

在写代码的过程中,常见的一种情况是需要某个整数类型变量增加 1 或减少 1,Java 提供了一种特殊的 运算符,用于这种表达式,叫做自增运算符(++)和自减运算符(–)。

其实都是

++i : 先自增,后赋值

i++ : 并不是我们传统意义上的认识,先赋值,在自增(这是错误的),他其实也是先自增,然后再赋值(赋的是之前的值)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值