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

posted @ 2019-03-05 23:18  阿罗luo  阅读(186)  评论(0)    收藏  举报