zoukankan      html  css  js  c++  java
  • 《Thinking in Java》学习笔记(一)

      服务器端的编程可以参考另一本书《企业Java编程》(Thinking in Enterprise Java)。

     1.基本类型

    基本型别 大小 最小值 最大值  默认值
    boolean ----- ----- ------  false
    char 16-bit Unicode 0 Unicode 2^16-1   u0000(null)
    byte 8-bit -128 +127  0
    short 16-bit -2^15 +2^15-1  0
    int 32-bit -2^31 +2^31-1  0
    long 64-bit -2^63 +2^63-1  0L
    float 32-bit IEEE754 IEEE754  0.0f
    double 64-bit IEEE754 IEEE754  0.0d

      数值类型的都有正负之分。

      boolean类型所占的空间没有明确的制定。

       1.java的数值是有符号的,不要忘了还要考虑负数

            判断一个数是不是奇数,

            if( i % 2 == 1){

                ...

            }

            如果i是负数,i%2 的结果将是-1.应该是写成:

           if( i%2 ! =0){

         ...

           }

         2.如果使用小数,默认的将是double类型,要使用float类型,应该显示的指明小数的类型

            float f = 1.24f;

         3.小数都可能会有精度的丢失,使用float和double做小数计算时可能都会碰到这样的问题,如果就是需要精确地计算,可以考虑使用BigDicemal,整型对应的是BigInteger。这里要用的是new BigDicemal(String)而不能用new BigDicemal(double),否则在构造BigDicemal之前就已经丢失了精度,这是需要注意的。

            System.out.println(2.0f - 1.1f);

            System.out.println(2.0d - 1.1d);

      2.封装类型

       包装类型包括:Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail

       其中BigInteger、BigDecimal没有相对应的基本类型,主要应用于高精度的运算,BigInteger 支持任意精度的整数,BigDecimal支持任意精度带小数点的运算。

       使用BigInteger、BigDecimal不会产生精度丢失的问题,而是用longfloat时都需要考虑精度丢失的问题。可能不是很大的数值的计算都会有精度丢失的问题。

       为什么有了基本类型还需要包装类型?很多时候方法的参数是一个对象而非基本类型,例如ArrayList的add方法的参数就是对象。

       想要查看int型的最大值,可以使用Integer.MAX_VALUE。

       3.缓存

             缓存是一种典型的空间交换时间的方案,数据库频繁读取时需要考虑缓存,最基本的思路就是Map。

        使用缓存需要考虑的问题:

        1.数据需要缓存多久

        2.缓存数据和真实数据的一致性,当真实数据更新或删除时

        3.缓存的并发控制,增删改查在多线程的环境下需要考虑。ConcurrentHashMap和Collections.synchronizedMap(Map)

        java.lang包默认会导入到每个Java文件中,所以lang包下的类默认都可以直接使用。

        rt.jar包也会自动加载,jre/lib下的jar包也会自动加载。

      4.java的修饰符

       类的修饰符有:

    访问修饰符

    名称

    说明

    备注

    public

    可以被所有类访问(使用)

    public类必须定义在和类名相同的同名文件中

    package

    可以被同一个包中的类访问(使用)

    默认的访问权限,可以省略此关键字,可以定义在和public类的同一个文件中

    private

    修饰内部类

     

     

    修饰符

    名称

    说明

    备注

    final

    使用此修饰符的类不能够被继承

     

    abstract

    如果要使用abstract类,之前必须首先建一个继承abstract类的新类,新类中实现abstract类中的抽象方法。

    类只要有一个abstract方法,类就必须定义为abstract,但abstract类不一定非要保护abstract方法不可

       变量的修饰符有:

      

    访问修饰符

    名称

    说明

    备注

    public

    可以被任何类访问

     

    protected

    可以被同一包中的所有类访问

    可以被所有子类访问

    子类没有在同一包中也可以访问

    private

    只能够被当前类的方法访问

     

    缺省

    无访问修饰符

    可以被同一包中的所有类访问

    如果子类没有在同一个包中,也不能访问

     

     

    修饰符

    名称

    说明

    备注

    static

    静态变量(又称为类变量,其它的称为实例变量)

    可以被类的所有实例共享。

    并不需要创建类的实例就可以访问静态变量

    final

    常量,值只能够分配一次,不能更改

    注意不要使用const,虽然它和CC++中的const关键字含义一样

    可以同static一起使用,避免对类的每个实例维护一个拷贝

    transient

    告诉编译器,在类对象序列化的时候,此变量不需要持久保存

    主要是因为改变量可以通过其它变量来得到,使用它是为了性能的问题

    volatile

    指出可能有多个线程修改此变量,要求编译器优化以保证对此变量的修改能够被正确的处理

     

      方法的修饰符有:

      

    访问修饰符

    名称

    说明

    备注

    public

    可以从所有类访问

     

    protected

    可以被同一包中的所有类访问

    可以被所有子类访问

    子类没有在同一包中也可以访问

    private

    只能够被当前类的方法访问

     

    缺省

    无访问修饰符

    可以被同一包中的所有类访问

    如果子类没有在同一个包中,也不能访问

     

    修饰符

    名称

    说明

    备注

    static

    静态方法(又称为类方法,其它的称为实例方法)

    提供不依赖于类实例的服务

    并不需要创建类的实例就可以访问静态方法

    final

    防止任何子类重载该方法

    注意不要使用const,虽然它和CC++中的const关键字含义一样

    可以同static一起使用,避免对类的每个实例维护一个拷贝

    abstract

    抽象方法,类中已声明而没有实现的方法

    不能将static方法、final方法或者类的构造器方法声明为abstract

    native

    用该修饰符定义的方法在类中没有实现,而大多数情况下该方法的实现是用CC++编写的。

    参见SunJava Native接口(JNI),JNI提供了运行时加载一个native方法的实现,并将其于一个Java类关联的功能

    synchronized

    多线程的支持

    当一个方法被调用时,没有其它线程能够调用该方法,其它的synchronized方法也不能调用该方法,直到该方法返回

       接口的修饰符:

      

    访问修饰符

    名称

    说明

    备注

    public

    所有

     

    无访问修饰符(默认)

    同一个包内

     

      javadoc只能为public和protected成员进行注释,private和包成员的注释将会被忽略掉。

      5.静态导入

      静态导入的语法是:

      import static 包名.类名.静态成员变量;

      import static 包名.类名.静态成员函数;  

    package com.example.learnjava;
    
    public class Common{
    
        public static final int AGE = 10;
        public static void output() {
            System.out.println("Hello World!");
        }
    }

      使用静态导入:

    package com.example.learnjava2;
    
    import static com.example.learnjava.Common.AGE;
    import static com.example.learnjava.Common.output;
    
    public class StaticImportTest{
        public static void main(String[] args){
            int a = AGE;
            System.out.println(a);
            
            output();
        }
    }

        

      程序员经常会忘记运算符的优先级顺序,这时使用括号来明确地定义运算顺序是最保险的。

     6. Math的常用函数

      整数除法的结果并不是四舍五入,而是直接去掉小数部分,这点需要注意。如果需要保留小数,转换为float或double型。

      Math.floor 返回小的整数值      System.out.println(Math.floor(10.7));   //10.0

      Math.round  则是4舍5入的计算,入的时候是到大于它的整数
      round 返回大的整数值,Math.round(-11.5)的结果为-11。

      abs求绝对值, System.out.println(Math.abs(-10.4));    //10.4

      max 两个中返回大的值,min和它相反

      random 取得一个大于或者等于0.0小于不等于1.0的随机数

      

      也可通过Random类生成随机的数, 下面的代码将生成0到100的随机整数。47是给定了一个生成器的种子,如果不给定,将使用当前时间作为种子。还可以使用nextFloat、nextLong等。 

    Random rand = new Random(47);
    int i = rand,netInt(100);

      ceil 则是不小于他的最小整数

      7.Java中的移位操作 

      java中的移位操作只对int和long有效,byte、short、char升级为int后再进行移位,其结果可能就是不准确的。 

      >>是带符号右移,负数高位补1,正数补0

      <<左移不管负数还是正数,在低位永远补0

      >>>是不带符号右移,不论负数还是正数,高位补0

      没有<<<符号

        a = 1; 

        a = a >> 2;的结果将是4.

     8.Java中标签的使用

      Java中使用标签的唯一理由就是想要从多重循环中直接跳到某处,和continue和break结合使用

    foo:
    for(int x=3;x<20;x++){
        while(y>7){
            y--;
      continue; } }

      该continue只能跳出while这个内层循环

    foo:
    for(int x=3;x<20;x++){
        while(y>7){
            y--;
            continue foo;
        }
    }

      该continue可以直接跳至foo标签处,可以跳出多重循环。

      

      上面的foo:就是标签,标签可以任意命名,如labeloutter:也是可以的。

      使用标签和continue和break结合使用可以完成goto的功能。

      while(true)和for(;;)的作用是一样的。

     9.switch的使用

      在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。在Java7中,呼吁很久的String支持也终于被加上了。

    public class Test {
    
        public void test(String str) {
            switch(str) {
            case "abc":
                System.out.println("abc");
                break;
            case "def":
                System.out.println("def");
                break;
            default:
                System.out.println("default");
            }
        }
    
    }

        在switch语句中,String的比较用的是String.equals,因此大家可以放心的使用。

      需要注意的是,传给switch的String变量不能为null,同时switch的case子句中使用的字符串也不能为null。

     

      使用枚举值的情形:

    package com.hap.code.utils;
    
    public enum TemplateType {
        Single,Manager,Tree,TreeManager
    }

      

    package com.hap.code;
    
    import java.io.Serializable;
    
    import com.hap.code.utils.TemplateType;
    
    public class CodeFactory {
        public void generateCode(TemplateType templateType,Class<Serializable>... cls) {
            switch (templateType) {
            case Single:
                break;
            default:
                break;
            }
        }
    }

      break是可以省略的,若省略break,继续执行下面的case,直至下一个break为止。default后面也可以加一个break,但是没什么实际意义。

      

  • 相关阅读:
    PostgreSQL在何处处理 sql查询之六十
    我对 PostgreSQL tidscan的理解
    PostgreSQL在何处处理 sql查询之五十九
    在PostgreSQL中,如何模拟Oracle的hint效果
    PostgreSQL在何处处理 sql查询之六十一
    PostgreSQL在何处处理 sql查询之五十八
    各种JOIN的理解
    对PostgreSQL源代码中的is_pushed_down的理解
    国外主流PHP框架比较
    图解什么是Web2.0
  • 原文地址:https://www.cnblogs.com/lnlvinso/p/4340801.html
Copyright © 2011-2022 走看看