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
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 值不能做算术运算,只有逻辑运算
- Thinking in java 笔记(一)
- Thinking In Java 学习笔记(一)
- Thinking in Java 笔记(一)
- Thinking in Java阅读笔记(一)
- Thinking in Java 笔记(一)
- thinking in java 学习笔记(一)
- Thinking in java 学习笔记(一)
- 研读java编程思想--Thinking In Java笔记(一)
- thinking in java 学习笔记(一)之操作符
- Thinking in java学习笔记(一)--前三章
- Thinking in java 笔记(一)---重载 数组
- Thinking In Java (一)
- Thinking in Java笔记
- Thinking in java 笔记
- thinking in java 笔记
- thinking in java 笔记
- thinking in java笔记
- Thinking in Java【笔记】
- shell中,echo的颜色输出与光标定位
- leetcode-Valid Parentheses
- 每日算法之九:Regular Expression Matching
- 九度题目1008:最短路径问题
- Android NFC 開發教程
- Thinking in Java 笔记(一)
- NGUI中的HUD Text插件使用教程
- Redis c/c++, java 客户端连接
- matlab的find函数效率还是很高的
- Ubuntu 基本命令
- 位运算与组合搜索(一)
- 泛型与RTTI的关系小议
- 简单的自动测试系统
- [2012.7.20]易语言post教程 - 飞龙