情不知所起,一往而深。恨不知所踪,一笑而泯。

Java学习篇之---基本数据类型

基本数据类型

Java中一共有八种基本数据类型,可以分为四类:

第一类(整型)    :byte  short   int   long

第二类(浮点型):float   double

第三类(逻辑型):boolean

第四类(字符型):char

    名称          类型        占用内存数(单位:字节)  
    布尔型        boolean     1/8  
    字符型        char        2  
    单精度        float       4  
    双精度        double      8  
    字节型        byte        1  
    短整型        short       2  
    整数型        int         4  
    长整型        long        8  

注意:

1、Java中默认的整数类型是int类型,如果要定义为long类型,则要在数值后加l或L。

           默认的浮点类型是double类型,如果要定义为float类型,则要在数值后加f或F。

2、1Bytes(字节)=8bit(比特)
一般讲大小是用Bytes,大写的“B”,讲网络速率是用bit,注意是小写的“b”。
例:一个文件有8MBytes
例:我下载文件的速率是256KB/s,即2Mbit,这通常就是我们宽带上网的速率。

3、基本数据类型在栈里面直接分配内存,而引用数据则是通过堆里的对象来对栈中的内容进行引用。

Java学习篇之---环境变量和系统属性

环境变量和系统属性

一、前言:

    Java环境变量(getenv)与系统属性(getProperties)
    getenv是获取系统的环境变量,对于windows是将系统属性-->高级-->环境变量中设置的变量显示在此(对于linux是将通过export设置的变量显示在此)。
    getProperties是获取系统的相关属性,包括文件编码,操作系统名称,区域,用户名等,此属性一般由jvm自动获取,不能设置。     

    System.out.println(System.getenv());  
    erties().list(System.err);  

二、系统属性:
    System.out.println("Java的虚拟机实现名称:"+ System.getProperty("java.vm.name"));  
    System.out.println("Java的虚拟机实现供应商:"+ System.getProperty("java.vm.vendor"));  
    System.out.println("Java的虚拟机实现版本:"+ System.getProperty("java.vm.version"));  
    System.out.println("Java的虚拟机规范名称:"+ System.getProperty("java.vm.specification.name"));  
    System.out.println("Java的虚拟机规范供应商:"+ System.getProperty("java.vm.specification.vendor"));  
    System.out.println("Java 虚拟机规范版本:"+ System.getProperty("java.vm.specification.version"));  
    System.out.println("Java运行时环境版本:" + System.getProperty("java.version"));  
    System.out.println("Java运行时环境规范版本:" + System.getProperty("java.specification.version"));  
    System.out.println("Java运行时环境规范名称:" + System.getProperty("java.specification.name"));  
    System.out.println("Java 运行时环境供应商:" + System.getProperty("java.vendor"));  
    System.out.println("Java 供应商的URL:"+ System.getProperty("java.vendor.url"));  
    System.out.println("Java安装目录:" + System.getProperty("java.home"));  
    System.out.println("Java 类格式版本号:"+ System.getProperty("java.class.version"));  
    System.out.println("Java类路径:" + System.getProperty("java.class.path"));  
    System.out.println("默认的临时文件路径:" + System.getProperty("java.io.tmpdir"));  
    System.out.println("一个或多个扩展目录的路径:" + System.getProperty("java.ext.dirs"));  
    System.out.println("加载库时搜索的路径列表:" + System.getProperty("java.library.path"));  
    System.out.println("操作系统的名称:" + System.getProperty("os.name"));  
    System.out.println("操作系统的架构:" + System.getProperty("os.arch"));  
    System.out.println("操作系统的版本:" + System.getProperty("os.version"));  
    System.out.println("用户的账户名称:" + System.getProperty("user.name"));  
    System.out.println("用户的主目录:" + System.getProperty("user.home"));  
    System.out.println("用户的当前工作目录:" + System.getProperty("user.dir"));  
    System.out.println("文件分隔符:" + System.getProperty("file.separator"));  
    System.out.println("路径分隔符:" + System.getProperty("path.separator"));  
    System.out.println("行分隔符:" + System.getProperty("line.separator"));  
