Class1:
String、StringBuffer、StringBuilder的内部原理:
计算机在读取任何数据时,都要先把指定地址发送过去,才能进行读取操作。
1字节是默认的存储单元,每次指令的传输是15-20ns,单个存储单元越大,读取速度越快,空间浪费越严重。
内存和磁盘的存储单元是4KB称为一页,磁盘侧重于存储,硬盘侧重于速度。
由于操作系统的特性,一个变量消耗的空间至少为4KB,而一个数组消耗的空间也为4KB。
字符串类型会根据需要的空间来申请,不会申请更大的空间
StringBuilder与StringBuffer会直接申请一个足够大的数组,当空间不足时会不断将空间大小x2直到空间足够为止
故在字符串拼接的循环中,StringBuilder与StringBuffer并不会重复的申请空间,而是直接将所需要拼接的字符串加入到剩余的空间中,对空间的消耗较小,效率高而字符串类型会不断的申请新的空间来存储字符串,效率差
例如:
String aaa = '01234'; // char[] arr = new char[5];
而StringBuffer // char[] arr = new char[4096];
输入输出:
Scanner位于java.util下
使用方式:
Scanner in = new Scanner ( System . in );
int a = in.nextInt();
实例:
import java.util.*;
public class Test3{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("What is your name?");
String name = in.nextLine();
System.out.println("How old are you?");
int age = in.nextInt();
System.out.println("Hello," + name + ".Next year,you will be" + (age + 1));
}
}
格式化输出:
指定格式输出
实例1:
public class Test4{
public static void main(String[] args){
String xx = String.format("===%s==%d%s===","大家好",23,"&&");
System.out.println(xx);
}
}
文件输入输出:
String dir = System.getProperty("user.dir "); //获取当前代码所在文件的路径
记事本的显示原理:
计算机中事先存在比特点对应的编码库,打字时计算机读取所打内容对应的编码,显示内容时相当于每次读固定的编码长度并根据编码类型进行匹配,随后显示在屏幕上。(前几位表示编码类型,后几位根据相应编码类型的编码值匹配形状库)
Word文档的显示原理:
Word中的每一个字符都预先有了编码,其常用字号以及每种字体都有编码,显示的过程中会等长读取每次输入内容的编码,与形状库进行匹配并显示对应的内容,对于不常用的字号会进行比例缩放进行显示,图片传入的是一整个形状库,直接显示整个形状库即可。
Class2:
多重选择,switch语句:
switch击穿:
如果case中没有break,会一直向下匹配直到遇到一个case其中包含了break
switch语句实例:
public class Test7{
public static void main(String[] args){
int a = 10;
int b = 9;
int c = 20;
String d = "小明";
switch(c){
case 10:
System.out.println("你是最棒的,抽中10元,花费10元");
break;
case 20:
System.out.println("你是最棒的,抽中10元,花费10元");
break;
case 50:
System.out.println("你是最棒的,抽中10元,花费10元");
break;
default:
System.out.println("你是最棒的,啥都没有,花费10元");
break;
}
}
}
switch可选类型:
大数值:
解决了基本类型超出范围的问题BigIneger、BigDecimal的精度不会丢失
BigInteger:所有的整数
BigDecimal:所有的小数
实例:
import java.util.*;
import java.math.*;
public class Test8{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("How many numbers do you want to draw?");
int k = in.nextInt();
System.out.println("What is the highest number you can draw?");
int n = in.nextInt();
BigInteger lotteryOdds = BigInteger.valueOf(1);
for(int i = 1;i <= k;i++){
lotteryOdds = lotteryOdds.multiply(BigInteger.valueOf(n - i + 1)).divide(BigInteger.valueOf(i));
}
System.out.println("your odds are 1 in "+lotteryOdds+". Good luck!");
}
}
数组:
int[] a = new int[10]; //生成的并不是一个空数组,默认值是0
多维数组:
建立与赋值实例:
非引用类型的句柄和值在同一个内存地址下,引用类型的"="相当于把指向位置换掉
数组的第一个元素的地址与数组的地址相同
二维数组结构如下:
C++中的指针和JAVA(所有涉及引用类型的语言)中的引用类型一样,在句柄=值中,都是改变自己的指向
如下图为将a[0]由"aaa"更替为"yyyyy"的过程
数组排序的封装方法:
Arrays.sort(arr); //将arr按升序排列