zoukankan      html  css  js  c++  java
  • java 基础记录

    1,Long类型

     必须带后缀l或者L,最好用大写的。long类型,可以不用带后缀,但是会把int转化为long类型,所以如果超过int范围就会报错,所以最好加上后缀。比如:

    System.out.println(Long.MAX_VALUE);
            long L = 9223372036854775807;//报错
            long L1 = 9223372036854775807L;//通过
    Long.MAX_VALUE是9223372036854775807

    2.包装类型

     默认值为null,比如JavaBean中,Integer类型没有值,默认为null。基本类型int,则默认为0。

    3,字段串“==”和equals的比较

    String a = "a";
            String b = new String("a");
            if(a == b){
                System.out.println("a ==  b" + " : equals");
            }else{
                System.out.println("a == b" +  ": not equals");
            }
            
            if(a.equals(b)){
                System.out.println("a equals b" + " : equals");
            }else{
                System.out.println("a equals b" +  ": not equals");
            }
            
            String c = "c";
            String d = "c";
            if(c == d){
                System.out.println("c == d" + " : equals");
            }else{
                System.out.println("c == d" + ": not equals");
            }

    //output:

    a == b: not equals
    a equals b : equals
    c == d : equals

    字符串比较一定不能用 “==”,这个只能确定两个字符在同一个位置上。当然如果在同一个位置上,必然相等。要用equals方法。

    整型“==”和equals的的比较

     Integer a = 1;
                Integer b = 1;
                if(a.equals(b)){
                    System.out.println("a.equals(b)" + ":equals");
                }else {
                    System.out.println("a.equals(b)" + ":not equals");
                }
                if(a == b){
                    System.out.println("a == b" + ":equals");
                }else {
                    System.out.println("a == b" + ":not equals");
                }
                
                Integer c = new Integer(1);
                Integer d = new Integer(1);
                if(c.equals(d)){
                    System.out.println("c.equals(d)" + ":equals");
                }else {
                    System.out.println("c.equals(d)" + ":not equals");
                }
                if(c == d){
                    System.out.println("c == d" + ":equals");
                }else{
                    System.out.println("c == d" + ":not equals");
                }

    output:

    a.equals(b):equals
    a == b:equals
    c.equals(d):equals
    c == d:not equals

    Integer常量赋值和new Integer对象是不一样的。

    4,BigDecimal

                    BigDecimal a = new BigDecimal("0.02");
            BigDecimal b = new BigDecimal(0.02);
            System.out.println(a);
            System.out.println(b);

    output:

    0.02
    0.0200000000000000004163336342344337026588618755340576171875

    要准确的,以字符串的形式。

    5、String,StringBuffer ,StringBuilder

    String
    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {}

     private final char value[];//string存储在char数组中。

    String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

    字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:

         String str = "abc";
     

    等效于:

         char data[] = {'a', 'b', 'c'};
         String str = new String(data);

    String的定义,不可变的类。

    字符串常量池(String pool, String intern pool, String保留池) 是Java方法区中一个特殊的存储区域, 当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。 
    如下面的代码所示,将会在堆内存中只创建一个实际String对象. 

    例如:

    String s1 = "abcd"; 
    String s2 = "abcd"; 

     参考:https://blog.csdn.net/ylyg050518/article/details/52352993

    StringBuffer

    线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

    可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

    StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

    与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

    StringBuilder

    一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

    在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。

    将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer

    Java中的String,StringBuilder,StringBuffer三者的区别:https://www.cnblogs.com/su-feng/p/6659064.html

    6,HashMap的原理

    参考:http://www.importnew.com/18633.html

    7,基本类型优于装箱基本类型

        先看两个例子:

    Long sum = 0L;
            long start = System.currentTimeMillis();
            for(long i = 0;i < Integer.MAX_VALUE;i++){
                sum +=i;
            }
            long end = System.currentTimeMillis();
            System.out.println(sum);
            System.out.println(end - start + "ms");

    output:

    2305843005992468481
    5508ms

    long sum = 0L;
            long start = System.currentTimeMillis();
            for(long i = 0;i < Integer.MAX_VALUE;i++){
                sum +=i;
            }
            long end = System.currentTimeMillis();
            System.out.println(sum);
            System.out.println(end - start + "ms");

    output:

    2305843005992468481
    612ms

    很明显,第二个比第一个快了很多,因为第一个用的是大写的Long类型。变量被反复的装箱和拆箱,导致性能明显下降。

    参考:《effective java 2th》

    8,static

       thingKing in java : 希望某个方法不与包含它的类的任何方法关联在一起。两个术语:类数据类方法。他们作为整个类,而不是类的某个特定对象而存在的。

       有四种用法:

       1)static变量

       2)static方法

       3)static块

       4)static导入包

      1)static变量:

    package com.test.basicJava;
    
    public class StaticTest {
        static int x = 1;
        public StaticTest(){
            this.x = 2;
        }
        public void setValue(int i){
            this.x = i;
        }
        public int getValue(){
            return this.x;
        }
        public static void main(String[] args) {
         System.out.println(StaticTest.x);
         StaticTest test1 = new StaticTest();
         StaticTest test2 = new StaticTest();
         
         test1.setValue(3);
         test1.setValue(4);
         System.out.println(test1.getValue());
         System.out.println(test1.getValue());
        }
    
    }

    输出:1,4,4

    解释:StaticTest.x只有一份空间。test1.x和test2.x指向同一存储空间。

      2)static方法

       thinking in java:static方法一个重要用法就是在不创建任何对象的情况下,可以调用它。这一点对定义main()方法很重要,是一个应用时的入口点。

    public class StaticTest {
        public static void staticMethod() {
            System.out.println("static method test");
        }
    
        public static void main(String[] args) {
            StaticTest.staticMethod();
        }
    
    }

    output: static method test

     3)static块:

    public class StaticTest {
        static {
            System.out.println("static block");
        }
        public static void staticMethod() {
            System.out.println("static method test");
        }
    
        public static void main(String[] args) {
    //        StaticTest test = new StaticTest();
            StaticTest.staticMethod();
        }
    
    }

    以下情况会输出static块的内容:1,new对象;2,调用static方法;3extends父类,父类的static block会输出。

     4)static导入包

        import static .....   比较少用。

    参考:https://www.cnblogs.com/dolphin0520/p/3799052.html,https://www.cnblogs.com/dotgua/p/6354151.html?utm_source=itdadao&utm_medium=referral

    9 final

      通常指的是“这是无法改变的”。有三种用法:数据,方法和类。

     1)数据

      用在:一个永不改变的编译时常量;一个在运行时被初始化的值,而你不希望它被改变。

      一个即是static有时final的域只占据一段不可改变的存储空间。变量名常用大写字母表示,比如: private static final int VALUE = 1;

     2)方法

      把方法锁定,确保在继承中使方法行为保持不变,并且不会被覆盖。

     3)类

      final类禁止覆盖,不希望有子类。

    10 数据类型

       查看 GitHub上的数据类型部分

    11 n次幂运算

     有两种方式:左移运算,Math.pow()方法。比如求2的4次幂

    System.out.println( 2 << 3);
             System.out.println( Math.pow(2, 4));
    
    output:65536
    65536.0

    2用二进制表示 : 0000 0010

    向左移动三位变成:0001 0000

    转化成十进制就是 2的四次幂= 16

  • 相关阅读:
    关于guava实现线程池
    结构化方法与面向对象方法的比较
    敏捷开发与传统开发方式的比较
    C# 事件的使用方法
    C# 泛型反射的调用
    RPC 知识科普一下
    C#枚举(Enum)小结
    C#图片添加文字水印
    C#索引器
    C#隐式转换与显示转换
  • 原文地址:https://www.cnblogs.com/luoa/p/10480527.html
Copyright © 2011-2022 走看看