(1)JAVA_HOME---JDK的安装(创建)
(2)CLASS_PATH--lib(创建)
(3)Path--bin(不创建)
(1)JDK--Java开发工具包--想要编写程序,必须安装
(2)JRE--Java运行环境
(3)JVM--Java虚拟机
整数型:byte short int long
浮点型:float double
字符:char
布尔:boolean
(1)整数默认是int类型
(2)浮点默认是double类型
(3)byte,short,char比int小的类型,可以在范围内直接赋值
(4)后缀: L--long F--float D--double
(5)前缀:Ob--二进制 O--八进制 Ox--十六进制
package cn.tedu.basic;
/**本类用于测试各种类型变量的默认值*/
/**总结:
* 1.整形类型数据的默认值是0
* 2.浮点型类型数据的默认值是0.0
* 3.布尔类型数据的默认值是false
* 4.字符型类型数据的默认值是\u0000,在eclipse中是一个空格
* 5.引用类型【除8大基本类型以外的类型】默认值是null
* */
public class TestVariable1 {
static String name;
static byte a;
static short b;
static int c;
static long d;
static float e;
static double f;
static char g;
static boolean h;
public static void main(String[] args) {
/**由于main()方法是被static静态修饰的
* 所以main()想要使用这些变量也得是静态的*/
System.out.println(name);
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
System.out.println(f);
System.out.println(g);
System.out.println(h);
}
}
符号在前,先改变变量本身的值,再使用
符号在后,先试用,再改变变量本身的值
1&1=1
1&0=0
0&1=0
0&0=0
1|0=1
0|1=1
1|1=1
0|0=0
if(判断条件){
符合判断条件后要执行的代码,如果不符合条件,此句代码会被跳过
}
package cn.tedu.review;
import java.util.Scanner;
/**本类用于复习分支结构*/
public class TestIf {
//0.创建程序的入口函数main
public static void main(String[] args) {
/**1.单分支结构*/
int a = 100;
if(a>50&&a<=100) {
System.out.println("满50");
}
if(a>30&&a<=50) {
System.out.println("满30");
}
//1.接收用户在键盘输入的代码函数,判断用户的代码熟练度
int num = new Scanner(System.in).nextInt();
System.out.println("请输入代码的行数:");
if(num>=70000) {
System.out.println("恭喜你,高薪offer正在等待你");
}else {System.out.println("请再接再厉");}
}
}
char gender = '男';
if(gender=='男'){
System.out.println("男生可以玩滑板");
}else{
System.out.println("女生可以化妆");
}
if(判断条件1){
满足判断条件1,执行代码1
}else if(判断条件2){
满足判断条件2,执行代码2
}else if(判断条件3){
满足判断条件3,执行代码3
}else{
以上条件都不满足,执行代码4
}
switch(Exception){
case value : Syetem.out.println(1) break;
case value : Syetem.out.println(2) break;
case value : Syetem.out.println(3) break;
case value : Syetem.out.println(4) break;
default:Syetem.out.println(0) break;
package cn.tedu.review;
import java.util.Scanner;
/**本类用于练习选择结构*/
public class TestSwitch {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入您想进入的房间号:");
String s = scan.next();
switch(s) {
case"天":System.out.println("请玩家进入天字一号房间");break;
case"地":System.out.println("请玩家进入地字二号房间");break;
case"玄":System.out.println("请玩家进入玄字三号房间");break;
case"黄":System.out.println("请玩家进入黄字四号房间");break;
default:System.out.println("哪里来的混子,乱棍打出去");
}
}
}
(1)break:直接跳出当前for循环,执行此循环外部接下来的代码
for(){
//代码1......
if(//条件){
//代码3......
break;
//代码4......
}
//代码2......
}
(2)continue:略过本轮循环continue后半部分代码,直接开始下一轮循环
for(){
//代码1...
if(//条件){
//代码3...
continue;
}
//代码2...
}
字节 | 默认值 | 范围 | 对应关系 | |
byte | 1 | 0 | -128~127 | Byte |
short | 2 | 0 | -32768~32767 | Short |
int | 4 | 0 | -21E~21E |
Integer |
long | 8 | 0L | -2*10^63~2*10^63-1 | Long |
float | 4 | 0.0f | Float | |
double | 8 | 0.0d | Double | |
char | 2 | \u0000 | 0~65535 | Character |
boolean | 1 | false | Boolean |
public static void main ( String[] args) { }
方法的修饰符 方法的返回值类型 方法名 参数列表 方法体
package cn.tedu.method;
/**本类用作方法的入门案例*/
public class TestMethod {
//1.创建程序的入口函数main
public static void main(String[] args) {
System.out.println(1);
/**2.一个方法会不会执行,取决于有没有调用这个方法*/
/**我们通过方法名+参数列表来确定要调用哪个方法*/
method1();
System.out.println(2);
method2(6);
method3(2,5);
method4("张三",2.7d);
}
//需求,创建方法四打印张三今晚要吃2.7碗大米饭
private static void method4(String name, double d) {
System.out.println(name+"今晚要吃"+d+"碗大米饭");
}
private static void method3(int i, int j) {
System.out.println(i*j);
}
/**3.本方法用于测试方法的参数*/
private static void method2(int n) {
System.out.println("海绵宝宝今年"+n+"岁啦");
}
/**1.method1()用于测试方法的调用顺序
* 方法定义的格式
* 修饰符 返回值类型 方法名(参数列表){方法体}*/
private static void method1() {
System.out.println(5);
System.out.println(6);
System.out.println(7);
}
}
while(执行条件){
循环体;
}
package cn.tedu.basic;
import java.util.Random;
import java.util.Scanner;
/**本类用于练习while循环*/
//需求:产生一个随机数,和用户一直输入的数作比较,直到猜对
public class TestWhile {
public static void main(String[] args) {
//1.生成一个随机数,交给变量r来保存,用来给用户猜
/**参数100是自定义的,此时生成的随机数的范围是【0,100】以内的整数,包含0但不包括100*/
int r = new Random().nextInt(100);
System.out.println(r);
//2.调用一个自定义的猜数字方法
guessNum(r);
}
//本方法用来完成猜数字的功能
private static void guessNum(int r) {
/**while(判断是否能继续循环的条件){如果条件的结果为true,执行此处循环体的内容}
* 所以,我们用while写死循环,格式:while(true){}
* 但是一定注意!!!死循环必须设置程序的出口【循环什么时候结束】*/
while(true) {//设置了一个一直会执行的死循环
//1.接收用户猜的数字
System.out.println("猜猜看");
int input = new Scanner(System.in).nextInt();
//2.判断用户是否猜对
if(inputr) {
System.out.println("猜大了");
}else if(input==r) {
System.out.println("恭喜你!猜对了!");
break;//当用户猜对了,结束循环,程序结束
}
}
}
}
do{
循环体;
}while(执行条件);
package cn.tedu.basic;
import java.util.Random;
/**本类用于练习do-while循环*/
public class TextDowhile {
public static void main(String[] args) {
int n;
do {
System.out.println("我是循环体");
n=new Random().nextInt(100);
System.out.println(n);
}while(n>100);
}
}
(1)int[] a= {1,2,3,4,5};
(2)int[] b= new int[5];
(3)int[] c=new int[]{1,2,3,4,5};
c[0] =1;
c[1]=2;
c[2]=3;
c[3]=4;
c[4]=5;
Syetem,out.println((Arrays.toString(a));//打印
int[] a=Arrays.copyOf(a,5);//a:要复制的数组, 5:新数组的长度
数组名保存的是数组的地址值,不是数组中每一个具体的元素,数组名是一个引用类型的变量
面向过程:是一种思想,强调亲力亲为
面向对象:是一种思想,强调结果
封装,继承,多态
栈:先进后出
队列:先进先出
栈与队列指的是一种数据的结构
(1).在栈内存中开辟一块空间,存放引用变量P,并把P压入栈底
(2).在栈内存中开辟一块空间,存放Phone对象
(3).完成对象的初始化,并赋予默认值
(4).给初始化完毕的对象赋予唯一的地址值
(5).把地址值交给引用类型变量P来保存
修饰符 | 同类 | 同包 | 子类 | 不同包(无关类) |
---|---|---|---|---|
public | Yes | Yes | Yes | Yes |
protected | Yes | Yes | Yes | No |
默认 | Yes | Yes | No | No |
private | Yes | No | No | No |
(1)构造代码块
(2)构造方法
(3)对象创建成功
(4)普通方法
(5)局部代码块
(1).多态的前提一:是继承
(2).多态的前提二:是有方法的重写
(3).父类引用指向子类对象,如Animal a=new Cat();
(4).多态中,编译看左边,运行看右边
(1)Throwable
--Error:程序解决不了的错误
--Exception:异常,程序可以解决的
--编译时异常:比如:没写分号
--运行时异常:编译时没有问题,一运行就错误
(2)异常的解决方案:捕获,向上抛出
package cn.tedu.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
/**本类用作异常的入门案例*/
public class ExceptionDemo {
public static void main(String[] args) {
//f1();//用来测试异常的暴露
//f2();//异常的解决方案一
//f3();//异常的解决方案二
method();//本方法用来解决f3()抛出的异常
}
/*以后这个代码就是别人来写,不是我们自己写*/
private static void method() {//方法用来解决f3()抛出的异常,为了在main()调用之前处理掉这个问题
try {
f3();
}catch (Exception e){
System.out.println("输入的不对哦~");
}
}
/*异常的解决方案二:向上抛出,谁调用这个方法,谁来解决[捕获/抛出]
* 格式:在方法里小括号与大括号之间写:throws 异常类型1,异常类型2...
* 但是注意:我们一般不把异常直接抛给main(),因为没人解决了,再往后就是JVM虚拟机了
* 所以:我们一般会在main()调用之前解决掉异常*/
private static void f3() throws ArithmeticException{
System.out.println("请您输入要计算的第一个整数:");
int a = new Scanner(System.in).nextInt();
System.out.println("请您输入要计算的第二个整数:");
int b = new Scanner(System.in).nextInt();
System.out.println("两个数相除结果为:"+a/b);
}
/*异常的解决方案一:自己捕获处理,格式:
try{
可能会发生异常的所有代码
}catch(异常的类型 异常的名字){
捕获到了预先推测的异常,就执行此处设置的解决方案
}
* */
private static void f2() {
//1.编写try-catch结构
try {
//2.复写刚刚的代码
System.out.println("请您输入要计算的第一个整数:");
int a = new Scanner(System.in).nextInt();
System.out.println("请您输入要计算的第二个整数:");
int b = new Scanner(System.in).nextInt();
System.out.println("两个数相除结果为:"+a/b);
}catch (ArithmeticException e1){//异常类型 异常名
System.out.println("除数不能为0!");//如果捕获到了算数异常,就执行这句话
}catch(InputMismatchException e2){//异常类型 异常名
System.out.println("请输入整型数据!");//果捕获到了输入不匹配异常,就执行这句话
}catch (Exception e){
/*忽略所有子异常的差异,统一用父类型Exception来接
* 也就是说,不管什么子异常,都能被匹配到,这个是多态最为经典的一种用法*/
System.out.println("输入不正确,请重新输入!");/*提供的通用解决方案*/
}
}
/*用来暴露异常
* ArithmeticException--输入一个整数,输入一个0,报算数异常,因为除数不能为0
* InputMismatchException--输入一个小数报错,报输入不匹配异常,因为我们要的是整型*/
/*1.不要害怕BUG,真正的勇士敢于直面自己写的BUG
* 2.学会看报错的提示信息,确定错误的方向,不管第一行有多长,都得看完
* 3.学会看报错的行号信息,确定自己报错的位置,哪里不对点哪里
* 注意:源码不会错,要看自己的代码*/
private static void f1() {
//需求:接收两个整数,打印他们除法的结果
//1.提示接收用户输入的两个整数
System.out.println("请您输入要计算的第一个整数:");
int a = new Scanner(System.in).nextInt();
System.out.println("请您输入要计算的第二个整数:");
int b = new Scanner(System.in).nextInt();
//2.输出两个数除法的结果
System.out.println("两个数相除结果为:"+a/b);
}
}
2进制:0,1
8进制:0,1,2,3,4,5,6,7
10进制:0,1,2,3,4,5,6,7,8,9
16进制:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
(1)hashCode()作用:返回对象对应的哈希码值
(2)toString
重写前:打印对象的地址值
重写后:打印类型+属性+属性值
(3)equals()
重写前:==比较,比较的是两个对象的地址值
重写后:比较两个对象的类型+属性+属性值
package cn.tedu.api;
import java.util.Objects;
/**本类用于顶级父类Object的入门案例*/
//1.查API手册
//2.连点两下Shift打开IDEA的搜索,搜Object
//3.按住Ctrl点hashCode()
//4.在拓展库External Libraries找到jdk1.8->rt.jar->java.lang.Object
public class TestObject {
public static void main(String[] args) {
Student s = new Student();
Student s1 = new Student("海绵宝宝",3);
Student s2 = new Student("海绵宝宝",3);
//5.测试hashCode()
/*本方法的作用是返回对应对象的int类型的哈希码值
* 本方法力求不同的对象返回的哈希码不同
* 这样我们就可以根据哈希码值区分不同的对象*/
System.out.println(s.hashCode());
System.out.println(s1.hashCode());
System.out.println( s2.hashCode());
//6.测试toString()
/*Object中toString()的默认实现:对象的名字@+十六进制的哈希码值
* 子类重写了toString()以后:打印的是对象的类型+属性+属性值*/
System.out.println(s);//cn.tedu.api.Student@1b6d3586
System.out.println(s1);//cn.tedu.api.Student@4554617c
//8.测试equals()
/*Object中equals()的默认实现使用的是==比较
* ==比较的是左右两边的值,如果是基本类型,比较的是字面值,比如1和1,3.4和3.4
* 如果是引用类型,比较的是引用类型变量保存的地址值*/
System.out.println(s1.equals(s2));
System.out.println(s.equals(s1));
}
}
//1.创建一个学生类
class Student{
//2.定义属性
String name;
int age;
//3.1添加无参构造
public Student(){
System.out.println("我是Student类的无参构造");
}
//3.2添加全参构造
public Student(String name, int age) {
this.name = name;
this.age = age;
System.out.println("我是Student类的全参构造");
}
//7.在Student类中添加重写的toString()
//右键->Generate->toString()
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//9.添加重写的equals与hashCode()
/*equals()与hashCode()逻辑要保持一致,要重写都重写,要不重写都不重写
* 如果不重写:hashCode()的哈希码根据地址值生成
* equals()底层使用==比较两个对象的地址值
* 如果重写了:hashCode()的哈希码值根据重写传入的属性值生成
* equals()比较的是重写后的类型 + 所有属性与属性值*/
@Override
public boolean equals(Object o) {
//前提:this代表的是调用本方法对象s1 o代表的是传入的
//1.比较的是两个对象的地址值
if (this == o) return true;
//2.1如果传入的对象是null,说明实际上并没有对象,还是引用类型的默认值
//2.2如果两个对象获取类型不一致,比如一个是Cat类型,一个是Car类型
//以上两种情况只要满足一种
if (o == null || getClass() != o.getClass()) return false;
//3.传入的对象类型是Object,父类无法使用子类的特有属性,所以需要强转
/*多态:向上造型:把子类看做是父类型,花木兰替父从军 Animal a = new Cat();
* 向下造型:之前转成父类型的子类对象,又想使用子类自己的特有功能了,可以向下转型 ,写法:Cat c = (Cat) a;*/
//向下造型:把父类型Object转回子类型Student
Student student = (Student) o;
//4.比较的是两个对象的属性与属性值
//如果是基本类型,直接比较值,所以用==比较
//如果是引用类型,
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
(1)按流的方向
输入流:数据从磁盘(文件)到内存(程序)
输出流:数据从内存(程序)到磁盘(文件)
(2)按操作数据的单位
字节流:什么类型的东西都可以处理,包括文档,音频,视频等
字符流:只能处理与字符相关的内容
(1)字节输入流InputStream--抽象父类,不可实例化
FileInputStream--普通子类,构造函数参数类型:File对象/String路径名
BufferedInputStream--普通子类,构造函数参数类型:InputStream,但是抽象父类无法实例化,所以我们传子类对象
package cn.tedu.io;
import jdk.internal.util.xml.impl.Input;
import java.io.*;
/**本类用于测试字节输入流*/
public class TestIn {
public static void main(String[] args) {
//method1();//使用普通的字节输入流读取文件
method2();//使用高效的字节输入流读取文件
}
private static void method2() {
//定义一个在本方法中都生效的局部变量
InputStream in = null;
//1.创建流对象
try {
//InputStream in =new BufferedInputStream(new FileInputStream(new File("D:\\ready\\1.txt")));
in =new BufferedInputStream(new FileInputStream("D:\\ready\\1.txt"));
//2.使用流对象
int b;
while((b=in.read())!=-1){
System.out.println(b);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void method1() {
//1.定义一个在本方法中都生效的局部变量,局部变量必须手动初始化
InputStream in = null;//引用类型的默认值都是null
try {
//1.创建流对象--字节输入流InputStream--抽象父类不可实例化
//FileInputStream--插在文件上队对文件操作的字节输入流
//注意:创建的时候会抛出异常,要try-catch
// InputStream in = new FileInputStream(new File("D:\\ready\\1.txt"));
in = new FileInputStream("D:\\ready\\1.txt");
//2.1使用流对象
/*read()一次只能读取一个字符,并且这个方法的返回值类型是int
* 也就是说会到码表中查看字符对应的编码,比如读到字符a,控制台打97
* 如果文件里没有数据,也就是读到了文件的末尾,这个方法返回-1*/
// System.out.println(in.read());
// System.out.println(in.read());
// System.out.println(in.read());
// System.out.println(in.read());
// System.out.println(in.read());
//2.2优化刚刚读取的代码
//需求:需要使用循环结构读取文件中的所有内容,直至读完
//定义变量,用来保存读到的数据
int b;
while((b=in.read())!=-1){
System.out.println(b);//打印本轮循环中读到的数据
}
//这种写法是错误的,read()每执行一次,就会向后读取一个字节
//那这样while判断读取了一个,打印时,又读取了一个,所以会出现跳着读的现象
// while((in.read())!=-1){
// System.out.println(in.read());
//
// }
} catch (IOException e) {
e.printStackTrace();//如果捕获到异常,打印错误信息到控制台
}finally{
/*finally()代码块是try-catch结构中最后一个部分,这个部分的代码不论是否发生异常,一定会执行
* 我们常在finally{}中添加一些必须执行的操作,比如关流*/
//3.用完流对象以后,一定要关闭流对象!!!
try {
in.close();//关流操作也有可能抛出异常,所以需要继续try-catch
} catch (IOException e) {
e.printStackTrace();
}
}
//3.关闭流对象
}
}
(2)字符输入流Reader--抽象父类,不可实例化,构造函数参数类型:File对象/String路径名
FileReader--普通子类--操作文件的字符输入流,构造函数参数类型:InputStream,但是抽象父类无法实例化,所以我们传子类对象
package cn.tedu.io;
import java.io.*;
/**本类用于练习字符输入流*/
public class TestIn2 {
public static void main(String[] args) {
//method1(); //用于测试普通字符输入流对象
method2();//用于测试高效字符输入流对象
}
private static void method2() {
BufferedReader in = null;
try {
//1.创建高效字符输入流对象
//in = new BufferedReader(new FileReader(new File("D:\\ready\\1.txt")));
in = new BufferedReader(new FileReader("D:\\ready\\1.txt"));
//2.使用流对象
int b;
while((b=in.read())!=-1){
System.out.println(b);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//3.关流
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void method1() {
FileReader in =null;
//1.创建流对象
try {
//我们现在使用的这个FileReader是 抽象父类字符输入流Reader的子级
//FileReader in1 = new FileReader(new File("D:\\ready\\1.txt"));
in = new FileReader("D:\\ready\\1.txt");
//2.使用普通字符输入流对象
int b;
while((b=in.read())!=-1){
System.out.println(b);}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//3.关流
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
(3)字节输出流:OutputStream--抽象父类,不可实例化
FileOutputStream--普通子类,操作文件的字节输入流,构造函数:FileOutputStream(File file)/FileOutputStream(String name)
BufferedOutputStream--普通子类,高效字节输入流,构造函数:BufferedOutputStream(OutputStream out)
package cn.tedu.io;
import java.io.*;
/**本类用于测试字节输出流*/
public class TestOut {
public static void main(String[] args) {
//method1();//用于测试普通字节输出流
method2();//用于测试高效字节输出流
}
private static void method2() {
BufferedOutputStream out =null;
try{
//out = new BufferedOutputStream(new FileOutputStream(new File("D:\\ready\\5.txt")));
out =new BufferedOutputStream(new FileOutputStream("D:\\ready\\5.txt",true));
out.write(100);
out.write(101);
out.write(102);
}catch(Exception e){
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void method1() {
FileOutputStream out =null;
try{
//out = new FileOutputStream(new File("D:\\ready\\5.txt"));
/*FileOutputStream 有一个重载的构造函数,第二个参数是boolean append
* 默认为false,如果不写,表示创建的对象是覆盖输出数据的
* 如果我们手动将append的值设置为true,表示创建的流对象是追加输出数据的
* FileOutputStream(File file)--默认覆盖
* FileOutputStream(File file,boolean append)-append为true表示追加输出数据*/
out = new FileOutputStream("D:\\ready\\5.txt",true);
//4.使用输出流对象将指定的数据输出到文件中
out.write(97);
out.write(98);
out.write(99);
}catch(Exception e){//异常类型 异常名
e.printStackTrace();//如果捕获到了异常,会在控制台打印错误信息
}finally{//用来关流
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
(4)字符输出流:Writer --抽象父类,不可实例化
FileWriter – 操作文件的字符输出流,构造函数参数类型:File file / String filename
注意:除了上述两个构造方法以外,文件字符输出流对象创建的时候还可以指定输出的方式
默认存在一个参数boolean append,默认值为false,默认覆盖
如果将这个append的值设置为true,数据是按追加的效果输出,不覆盖文件中的原数据
BufferedWriter – 高效/缓冲字符输出流
构造方法的参数:Writer,抽象父级无法实例化,所以传入的是子级FileWriter
package cn.tedu.io;
import java.io.*;
/**本类用于练习字符输出流*/
public class TestOut2 {
public static void main(String[] args) {
method1();//本方法用于测试普通字符输出流
//method2();//本方法用于测试高效字符输出流
}
//使用高效的字符输出流FW进行输出-Writer[抽象父类]
private static void method2() {
//1.创建一个在方法中都生效的局部变量,并给他进行初始化
Writer out = null;
try{
// out = new BufferedWriter(new FileWriter(new File("D:\\ready\\2.txt")));
//out = new BufferedWriter(new FileWriter(new File("D:\\ready\\2.txt"),true));
//out = new BufferedWriter(new FileWriter("D:\\ready\\2.txt"));
out = new BufferedWriter(new FileWriter("D:\\ready\\2.txt",true));
out.write(100);
out.write(100);
out.write(100);
out.write(100);
out.write(100);
out.write(100);
}catch(Exception e){
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//使用普通的字符输出流FW进行输出--Writer[抽象父类]
private static void method1() {
//1.创建一个在本方法中都生效的局部变量
Writer out = null;
//2.完成try-catch-finally结构,因为IO操作会抛出异常
try{
//3.创建普通的字符输出流对象
//out =new FileWriter(new File("D:\\ready\\2.txt"));//覆盖效果,append默认为false
//out =new FileWriter(new File("D:\\ready\\2.txt",append true));//追加效果
//out = new FileWriter("D:\\ready\\2.txt");//覆盖效果,append默认为false
out = new FileWriter("D:\\ready\\2.txt",true);//追加效果
//4.使用流对象完成输出的操作
out.write(98);
out.write(98);
out.write(98);
out.write(98);
}catch(Exception e){
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
ArrayList:List接口的实现类,底层的数据结构为数组,内存空间是连续的
(1)元素有下标,有序
(2)允许存放重复的元素
(3)在数据量较大的情况下,增删慢,查询快
package cn.tedu.collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
/***/
public class TestArrayList {
public static void main(String[] args) {
//1.创建集合对象
ArrayList list = new ArrayList<>();
list.add(100);
list.add(200);
list.add(300);
list.add(400);
list.add(400);
list.add(300);
System.out.println(list);//打印查看集合中的元素
//3.测试常用方法
//list.clear();
System.out.println(list.contains("100"));//false,因为这个100是字符串
System.out.println(list.get(1));//200,获取指定下标处的元素
System.out.println(list.indexOf(400));//3
System.out.println(list.lastIndexOf(400));//4
System.out.println(list.remove(0));//删除集合中0号索引处的元素
//System.out.println(list.remove(300));//报错,数组下标越界
/*我们集合中存入的数据是引用类型,不是基本类型
* 所以如果想根据元素删除数据,需要把int类型参数300转为集合中元素的类型Interger*/
System.out.println(list.remove(Integer.valueOf(300)));
System.out.println(list);
System.out.println(list.size());//获取集合中元素的个数
System.out.println(list.set(0,77));//修改正定位置的值
System.out.println("方式1:");
for (int i = 0; i it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("方式4:");
ListIterator it2 = list.listIterator();
while(it2.hasNext()){
System.out.println(it2.next());
}
}
}
LinkedList:List接口的实现类,底层的数据结构为链表,内存空间是不连续的
(1)元素有下标,有序
(2)允许存放重复的元素
(3)在数据量较大的情况下,查询慢,增删快
package cn.tedu.collection;
import java.util.LinkedList;
/*本类用于测试linkedlist方法的使用*/
public class TestLinkedList {
public static void main(String[] args) {
//1.创建集合对象
LinkedList list = new LinkedList<>();
//2.向集合中添加数据
list.add("孙悟空");
list.add("猪八戒");
list.add("沙悟净");
list.add("唐三藏");
list.add("白龙马");
System.out.println(list);
//3.2测试LinkedList独有的方法
list.addFirst("蜘蛛精");//添加集合头结点
list.addLast("玉兔精");//添加集合尾结点
System.out.println(list);
System.out.println(list.getFirst());//蜘蛛精,获取首个元素
System.out.println(list.getLast());//玉兔精,获取尾元素
System.out.println(list.removeFirst());//删除首元素
System.out.println(list.removeLast());//删除尾元素
System.out.println(list);
//4.其他测试
//4.1创建对象
LinkedList list2= new LinkedList<>();
list2.add("西游记");
list2.add("红楼梦");
list2.add("水浒传");
list2.add("三国演义");
System.out.println(list2);
System.out.println(list2.element());//西游记,获取集合中的首元素
/*别名:查询系列*/
System.out.println(list2.peek());//西游记,获取集合中的首元素
System.out.println(list2.peekFirst());//西游记,获取集合中的首元素
System.out.println(list2.peekLast());//三国演义,获取集合中的尾元素
/*别名:新增系列*/
System.out.println(list2.offer("斗罗大陆"));//添加尾元素
System.out.println(list2.offerFirst("盗墓笔记"));//添加首元素
System.out.println(list2.offerLast("钢铁是怎样炼成的"));//添加尾元素
System.out.println(list2);
/*别名:一出系列*/
System.out.println(list2.poll());//移除首元素
System.out.println(list.pollFirst());//移除首元素
System.out.println(list2.pollLast());//移除尾元素
System.out.println(list2);
}
}
(1)泛型,不是指一种具体的类型,而是说,这里有个类型需要设置,那么具体设置成什么类型,得看具体的使用
(2)泛型通常与集合一起使用,用来限制集合中元素的类型,泛型设置了什么类型,那么这个集合只能存这个泛型类型的数据
(3)泛型是一颗"语法糖"
a.泛型可以把报错的时间提前,用于在编译期检查集合的数据类型,只要不是规定的类型,就报错,通不过编译
b.泛型只在编译时生效,编译通过以后,说明符合语法,泛型就会被抛弃,字节码文件中没有泛型
(4)泛型的类型必须使用引用类型,比如Student,Integer
(5)泛型方法:如果在方法上使用了泛型,必须两处同时出现:
a.一个是方法的参数列表中的参数类型
b.一个是返回值前的泛型类型,表示这是一个泛型方法