一、Random 随机数
导包 import java.util.Random;
创建对象 Random r = new Random();
获取随机数 int number = r.nextInt(10);
二、数组
数组是存储同一种数据类型多个元素的容器。
例如:int[] arr = new int[3];
JVM内存划分:Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈 存储局部变量
堆 存储new出来的东西
方法区
本地方法区 (和系统相关)
寄存器 (给CPU使用)
数组的内存分配:
两个数组指向同一个地址的内存图:
定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。然后给第二个数组赋值,再次输出两个数组的名及元素。
两个常见小问题:
java.lang.ArrayIndexOutOfBoundsException
数组越界异常,产生的原因:就是你访问了不存在的索引元素。
B:java.lang.NullPointerException
空指针异常,产生的原因:数组已经不指向堆内存的数据了,你还使用数组名去访问元素。
二维数组:就是一个元素为一维数组的数组。
1.遍历
首先使用循环遍历出二维数组中存储的每个一维数组,然后针对每个遍历到的一维数组在使用循环遍历该一维数组中的元素。
for(int y=0; y<arr.length; y++) {
for (int x = 0; x < arr[y].length; x++) {
System.out.print(arr[y][x] + " ");
}
System.out.println();
}
三、方法(方法就是完成特定功能的代码块)
方法重载:
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
方法中参数传递:
方法的参数是基本类型的时候,形式参数的改变不影响实际参数。
方法的形式参数为引用数据类型
四、API
API(Application Programming Interface) : 应用程序编程接口.
(1)使用API步骤:
A:打开帮助文档
B:点击显示,找到索引,看到输入框
C:你要学习什么内容,你就在框框里面输入什么内容。 举例:Random
D:看包 。java.lang包下的类在使用的时候是不需要导包的
E:看类的描述。 Random类是用于生成随机数的类
F:看构造方法。Random():无参构造方法 Random r = new Random();
G:看成员方法。 public int nextInt(int n):产生的是一个[0,n)范围内的随机数。
五、Scanner类
用Scanner类的方法可以完成接收键盘录入的数据。
/*
* Scanner:用于获取键盘录入的数据。(基本数据类型,字符串数据)
* public String nextLine():获取键盘录入的字符串数据
*/
public class ScannerDemo {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//接收数据
System.out.println("请输入一个字符串数据:");
String s = sc.nextLine();
//输出结果
System.out.println("s:"+s);
}
}
六、String类
/*
* String:字符串类
* 由多个字符组成的一串数据
* 字符串其本质是一个字符数组
*
* 构造方法:
* String(String original):把字符串数据封装成字符串对象
* String(char[] value):把字符数组的数据封装成字符串对象
* String(char[] value, int index, int count):把字符数组中的一部分数据封装成字符串对象
*
* 注意:字符串是一种比较特殊的引用数据类型,直接输出字符串对象输出的是该对象中的数据。
*/
public class StringDemo {
public static void main(String[] args) {
//方式1
//String(String original):把字符串数据封装成字符串对象
String s1 = new String("hello");
System.out.println("s1:"+s1);
System.out.println("---------");
//方式2
//String(char[] value):把字符数组的数据封装成字符串对象
char[] chs = {'h','e','l','l','o'};
String s2 = new String(chs);
System.out.println("s2:"+s2);
System.out.println("---------");
//方式3
//String(char[] value, int index, int count):把字符数组中的一部分数据封装成字符串对象
//String s3 = new String(chs,0,chs.length);
String s3 = new String(chs,1,3);
System.out.println("s3:"+s3);
System.out.println("---------");
//方式4
String s4 = "hello";
System.out.println("s4:"+s4);
}
}
创建字符串对象两种方式的区别
String类的判断功能:
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
boolean startsWith(String str):判断字符串对象是否以指定的str开头
boolean endsWith(String str):判断字符串对象是否以指定的str结尾
String类的转换功能:
char[] toCharArray():把字符串转换为字符数组
String toLowerCase():把字符串转换为小写字符串
String toUpperCase():把字符串转换为大写字符串。
七、StringBuilder
StringBuilder:是一个可变的字符串。字符串缓冲区类。
String和StringBuilder相同:底层均采用字符数组value来保存字符串
String和StringBuilder的区别:String类的value数组有final 修饰,指向不可改,同时private 未提供修改value数组的方法。StringBuilder类的value数组没有final修饰,可以改变指向,且可以扩容,扩容通过新建字符数组完成。
即:String的内容是固定的,而 StringBuilder的内容是可变的。
每次拼接都会产生新的字符串对象,而利用StringBuilder来拼接字符串自始至终用的都是同一个StringBuilder容器。
StringBuilder类的常用方法:
A:构造方法:StringBuilder()
B:成员方法:
public int capacity():返回当前容量 (理论值)
public int length():返回长度(已经存储的字符个数)
public StringBuilder append(任意类型):添加数据,并返回自身对象
public StringBuilder reverse():反转功能
八、对象数组
A:基本类型的数组:存储的元素为基本类型 int[] arr={1,2,3,4}
B:对象数组:存储的元素为引用类型 Student[] stus=new Student[3];
对象数组的内存图
九、集合类之ArrayList
集合概述
想对多个对象进行存储(不固定),就不能是一个基本的变量,而应该是一个容器类型的变量。
集合类的特点:长度可变。
ArrayList删改查方法:
A:获取元素 public E get(int index):返回指定索引处的元素
B:集合长度 public int size():返回集合中的元素的个数
C:删除元素 public boolean remove(Object o):删除指定的元素,返回删除是否成功
public E remove(int index):删除指定索引处的元素,返回被删除的元素
D:修改元素 public E set(int index,E element):修改指定索引处的元素,返回被修改的元素
ArrayList遍历
集合的遍历思想和数组的遍历思想相同,循环遍历容器,依次取出里面的元素即可.
十、IO
IO流概述:
IO流用来处理设备之间的数据传输, Java对数据的操作是通过流的方式,Java用于操作流的类都在IO包中。流按流向分为两种:输入流,输出流。
(1) FileWriter :向文件中写数据
FileWriter向文件中写数据操作步骤:
a:使用FileWriter流关联文件
b:利用FileWriter的写方法写数据
c:利用FileWriter的刷新方法将数据从内存刷到硬盘上
d:利用FileWriter的关流方法将释放占用的系统底层资源
FileWriter方法:
构造方法 FileWriter(String fileName) 传入一个文件的路径成员方法
void write(String str) 向文件中写str
void flush() 将内存中的数据刷新到文件中
void close() 关流释放系统底层资源
/*
* 需求:往文件中写数据
* 写数据--输出流--FileWriter
*
* FileWriter:
* FileWriter(String fileName):传递一个文件名称
*
* 输出流写数据的步骤:
* A:创建输出流对象
* B:调用输出流对象的写数据的方法
* C:释放资源
*/
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//创建输出流对象
FileWriter fw = new FileWriter("d:\\a.txt");
/*
* 创建输出流对象做了哪些事情:
* A:调用系统资源创建了一个文件
* B:创建输出流对象
* C:把输出流对象指向文件
*/
//调用输出流对象的写数据的方法
//写一个字符串数据
fw.write("IO流你好");
//数据没有直接写到文件,其实是写到了内存缓冲区
fw.flush();
//释放资源
//通知系统释放和该文件相关的资源
fw.close();
//while(true) {}
}
}
FileWriter其它写方法:
void write(String str):写一个字符串数据
void write(String str,int index,int len):写一个字符串中的一部分数据
void write(int ch):写一个字符数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int类型的值。‘a’,97
void write(char[] chs):写一个字符数组数据
void write(char[] chs,int index,int len):写一个字符数组的一部分数据
FileWriter写入换行以及向文本末尾追加:
/*
* 如何实现数据的换行?
* \n可以实现换行,但是windows系统自带的记事本打开并没有换行,这是为什么呢?因为windows识别的换行不是\n,而是\r\n
* windows:\r\n
* linux:\n
* mac:\r
* 如何实现数据的追加写入?
* FileWriter(String fileName, boolean append)
*/
public class FileWriterDemo4 {
public static void main(String[] args) throws IOException {
//创建输出流对象
//FileWriter fw = new FileWriter("c.txt");
FileWriter fw = new FileWriter("c.txt",true); //表示追加写入,默认是false
for(int x=0; x<10; x++) {
fw.write("hello"+x);
fw.write("\r\n");
}
//释放资源
fw.close();
}
}
(2)FileReader类
/*
* 需求:从文件中读数据并显示到控制台
* 读数据--输入流--FileReader
*
* FileReader:
* FileReader(String fileName):传递文件名称
*
* 输入流读文件的步骤:
* A:创建输入流对象
* B:调用输入流对象的读数据方法
* C:释放资源
*
* java.io.FileNotFoundException: fr.txt (系统找不到指定的文件。)
*/
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
//创建输入流对象
// FileReader fr = new FileReader("fr.txt");
FileReader fr = new FileReader("FileWriterDemo.java");
//调用输入流对象的读数据方法
//int read():一次读取一个字符
/*
//第一次读数据
int ch = fr.read();
System.out.println(ch);
System.out.println((char)ch);
//第二次读数据
ch = fr.read();
System.out.println(ch);
System.out.println((char)ch);
//第三次读数据
ch = fr.read();
System.out.println(ch);
System.out.println((char)ch);
//这是时候,我们发现代码的重复度很高,想用循环改进,但是不知道循环的结束条件是什么
ch = fr.read();
System.out.println(ch);
ch = fr.read();
System.out.println(ch);
//通过测试,我们知道,如果读取数据的返回值是-1的时候,就说明没有数据了,这也是我们循环的结束条件
*/
int ch;
//1:fr.read()
//2:ch=fr.read()
//3:ch != -1
while((ch=fr.read())!=-1) {
//System.out.println(ch);
//System.out.println((char)ch);
System.out.print((char)ch);
}
//释放资源
fr.close();
}
}
可以利用FileReader和FileWriter完成文件复制。
拷贝文件的两种方式图解
(3)缓冲流
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。