成长日记(1) Java基础复习

本文主要记录一些在学习时不曾注意和以前学习不完善的地方,也希望给大家提供一个参考。

八大基本数据类型 与其字节数(比特数)  和一些不常用的小细节

* boolean 1比特   true and false  也可以算1字节吧
* byte1字节 -128-127 8比特
* short2字节 16比特
* char2字节 16比特
* int 4字节 32比特
* float 4字节 32比特
* double 8字节 64比特
* long 8字节 64比特
*0b1011二进制
*0xff十六进制
*0377 8进制
*'\u0061' char十六进制

*Integer.MAX_VALUE +1 int最大值+1 会变成负数最小值

*2-1.9 = 0.100000
*4.35 *100 = 434.99999

*^位运算符:其主要是对两个操作数进行位的异或运算,相同取0,相反取1。即两操作数相同时,互相抵消。
举例:比如int a =15; int b=2; a的二进制是1111 b的二进制是0010 所以结合 1101 为13 所以 a^b=13

 

缓存池

*主要讲 new Integer(123) 和 Integer.valueof(123) 的区别 Integer a = 123 相当于 Integer.valueof(123)
*new Integer(123) 每次引用都会创造一个新的对象 内存地址不同 并且不会放入缓存值 当值小于-128 或大于127 时就是new一个在堆中
*当两个Integer 相加的时候 会拆箱为基本数据类型相加 所以基本类型的值相同 所以为相同
*Integer.valueof(123) 每次调用前都会先去缓存池中寻找对象 如果找到了直接引用 找不到就new Integer(123) 如果范围超过-128到127 就会重新new一个 新对象
*在java8中 缓存池的大小为-128 到 127
*Integer Short Byte Character Long 这几个类的valueOf方法的实现是类似的,引用
*两个Integer相加会先自动拆箱变成int相加 再自动装箱变为Integer
*Double Float 的valueOf方法实现类似 因为是浮点数,每次都返回不同的对象 (new一个对象)
*boolean缓存池 true and false
*char 缓存池 \u0000 到 \u007F

Scanner的一些小细节

*Scanner reader = new Scanner(System.in)
* reader.hasNext() 判定是否有输入 返回true or false
*如果输入 reader.hasNextLine 那么后接收时 也要使用 reader.nextLine();
* 其中hasNext是检查是否有非空字符 而hasNextLine是检查输入中是否还有linePattern 其中LinePattern其实是匹配一个正则表达式
*则说明 当输入 5 3 2 1 1后面是空字符 那么对于hasNext来说 输入已经结束了 而对于hasNextLine来说 没有结束
*reader.next() 不能得到有空白符的字符串 reader.nextLine() 则可以

循环语句

switch语句注意事项 从java7开始 可以在switch条件判断语句中使用String对象
*switch(内容) 内容对于基本数据类型 只能放入 byte int shot char 对于引用数据类型 只能放入String enum枚举
*如果进入后 break不写 则会穿透到下一个语句 不论case是否满足
*switch 不支持long 是因为switch的设计初衷是对那只有少数的几个值进行判断,如果值过于复杂 还是if比较合适

for循环语句:可以使用 for(int i=0,j=0;i<10;i++,j++)
*可以在for循环前标注 名称:for循环 的方式给for循环命名 在内部循环中 可以通过 break 名称; 直接跳出外部循环 (名称默认一般取名 outer)

 

数据类型强制转换

*一般情况下不建议使用数据类型的强制转换 byte shot char 类型相加 都会先变成int类型然后相加 所以结果也是int类型的
*比如 一个6000000000L的Long类型数字 转换成一个 int类型 那么会强制变成小于21亿 因为数据散了 因为int类型的最高就是这
*boolean类型不能发生数据类型转换
*ascii表 美国表 0-127
*Unicode表 万国表 0-127和美国一样 从128开始包含更多的字符
*当大的范围往小的范围变换时,需要强制转换 小的往大的转换会自动转换

 

数组一些细节及内存划分

*数组的静态初始化的省略格式,不能拆分成为两个步骤。 
int[] arrayd ; arrayd = {1,2,3} 这是错误的 必须 arrayd = new int[] {1,2,3};
*直接打印数组名称,得到的是数组对应的:内存地址哈希值。[I@6d06d69c
*其中中括号[ 代表这是数组 I代表里面都是int类型 后面这一串有字母有数字 其实代表的是16进制
*int[] array = null; 这只是设置了空值 里面什么都没有 获取元素会出现空指针异常 解决办法:后面new一下在堆中的内存就行

copy方法:Arrays.copyOf(6,a) 在a中取前a个成为一个新数组
*内存划分
*1.栈(Stack)
栈内存:存放的都是方法的局部变量。 方法的运行一定要在栈当中
局部变量: 方法的参数 或者是方法{}内部的变量
作用域:一旦超出作用域,立刻从栈内存中消失。
*2.堆(Heap):
凡是new出来的东西 都在堆当中。 堆内存里面的东西都有一个地址值:16进制
堆内存里面的数据。都有一个默认值 规则
如果是整数 默认为0 如创建有个数的int数组
如果是浮点数 默认为0.0
如果是字符 默认为'\u0000'
如果是布尔 默认为false
如果是引用类型 默认为null
*3.方法区(Method Area):存储.class相关信息 包含方法的信息
*4.本地方法栈(Native Method Stack):与操作系统相关
*5.寄存器(pc Regist):与CPU相关

数组内存图演示:
1.首先在方法区 创建一个main方法 public static void main(String[] args)
2.然后再栈中 给main方法的执行划出一块空间
3.然后在划出来的栈空间里 创建一个 Int[] array
4.由于 int [] array = new int [3]; 出现了new 所以为new int[3] 在堆内存中划出一块空间 为3 则划分3块小格 所以编号 0 1 2 默认值都为0 并设置地址 如 0x666 然而这个0x666也是当做一个变量 于是将0x666放回到栈当中 而栈中有了地址名称 则可以找到堆所创建的地方
5.之后输出array system.out.printl(array) 则返回其在栈中的内存值 0x666
6.输出数组的值 如 System.out.println(array[0])则从栈中找到地址 然后去找到堆中对应的地址 并找到相应值
7.改变数组的值同理

二维数组:
*当 int[][] a= new int[3][2]
这样一共创建了4个数组
*内部数组默认值为0
*外部数组存放内部数组的地址
*当 int[][]a = new int[3][]
这样创建了1个数组存放null值
*可以之后再创建数组放入
*a[0] = new int[4]
或者这样指定 int[][] a = {{},{},{}}

posted @ 2020-02-27 21:32  林狗狗狗  阅读(122)  评论(1)    收藏  举报