Thinking in Java 笔记(一)

来源:互联网 发布:老男孩 python 12期 编辑:程序博客网 时间:2024/06/06 00:31

做个小笔记,激励自己学习,方便查阅,欢迎小伙伴们提意见,彼此提高~

一、 一切皆对象

Java是非常纯粹的面向对象的语言。对象的生成是通过new 来创建,但是所谓的对象变量,如String s=new String("abc");  s 不是一个对象,而是对象的引用,它存储着可以调用到该对象的信息,类似于一个入口。 String s1=s; 赋值时赋得自然是引用,因此只要s1改变,s 也会跟着改变。

存储位置:

栈中存储的是确定生命周期、大小的项,如对象的引用(4 bytes)、基本类型。位于RAM中,向下移动分配新内存。存取速度快;

堆中存储真正的对象,大小和生命周期灵活分配,空的Object是8bytes。位于RAM中,向上移动分配内存,存取速度稍慢。

特例:8个基本类型和void

类型字节数包装类char2Characterboolean1Booleanbyte1Byteshort2Shortint4Integerlong8Longfloat4Floatdouble8Doublevoid-Void

ps: 这9个特例是由JVM预先创建的Class 对象;JVM采用unicode编码, 一个字符2个字节;这些基本类型存储的是字面值,而不是引用,他们构造的数组是一个对象,而不是基本类型,包括它在内的素有类都继承自根类Object ;

可以使用如下代码验证一下基本类型的数组和对象数组的区别

import  java.util.*;public class ObjectArray{public static void main(String[] args){int [] intArray1 = new int[]{1,2,3};          int [] intArray2 = new int[4];          int[][] intArray2D = new int[2][3];          String [] stringArray = new String[]{"a","b","c"};          System.out.println(intArray1.getClass().equals(intArray2.getClass()));//true, int[] 是一个类 extends Object        System.out.println(intArray1.getClass().equals(stringArray.getClass())); //false         System.out.println(intArray1.getClass().equals(intArray2D.getClass()));  //false,int[][] 是Object[]         System.out.println(intArray1.getClass().getName());  // [I ,应该代表着int []的意思        System.out.println(intArray1.getClass().getSuperclass().getName());  //超类java.lang.Object        System.out.println(stringArray.getClass().getName());//[L java.lang.StringSystem.out.println(stringArray.getClass().getSuperclass().getName());  //java.lang.Object//Object[] extends Object        Object aObj1 = intArray1;          Object aObj2 = stringArray;          //Object[] aObj3 = intArray1;//编译不通过,required Object[],found int[]          Object[] aObj4 = intArray2D;          Object[] aObj5 = stringArray;                    System.out.println(intArray1); //打印出对象的HashCode [I@9789f68          System.out.println(stringArray); //打印出对象的HashCode  [L java.lang.String;@16adf9        System.out.println(Arrays.asList(intArray1)); //打印出HashCode  [[I @9673f13        System.out.println(Arrays.asList(stringArray)); //打印出[a,b,c] }}


二、 操作符

1、 == 和 equals

==和!= 用于基本类型时,比较的是字面值是否相等;用于对象时,判断的是两个比较对象的引用是否相同,i.e. 二者在内存中的位置(hashCode)是否一致;如果要只单纯比较两个对象的字面值,可以重写equals方法

常量池(Constant Pool)用于存储编译期就已经确定的数据,如字符串常量、基本类型常量,如果有就不会在创建只是将引用指向该位置。

String s=new String("hello");如果常量池中没有该字符串,那这句话实际上创建了两个对象,一个把内容保存在常量区,一个把对象保存在堆中。

可以通过以下代码比较二者的不同

public class StringEquals{public static void main(String[] args){String s1="thinking ";String s2="in java";String s3="thinking in java";String s4="thinking "+"in java";String s5=s1+s2;String s6=new String("thinking in java");System.out.println(s3=s4);//thinking in java ;普通的赋值返回s3System.out.println(s3==s4);//true;常量池中已经存在System.out.println(s5==s4);//false;s5需要等到运行时才知道他的值,不在常量池中System.out.println(s6==s5);//false;两个对象引用不一致System.out.println(s6.equals(s5));//true;String改写了equals方法,内容一致返回trueSystem.out.println(s6.equals(s4));//true;String改写了equals方法,内容一致}}

2、位操作

<< 向左移位,低位补0;>>向右移位,负数高位补1,正数高位补0;>>>逻辑右移位,无论正负,高位补0

可以用位操作来测算基本类型所占的位数

public class TypeRange{public static void main(String[] args){char c=1;byte b=1;short s=1;int i=1;long L=1L;int cnt;for(cnt=1;(b<<=1)!=0;cnt++);//向左移位,即每次乘2,直到越界,变成0System.out.println("byte bits: "+cnt);//8for(cnt=1;(c<<=1)!=0;cnt++);System.out.println("char bits: "+cnt);//16for(cnt=1;(s<<=1)!=0;cnt++);System.out.println("short bits: "+cnt);//16for(cnt=1;(i<<=1)!=0;cnt++);System.out.println("int bits: "+cnt);//32for(cnt=1;(L<<=1)!=0;cnt++);System.out.println("long bits: "+cnt);//64}}

对char,short,byte 进行移位操作的时候,它们会先被转换成int,然后被截断返回原来的类型;boolean 值不能做算术运算,只有逻辑运算

0 0
原创粉丝点击