三、环境变量:
    System.out.println("所有用户Profile文件位置:"+System.getenv("ALLUSERSPROFILE"));  
    System.out.println("应用程序数据的默认存放位置:"+System.getenv("APPDATA"));  
    System.out.println("计算机名:"+System.getenv("COMPUTERNAME"));  
    System.out.println("x64常用文件的程序文件路径:"+System.getenv("CommonProgramFiles"));  
    System.out.println("x64常用文件的程序文件路径:"+System.getenv("CommonProgramW6432"));  
    System.out.println("指向 CMD.exe:"+System.getenv("COMSPEC"));  
    System.out.println("Windows系统所在磁盘分区:"+System.getenv("HOMEDRIVE"));  
    System.out.println("Windows系统所在磁盘分区:"+System.getenv("SYSTEMDRIVE"));  
    System.out.println("处理器内核数:"+System.getenv("NUMBER_OF_PROCESSORS"));  
    System.out.println("列出操作系统的名字。(WindowsXP和Windows2000列为Windows_NT.):"+System.getenv("OS"));  
    System.out.println("可执行文件的搜索路径:"+System.getenv("Path"));  
    System.out.println("默认可执行文件后缀:"+System.getenv("PATHEXT"));  
    System.out.println("处理器的芯片架构:"+System.getenv("PROCESSOR_ARCHITECTURE"));  
    System.out.println("计算机的处理器的型号:"+System.getenv("PROCESSOR_LEVEL"));  
    System.out.println("了处理器的修订号:"+System.getenv("PROCESSOR_REVISION"));  
    System.out.println("x64 ProgramFiles文件夹的路径:"+System.getenv("ProgramFiles"));  
    System.out.println("x64 ProgramFiles文件夹的路径:"+System.getenv("ProgramW6432"));  
    System.out.println("Windows系统所在的目录:"+System.getenv("SYSTEMROOT"));  
    System.out.println("Windows系统所在的目录:"+System.getenv("WinDir"));  
    System.out.println("当前登录的用户可用应用程序的默认临时目录:"+System.getenv("TEMP"));  
    System.out.println("当前登录的用户可用应用程序的默认临时目录:"+System.getenv("TMP"));  
    System.out.println("用户登录主机名:"+System.getenv("USERDOMAIN"));  
    System.out.println("当前登录的用户的名字:"+System.getenv("USERNAME"));  
    System.out.println("当前用户文件夹:"+System.getenv("USERPROFILE"));  
    System.out.println("当前用户文件夹:"+System.getenv("HOMEPATH"));  
    System.out.println("Windows目录位置:"+System.getenv("WINDIR"));  
    System.out.println("x86 ProgramFiles文件夹的路径:"+System.getenv("ProgramFiles(x86)"));  
    System.out.println("公共文件:"+System.getenv("PUBLIC"));  
    System.out.println("WindowsPowerShell模块路径:"+System.getenv("PSModulePath"));  
    System.out.println("登陆服务器名:"+System.getenv("LOGONSERVER"));  
    System.out.println("登陆的当前用户应用程序数据:"+System.getenv("LOCALAPPDATA"));

Java学习篇之---小整数缓存机制

Java学习篇之---小整数缓存机制

这是一个有意思的话题。如果你运行如下代码:

     Integer a = 1000, b = 1000;    
     System.out.println(a == b);//1  
     Integer c = 100, d = 100;    
     System.out.println(c == d);//2

你将会得到:

     false  
     true

基本知识:
正如我们所知,如果两个引用指向同一个对象,按照“==”来判断两者是相等的。如果两个引用指向两个不同的对象,那么按照"=="来判断两者是不等的,即使两者有相同的引用内容。
因此最后一条语句也应该是false。
这就是有趣之处了。如果你去看Integer.java类,你会发现有一个内部私有类IntegerCache.java,它缓存了从-128~127之间的所有整数对象。
所以事情就是,所有的小整数都被在内部进行缓存。例如当我们声明如下:

Integer c = 100;

它实际上内部进行的操作是这样的:

Integer i = Integer.valueOf(100);

如果我们去看valueOf()方法,我们可以看到:

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

如果值在-128~127之间,那么它就会从高速缓存中返回实例。

所以:

Integer c = 100, d = 100;

指向了同一个对象。

这就是为什么当我们写如下代码后我们获得true的原因:

System.out.println(c == d);

现在你可能会问,为什么这里需要缓存?
合理的解释是这样的:在此范围内的小整数比大整数使用率要高,所以为了减少潜在的内存占用,使用相同的底层对象是有价值的。
然而,通过反射API你会误用此功能。
运行起来,享受以下代码吧:

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {  
          Class cache = Integer.class.getDeclaredClasses()[0]; //1  
          Field myCache = cache.getDeclaredField("cache"); //2  
          myCache.setAccessible(true);//3  
          Integer[] newCache = (Integer[]) myCache.get(cache); //4  
          newCache[132] = newCache[133]; //5  
          int a = 2;  
          int b = a + a;  
          System.out.printf("%d + %d = %d", a, a, b); //  
     }

运行结果:

 对以上代码的解释:
     正常情况下newCache[132]中存放的是4,newCache[133]中存放的是5,现在用newCache[133]中的值替换newCache[132]中的值。这样的话计算完毕之后发现结果是4,于是系统就会去默认应该缓存4的地址上取值,但是此时由于已经将原本是值4地址上的值换成了5,所以结果是5。

     另外需要注意的是:

      System.out.printf("%d + %d = %d", a, a, b); //

     和

     System.out.println(a+" + "+a+" = "+b ); //

     结果是不一样的。参考println的方法声明,作者对于不同的基本类型都提供了overwrite,而printf并没有为基本类型提供方法。

     问题的本质在于:println(2+2)的结果仍是基本类型,并没有进行装箱,结果为4;System.out.println((Integer)2+2);的结果为5。

     以上内容大部分翻译自:https://dzone.com/articles/why-1000-1000-returns-false-but-100-100-returns-tr

 

联系我们 联系人:Neal Zhang 联系邮箱:master@pplns.com
© 2017 pplns.com 版权所有.