第一阶段
19、API
应用程序编程接口 JDK-API帮助文档
Scanner:键盘录入
Random:随机数
java.io:读取文件的内容,把数据写入文件中
java.lang:提供利用java编程语言进行程序设计的基础类
20、字符串String
字符串内容不会发生改变,对象创建后不会发生改变
String是java定义的类,使用时不需要导包
创建String对象的方式(如下图所示):
1、 String name="abd";
2、new
*字符数组->字符串:*
若想修改字符串的内容,可以将字符串转换成字符数组,修改字符数组的内容后,再转换成字符串
*字节数组->字符串:*
在网络中传输的数据都是字节信息,一般要把字节信息进行转换,转成字符串,就要用到这个构造
byte[] bys={97,98,99,100};
String str=new String(bys);
内存模型
内存包括栈内存、堆内存、方法区
栈:方法运行时进栈,执行完毕后出栈
堆:new出来的对象
方法区:字节码文件临时存储,class文件
StringTable(字符串常量池):直接赋值的方式才能存储在这里面,JDK7之后,串池从方法区挪到了堆
直接赋值时,先检查串池中是否存在该字符串,若没有,创建新的,若有,复用
new方法,如果存在,不会复用,因此会浪费内存

21常用方法
比较
1、== 基本数据类型比较的是数据值;
引用数据类型比较的是地址值
(每次new出来的地址是不同的,且new出来记录的是堆里的地址;
直接赋值的字符串会复用,这种情况下地址是相同的,记录的是串池中的地址)
例如:Scanner sc=new Scanner(System.in);
String str1=sc.next();
String str2="abc";
str1==str2;
2、比较字符串中的内容是否相等:
boolean equals(要比较的字符串) 必须一模一样,不忽略大小写
boolean equalsIgnoreCase(要比较的字符串) 忽略大小写比较
public char charAt(int index):根据索引返回字符
public int length():返回字符串的长度
数组的长度:数组名.length
字符串的长度:字符串对象.length()
截取 String substring(int beginIndex,int endIndex) 包头不包尾;只有返回值才是截取的小串
String substring(int beginIndex) 截取到末尾
替换 String replace(旧值,新值) 只有返回值是替代后的结果
22、StringBuilder
StringBuilder可以看做一个容器,创建之后里面的内容是不可变的,可以提高字符串的操作效率
构造方法:public StringBuilder(){}
public StringBuilder(String str){}
成员方法:public StringBuilder append(任意类型):添加数据,并返回对象本身
public StringBuilder reverse():反转容器里面的内容
public int length(){}
public String toString():把StringBuilder转换成String
普及:1、StringBuilder是已经java写好的类,java对其进行了特殊处理,因此打印对象返回的不是地址值,是属性值
2、链式编程:调用一个方法的时候,不需要用变量接收结果,可以继续调用其他方法
例如:int len=getString().substring(1).replace("a","q").length();
sb.append("aaa").append("bbb").append("ccc").append("ddd");
3、使用StringBuilder的场景:字符串的拼接;字符串的反转;
23、StringJoiner
容器,创建之后内容可变,提高字符串的操作效率,JDK8出现
public StringJoiner(间隔符号)
public StringJoiner(间隔符号,开始符号,结束符号)
public StringJoiner add(添加的内容) :添加数据并返回对象本身
public int length():返回长度(字符出现的个数,包括间隔符号、开始符号、结束符号)
public String toString():返回一个字符串,该字符串是拼接后的结果,包括间隔符号、开始符号、结束符号
24、字符串原理
1、字符串存储的内存原理:
直接赋值会复用字符串常量池中的
new出来的会开辟新空间
2、==号:基本数据类型比较的是数据值
引用数据类型比较的是地址值
3、字符串拼接的底层原理:
等号右边没有变量:都是字符串,编译时就已经把字符串拼接好了,已经是最终结果,因此运行时会复用常量池中的字符串
等号右边有变量:JDK8之前:创建StringBuilder对象,append方法拼接后调用toString方法返回String,toString方法的底层是new了一个字符串对象,因此一个加号至少创建两个对象
JDK8之后:先预估拼接后字符串的长度创建一个数组,将字符串放入后拼接成新的字符串
虽然但是,+很浪费时间,拼接字符串还是用StringBuilder、StringJoiner更好
例如:String s1="abc"
String s2="ab"
String s3=s2+"c"
System.out.println(s1==s3)
//输出是false,因为s1和s3是引用数据类型,==比较的是地址值,s1为直接赋值,返回的是常量池中的地址,s3右侧有变量,无论是JDK8之前还是之后,都会new一个新的对象,会开辟新的空间,因此两者的地址不同,因此返回false
例如:String s1="abc"
String s2="a"+"b"+"c"
System.out.println(s1==s2)
//输出是true,s1是直接赋值,返回的是常量池中的地址,s2等号右边没有变量,编译时已经是拼接好的字符串,因此运行的时候会复用常量池中的字符串,返回的也是常量池中的地址,因此返回true
4、StringBuilder提高效率原理
所有要拼接的内容都存放在StringBuilder中,不会创建无用空间
5、StringBuilder源码分析
默认容量是16(最多可以存放多少)//sb.capacity()
长度:实际存放多少//sb.length()
扩容:老容量*2+2,如果实际长度超出老容量*2+2,则以实际容量为准
6、如果看到需要修改字符串,有两种方法:
1、用subString进行截取,将左边字符截取出来拼接到右侧
2、将字符串变成字符数组,调整字符数组里面的内容,最后再将字符数组变成字符串
25、集合
集合:自动扩容; 只能存引用数据类型和包装类,不能存基本数据类型
数组:长度固定; 可存基本数据类型和引用数据类型
26、ArrayList
JDK7之前:ArrayList<E> list=new ArrayList<E>();
JDK7之后:ArrayList<E> list=new ArrayList<>();
E是泛型,限定集合中存储数据的类型,只能是引用数据类型
此时,我们创建的是ArrayList的对象,ArrayList是java已经创建好的类,底层已经对这个类做了一些处理,因此,打印对象不是地址值,而是集合中存储的数据内容,展示时会用[]将所有的数据进行包裹
成员方法:
1、增:boolean add(E e)
2、删:boolean remove(E e)
E remove(int index):返回被删除的元素
3、改:E set(int index,E e):修改指定索引的元素,返回原来的元素
4、查:E get(int index):获取指定索引的元素
int size():返回集合中元素的个数
基本数据类型对应的包装类:
byte - >Byte
short ->Short
char ->Character
int ->Integer
long ->Long
float ->Float
double ->Double
boolean->Boolean
System.exit(0);
练习:学生管理系统