算术 自增自减 逻辑 比较 赋值 位 移位 三元
问题: 区分 &&(短路与) 与 &(不会短路)
int a =5,b=3;
boolean b1 = b > a && a++ > 5; //短路与
System.out.println(b1); false
System.out.println(a); 5
boolean b2 = b>a || a++ > 5;
System.out.println(b2) false
System.out.println(a); 6
boolean b3 = b>a & a++ > 5;
System.out.println(b3);// ??? false &不会短路
System.out.println(a); 7
// & 即是逻辑运算符,还是位运算符。 || 和 | 同理
System.out.println(5 & 3); //101 & 011 001 1
System.out.println(5 | 3);// 7
System.out.println(5 ^ 3); // 6
问题:boolean b4 = 5 & 2 ==0;
关键:运算优先级
错误, == 的优先级 大于 &
5 & false 错误 ,该加运算符加运算符
锻炼程序逻辑
public static void main(String[] args) {
//请定义一个长度为5的整型数组,写出三种方式,内容不
int[] a = new int[5];
int[] a1 = new int[]{1,2,3,4,5};
int[] a2 = {5,6,7,8,9};
int x = 0x4554617c;
System.out.println(a);
// [I@4554617c I表示类型。@表示在 后面的数字可以理解为地址,
// 实际为hashcode值 16进制
// a变量中存储的是地址,Java中叫引用
System.out.println(a.hashCode());
System.out.println(x);
基础数据类型变量中存储的是变量本身,引用数据类型变量中存储的是变量的引用(地址),指向真正存储数据的空间。
为什么这么设计?直接存储不行吗?
主要关键点:内存问题,栈很小,堆很大
因为内存分为栈和堆,栈的特点是少,快,堆的特点是多,慢。
直接存储是存在栈中,栈的空间会很快用完,会发生错误,而采用引用,可以有效利用堆。实际上这种结合的思想和cache 和缓存结合的思想一致。
//这种设计是基于堆,栈空间的特征
//默认值 ,有空间即有值 0/0.0 false null
数组打印
//1.格式化打印
System.out.println(Arrays.toString(a1));//Arrays ,数组操作的帮助类,toString()格式化打印
}
//for 循环
//增强 for 循环 (foreach)
课堂练习
扩容的思路:重新定义数组,拷贝原来的值,新的引用赋值给原变量
public class A2 {
public static void main(String[] args) {
//从控制台循环获取用户输入的成绩(int),当用户输入-1时,停止录入
//然后,打印出从小到大排序后的结果。
Scanner s = new Scanner(System.in);
int [] a = new int[5];
System.out.println("请循环输入成绩:");
int count = 0;
while (true){
int c = s.nextInt();
if(c== -1){
break;
}
//判断+扩容
//手动
// if(count == a.length){
// int [] a1 = new int[2 * a.length ];
// for (int i = 0; i < a.length ; i++) {
// a1[i] = a[i];
// }
// a = a1;
//
// }
//调用API 扩容
if(count == a.length){
a = Arrays.copyOf(a,a.length*2 );}
a[count++] = c;
}
//格式化输出
System.out.println(Arrays.toString(a));
//排序
//默认从小到大排序
Arrays.sort(a);
System.out.println(Arrays.toString(a));
//把0去掉 , 0不好看
int[] a3 = new int[count];
//拷贝到新的数组
System.arraycopy(a,0,a3,0,count); //省去了手动for
System.out.println(Arrays.toString(a3));
//从大到小排序
//第二个参数是一个比较级
//面向对象会讲,匿名接口类,泛型
Integer[] a4 = new Integer[count];
for (int i = 0; i < count ; i++) {
a4[i] = a3[i];
}
//因为比较级的参数是Integer,所以数组类型要转成Integer
Arrays.sort(a4, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println(Arrays.toString(a4));
//另一种写法,Lambda表达式(函数式编程)
Arrays.sort(a4,(o1,o2)-> o2 -o1);
System.out.println(Arrays.toString(a4));
}
}
总结:排序 ,Arrays.sort()
扩容:Arrays.copyof()
拷贝:System.arraycopy()
原文:https://www.cnblogs.com/moshanghuai/p/13584883.html