赞
踩
点击下载好的文件进行安装,尽量安装在固态硬盘中,一路下一步即可。
安装完成就配置环境变量
新建CLASSPATH:
新建JAVA_HOME:
在path中加入:
win+R:cmd
java
、javac
、java -version
:
Okay!至此jdk就配置完成~
win+r:输入cmd;
文件地址栏输入cmd:
开始+系统+命令提示符:
管理员运行:
切换目录:cd /d 路径
返回上一级:cd…
清除屏幕:cls
退出窗口:exit
查看本机ip:ipconfig
ping命令:ping www.baidu.com
相关文件的操作:
文件的移除是不会移除至回收站中
JDK
是JRE
的超集,JDK
包含了JRE
的所有开发,调试和监视应用程序的工具。当要开发Java
应用程序时,需要安装JDK
.Java运行时环境(JRE)
是一个软件包,它捆绑了libraries
(jar)和JVM
,以及用Java编写的应用程序的其他组件。
JVM
(JAVA
虚拟机)是运行Java
字节码的虚拟机,通过编译.java
文件为.class
文件得到字节码文件 . .class
文件包含JVM
可以理解的字节码。
Java
中的类加载有几种类型
三种,分别是:Bootstrap
,extendsion
,application
类加载器是如何工作的
类加载器扫描它们预定义的jar
文件和类的位置。它们扫描路径中的所有类文件并寻找所需的类。如果发现类则加载,链接并初始化类文件。
JRE
和JVM
的不同
JVM
是运行时环境的规范,它执行Java
应用程序。Hotspot JVM
就是这种规范的一种实现。它加载类文件,使用interpreter
和JIT Compiler
将字节码转换成机器码并执行它。
interpreter
和JIT compiler
的不同
interpreter
逐行解释字节码并按顺序执行。这会导致性能低下。JIT compiler
通过在块中分析代码并在这个过程添加优化,然后准备(编译)为更优化的机器码。
Java
源文件.即.java文件
javac
(Java
编译器)编译源文件为.class文件
.JVM
(Java
虚拟机)执行JVM
将字节码文件翻译为机器可以执行的机器码(0,1二进制)编译型-解释型语言
,同时具备编译特性和解释特性。其实,确切的说 Java 就是解释型语言
,其所谓的(预)编译过程只是将 .java 文件编程成平台无关的字节码 .class 文件
(生成的代码是介于机器码和Java源代码之间的中介代码),并不是向 C 一样编译成可执行的机器语言。作为编译型语言,JAVA 程序要被统一编译成字节码文件——>文件后缀是 .class 。此种文件在 Java 中又称为类文件。Java 类文件不能在计算机上直接执行,它需要被 JVM(Java 的虚拟机平台,可视为解释器)翻译成本地的机器码后才能执行,而Java 虚拟机的翻译过程则是解释性的过程
。Java 字节码文件首先被加载到计算机内存中,然后读出一条指令,翻译一条指令,执行一条指令,该过程被称为 Java 语言的解释执行。而在现实中,Java 开发工具 JDK 提供了两个很重要的命令来完成上面的编译和解释(翻译)过程。两个命令分别是java.exe
和 javac.exe
,前者加载 Java 类文件,并逐步对字节码文件进行编译,而另一个命令则对应了 Java 语言的解释(javac.exe)过程。在次序上,Java 语言是要先进行编译的过程,接着解释执行
。这样既保留了源代码的高抽象、可移植的特点,又已经完成了对源代码的大部分预编译工作,所以执行起来比“纯解释型”程序要快许多。IDEA 的 JavaDoc 生成功能在菜单 Tools->Generate JavaDoc 项里面。
Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数
。
位(bit):计算机中最小的存储单位;
字节(byte):计算机中数据处理的基本单位,习惯使用B表示;
单位转换:
字符:指计算机中使用的字母、数字、字和符号
电脑的32位和64位区别:
银行业务的表示:
不能使用浮点数,会有舍入误差,只能说接近,因为会有精度损失
BigDecimal:数学工具类;
a=97;A=65;
package com.simon.demo01; public class Test01 { public static void main(String[] args) { //局部变量 int a=100; //常量 final int MAX_A=100; Test01 test01 = new Test01(); System.out.println(test01.id); System.out.println(b); System.out.println(MAX_A); System.out.println(PI); System.out.println(a); } //实例变量 int id; String name; int age; //类变量 static int b; static final double PI=3.14; }
package com.simon.demo01;
public class Test02 {
public static void main(String[] args) {
int a=3;
System.out.println(a);
int b=a++;//先赋值再+1
System.out.println(a);//a=a+1
System.out.println(b);
int c=++a;//先+1,再赋值
System.out.println(a);
System.out.println(c);
}
}
1、项目名全部小写.
2、包名全部小写.
3、类名首字母大写,多个单词情况下使用驼峰命名规则
.
4、变量名,方法名首字母小写,如果名称由多个单词组成,使用驼峰命名规则
.
5、常量名全部大写
.
6、所有命名规则必须遵循以下规则 :
字母、数字、下划线、$符号
组成.不能以数字开头
.不能使用Java中的关键字
.不使用中文及拼音命名
.包名命名方式
一般公司命名
为com.公司名.项目名.模块名....
;
1.indi : 个体项目,指个人发起,但非自己独自完成的项目,可公开或私有项目,copyright主要属于发起者.
indi.发起者名.项目名.模块名..
2.pers : 个人项目,指个人发起,独自完成,可分享的项目,copyright主要属于个人.
3.priv : 私有项目,指个人发起,独自完成,非公开的私人使用的项目,copyright属于个人.
4.onem : 与indi相同,推荐使用indi
.
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法 - 相加运算符两侧的值 | A + B 等于 30 |
- | 减法 - 左操作数减去右操作数 | A – B 等于 -10 |
* | 乘法 - 相乘操作符两侧的值 | A * B等于200 |
/ | 除法 - 左操作数除以右操作数 | B / A等于2 |
% | 取余 - 左操作数除以右操作数的余数 | B%A等于0 |
++ | 自增: 操作数的值增加1 | B++ 或 ++B 等于 21 |
– | 自减: 操作数的值减少1 | B-- 或 --B 等于 19 |
2 赋值运算符主要有两类:
一类是使用等号(=)
赋值,它把一个表达式的值赋给一个变量或对象;
另一类是扩展的赋值运算符
。
3 赋值运算符的格式
variableName = expression;
这里,variableName为变量名,expression为表达式。其功能是将等号 右边表达式的值赋给左边的变量。
例如:
int x = 10;
int y = x + 20;
运算符 | 描述 | 例子 |
---|---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假。 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A> B)为假。 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A <B)为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A> = B)为假。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真。 |
操作符 | 描述 | 例子 |
---|---|---|
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (A && B)为假。 |
| | | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 | (A | | B)为真。 |
! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !(A && B)为真。 |
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| | 如果相对应位都是0,则结果为0,否则为1 | (A | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。左x2 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。右/2 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
表达式:
variable x = (expression) ? value if true : value if false
int a = 10;
int b = 20;
//求最大值
int c = (a>b)? a:b;
System.out.println(c);//20
操作符 | 描述 | 例子 |
---|---|---|
+ = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
- = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
* = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
/ = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A等价于C = C / A |
(%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
<< = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
| = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
类别 | 操作符 | 关联性 |
---|---|---|
后缀 | () [] . (点操作符) | 左到右 |
一元 | + + - !〜 | 从右到左 |
乘性 | * /% | 左到右 |
加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | >> = << = | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | | | | 左到右 |
条件 | ?: | 从右到左 |
赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 从右到左 |
逗号 | , | 左到右 |
import java.util.Scanner;
package com.simon.demo06; import java.util.Scanner; public class Test03 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入两个整数:"); int i1 = scanner.nextInt(); int i2 = scanner.nextInt(); int add = add(i1, i2); System.out.println(add); //关闭输入流 scanner.close(); } public static int add(int a, int b){ return a+b; } }
顺序结构:就是从头到尾依次执行每条语句的操作。
选择结构:也称条件控制,是指根据表达式的值有选择的执行。
在java中,选择结构分为if-else
语句和 switch
语句。
//单选择结构
if(布尔表达式){
语句或语句块
}else{
语句或语句块
}
//多选择结构
if(布尔表达式){
语句或语句块
}else if(布尔表达式){
语句或语句块
}else{
语句或语句块
}
注意:
1)if括号里表达式的值返回的必须是布尔类型
2)如果条件体内只有一条语句
需要执行,那么if后面的大括号可以省略
。建议不要省略!
3)如果出现有多个if一个else
的情况,else子句归属于最内层的if语句
。
2. switch:
switch(表达式){
case 常量值1:
语句块;
break;
case 常量值2:
语句块;
break;
case 常量值3:
语句块;
break;
..
default:
语句块;
break;
}
注意:
1)switch中表达式的返回值只能是int,byte,char,short,枚举,字符串
;
2)case子句中的值必须是常量
,且不能重复
;
3)default可有可无
;
4)break作为某一个case代码段的结束句,使其跳出程序
。
循环结构:也称回路控制,是根据循环初始条件和终结要求,执行循环体内的操作。
在java中,循环结构有三种,分别是while循环、do-while循环、for循环
。
while(循环条件){
代码块
}
无论循环条件是否为true,都会先执行一遍代码块
do{
代码块;
}while(循环条件);
for(表达式1;表达式2;表达式3){
代码块;
}
break语句:
break语句刚刚在switch中已经见过了,是用来终止case的。实际上,break出现在while,do-while,for循环中,用于强行退出当前循环
。
continue语句:
continue只能用于for,while,do-while循环语句中,用于让程序跳出本次循环,直接进入下次循环
。
return语句:
public void show(){
System.out.println("show---");
return;//结束方法
}
public static int add(int a, int b){
return a+b;//返回值
}
public class Test03 {
public static void main(String[] args) {
test(3,5);//调用静态方法
Test03 test03 = new Test03();
System.out.println(test03.test01(1,2,3));//调用非静态方法
}
static void test(int a, int b){
System.out.println(a+b);
}
int test01(int a,int b,int c){
return a+b+c;
}
}
public static void main(String[] args) { test(3,5);//调用静态方法 Test03 test03 = new Test03(); System.out.println(test03.test(1,2,3));//调用非静态方法 System.out.println(test03.test(1.0,2.0)); } static void test(int a, int b){ System.out.println(a+b); } int test(int a,int b,int c){ return a+b+c; } double test(double a,double b){ return a+b; } }
类似于数组
int test(int... a){ for (int i = 0; i < a.length; i++) { System.out.print(a[i]+"\t"); } return 0; } test03.test(1,2,3,4,5);//方法的调用
输出结果:
public class Student { String name; int age; //alt+insert自动生成 //无参构造器 public Student() { } //有参构造器 public Student(String name, int age) { this.name = name; this.age = age; } void study(){ System.out.println(this.name+"\t"+this.age+"\t"+"在学习!"); } } public class Application { public static void main(String[] args) { Student student1 = new Student("lscong",22); student1.study(); } }
public class Person { private String name; private int age; private int score; public Person() { } //alt+insert选择getter、setter public String getName() { return name; } public int getAge() { return age; } public int getScore() { return score; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setScore(int score) { this.score = score; } } Person person = new Person(); person.setName("李思聪"); System.out.println(person.getName());
super关键字:调用父类的属性及方法
public Student() {
//super();----默认调用父类的构造方法,且super必须放在第一行
System.out.println("Student无参构造器!");
}
重写:
alt+insert
为什么重写:
可以实现动态编译
//一个对象的实际类型是确定的
new Student();
new Person();
//可以指向的引用类型就是不确定的,父类的引用指向子类
Student s1=new Student();
//父类不能调用子类独有的方法
Person s2=new Student();
Object s3=new Student();
注意事项:
多态是方法的多态,属性是没有多态的
存在的条件:继承关系,方法需要重写,父类的引用指向子类对象(Father f1=new Son();)
不存在多态:
判断两边类型是否存在父子关系
X instanceof Y
Student s1=new Student(); Person s2=new Student(); Object s3=new Student(); //Object>Person>Student //Object>Person>Teacher //Object>String s3 instanceof Student//true s3 instanceof Person//true s3 instanceof Object//true s3 instanceof String//false s3 instanceof Teacher//false s1 instanceof Student//true s1 instanceof Person//true s1 instanceof Object//true s1 instanceof String//编译错误 s1 instanceof Teacher//编译错误 s2 instanceof Student//true s2 instanceof Person//true s2 instanceof Object//true s2 instanceof String//编译错误 s2 instanceof Teacher//false
问题:
抽象类存在构造器吗?
抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super()或super(参数列表)调用抽象类中的构造方法。
abstract class Base{ int a=7; public Base(){ a=8; } public Base(int i){ a=i; } } public class Demo01 extends Base { public Demo01(){ super(); } public Demo01(int i){ super(i); } public static void main(String[] args) { Demo01 demo=new Demo01(); System.out.println(demo.a); Demo01 demo1=new Demo01(9); System.out.println(demo1.a); } }
存在的意义?
implements:继承关键字
interface:修饰符
[public abstract] void run();
接口中定义的变量均为常量:[public abstract final ] AGE=100;
接口可以实现多继承
只有规范,自己无法写方法
以后均在面向接口编程
子类继承接口,子类必须对其方法进行重写
public class Outer{ private String name; private int age; public void outer(){ System.out.println("outer!"); } public class Inner{ public void inner(){ System.out.println("inner!"); } } } //new Outer outer=new Outer(); Outer.Inner inner=outer.new Inner(); inner.inner();
public class Outer{
private String name;
private int age;
public void outer(){
System.out.println("outer!");
}
public static class Inner{
public void inner(){
System.out.println("inner!");
}
}
}
public class Outer{
private String name;
private int age;
public void outer(){
public class Inner{
private int score;
void run(){
System.out.println("run!");
}
}
System.out.println("outer!");
}
}
public class Outer{
private String name;
private int age;
public void outer(){
System.out.println("outer!");
}
}
class Outer1{
public void outer1(){
System.out.println("outer1!");
}
}
//new,没有名字的初始化,不用将实例保存在变量中
new Outer1().outer();
类的对象只有有限个,确定的
当需要定义一组常量时,强烈建议使用枚举类
package com.simon.demo06; //jdk5.0之前自定义枚举类 public class Test01 { public static void main(String[] args) { Season summer = Season.SUMMER; System.out.println(summer); } } //自定义枚举类 class Season { //声明Season对象的属性,private final修饰 private final String seasonName; private final String desc; //类的构造器,并给类的对象赋值 private Season(String seasonName, String desc) { this.seasonName = seasonName; this.desc = desc; } //提供当前枚举类的多个对象 public static final Season SPRING = new Season("春天","春暖花开"); public static final Season SUMMER = new Season("夏天","夏日炎炎"); public static final Season AUTUMN = new Season("秋天","秋高气爽"); public static final Season WINTER = new Season("冬天","凉风飕飕"); //其他诉求,获取枚举类的对象属性 public String getSeasonName() { return seasonName; } public String getDesc() { return desc; } //提供toString() @Override public String toString() { return "Season{" + "seasonName='" + seasonName + '\'' + ", desc='" + desc + '\'' + '}'; } }
package com.simon.demo06; //jdk5.0之后enum定义枚举类 public class Test01 { public static void main(String[] args) { Season summer = Season.SUMMER; System.out.println(summer);//SUMMER System.out.println(Season.class.getSuperclass());//class java.lang.Enum } } //自定义枚举类 enum Season { //提供当前枚举类的多个对象;多个对象之间使用逗号隔开,最后使用分号 SPRING("春天","春暖花开"), SUMMER("夏天","夏日炎炎"), AUTUMN("秋天","秋高气爽"), WINTER("冬天","凉风飕飕"); //声明Season对象的属性,private final修饰 private final String desc; private final String seasonName; //类的构造器,并给类的对象赋值; private Season(String seasonName, String desc) { this.seasonName = seasonName; this.desc = desc; } //其他诉求,获取枚举类的对象属性 public String getSeasonName() { return seasonName; } public String getDesc() { return desc; } /*//提供toString() @Override public String toString() { return "Season{" + "seasonName='" + seasonName + '\'' + ", desc='" + desc + '\'' + '}'; }*/ }
values()
valueOf()
toString()
//valuesOf(String name),根据提供的参数找到name
Season winter = Season.valueOf("WINTER");
System.out.println(winter);//WINTER
//values:枚举类中存在哪些对象
Season[] values = Season.values();
for(Season s:values){
System.out.println(s);//SPRING、SUMMER、AUTUMN、WINTER
}
//toString(),返回对象名
System.out.println(summer.toString());//SUMMER
package com.simon.demo06; //jdk5.0之前自定义枚举类 import javax.swing.*; public class Test01 { public static void main(String[] args) { Season summer = Season.SUMMER; //toString(),返回对象名 System.out.println(summer.toString());//SUMMER //实现接口,使得每个对象可以调用不同的show() Season autumn = Season.AUTUMN; autumn.show();//秋天在哪里 System.out.println(Season.class.getSuperclass());//class java.lang.Enum //values:枚举类中存在哪些对象 Season[] values = Season.values(); for(Season s:values){ System.out.println(s);//SPRING、SUMMER、AUTUMN、WINTER } //valuesOf(String name),根据提供的参数找到name Season winter = Season.valueOf("WINTER"); System.out.println(winter);//WINTER } } interface Season1{ void show(); } //自定义枚举类 enum Season implements Season1{ //提供当前枚举类的多个对象;多个对象之间使用逗号隔开,最后使用分号 SPRING("春天","春暖花开"){ @Override public void show() { System.out.println("春天在哪里"); } }, SUMMER("夏天","夏日炎炎"){ @Override public void show() { System.out.println("夏天在哪里"); } }, AUTUMN("秋天","秋高气爽"){ @Override public void show() { System.out.println("秋天在哪里"); } }, WINTER("冬天","凉风飕飕"){ @Override public void show() { System.out.println("冬天在哪里"); } }; //声明Season对象的属性,private final修饰 private final String desc; private final String seasonName; //类的构造器,并给类的对象赋值; private Season(String seasonName, String desc) { this.seasonName = seasonName; this.desc = desc; } //其他诉求,获取枚举类的对象属性 public String getSeasonName() { return seasonName; } public String getDesc() { return desc; } /*//提供toString() @Override public String toString() { return "Season{" + "seasonName='" + seasonName + '\'' + ", desc='" + desc + '\'' + '}'; }*/ }
八种基本数据类型定义相应的包装类:
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
基本数据类型、包装类、String之间的相互转换
int nums = 10;
Integer num = new Integer(nums);//装箱
System.out.println(num);
int i = num.intValue();//拆箱
System.out.println(i);
与String之间的转换:
//方式一
String str1 = nums + "";
//方式二
String str = String.valueOf(nums);
//无论是基本数据类型还是包装类均可调用valueOf()
String str2 = String.valueOf(num);
//String转换为基本数据类型
//没有关系的类是无法进行强转的
int i1 = Integer.parseInt(str);
//Integer i2 = new Integer(Integer.parseInt(str));
Integer i3 = Integer.parseInt(str);
String str3 = "true";
boolean bl = Boolean.parseBoolean(str3);
Integer in1 = nums;//自动装箱
int in2 = in1;//自动拆箱
public class Test01 {
public static void main(String[] args) {
String s1="abc";
String s2="abc";
System.out.println(s1 == s2);//true
}
}
在String常量池中,如果定义的String常量是相同的那么就是使用的同一个对象,如果不是相同的常量那么就会新建一个对象。
public static void test(){
String str2 = new String("hello");
String str1 = new String("hello");
System.out.println(str1==str2);//false
}
此时创建的是两个不同的对象,所有返回false
问题:String str1 = new String(“hello”);在内存中创建了几个对象?
答:2个,一个是在对空间中new的一个对象,另一个是在常量池中的数据"hello"
字符串的拼接
public static void test2(){ String s1="abc"; String s2="def"; String s3=s1+s2; String s4="abc"+"def"; String s5=s1+"def"; String s6="abc"+s2; String s7="abcdef"; System.out.println(s4 == s7);//true System.out.println(s5 == s7);//false System.out.println(s6 == s7);//false System.out.println(s3 == s7);//false System.out.println(s3 == s4);//false String s8=s5.intern(); System.out.println(s7 == s8);//true }
有变量参与的字符串拼接都是在对空间中new创建的对象,那么对象就是不同的;如果是字面量拼接的都是在常量池中创建的,如果结果是相同的,那么对象就是相同的;如果拼接调用了intern方法,那么该字符串对象就在常量池中,此时对象就是相他同的。
String的常用方法
public static void test3(){ String s1="helloworld"; System.out.println(s1.length());//长度 System.out.println(s1.charAt(0));//字符索引 System.out.println(s1.charAt(2)); System.out.println(s1.charAt(4)); System.out.println(s1.isEmpty());//是否为空 String s2 = s1.toUpperCase();//大写 System.out.println(s2); String s4=" helloWorld! "; String s3 = s4.trim();//去除前后空格 System.out.println(s3); System.out.println(s1.equals(s4));//比较字符串的值是否相同 String s5="HelloWorld"; System.out.println(s1.equalsIgnoreCase(s5));//忽略大小写的比较 String s6="abc"; String s7="abe"; System.out.println(s6.compareTo(s7));//比较大小,依次比较 System.out.println(s1.substring(5));//截取字符串 System.out.println(s6.concat("def"));//连接字符串,等价于“abc”+“def” }
String 与基本数据类型之间的转换
public static void test4(){
String s1="123";
int s2 = Integer.parseInt(s1);
System.out.println(s2);
String s3 = String.valueOf(s2);
System.out.println(s3);
}
String类型与char型数组之间的转化
public static void test5(){
String s1="helloworld";
char[] chars = s1.toCharArray();
for (int i = 0; i <chars.length ; i++) {
System.out.print(chars[i]);
}
char[] c1={'h','e','l','l','o'};
String s2 = new String(c1);
System.out.println(s2);
}
String:不可变字符串序列;使用char[]存储
StringBuffer:可变的字符串序列;线程安全的效率偏低;使用char[]存储
StringBuilder:可变的字符串序列;线程不安全的效率高;使用char[]存储
常用方法
public static void test6(){
StringBuffer stringBuffer = new StringBuffer("abc");//char[] value=new char[16]
System.out.println(stringBuffer.length());//0
stringBuffer.append('d').append('e');//添加,可以反复调用append()abcde
System.out.println(stringBuffer.delete(0, 1));//删除bcd
System.out.println(stringBuffer.replace(0, 1, "hello"));//替换hellocde
stringBuffer.insert(2,"false");//插入hefalsellocde
System.out.println(stringBuffer.reverse());//翻转edcolleslafeh
System.out.println(stringBuffer.indexOf("l"));//字符出现的次数3
stringBuffer.substring(2);//截取字符串olleslafeh
}
主要关注增删改查
String、StringBuffer、StringBuilder执行效率
String<StringBuffer<StringBuilder;String效率是极低的,在没有线程的时候就是用StringBuilder
File类的使用
实例化
import java.io.File;
File file = new File("hello.txt");//相对于该项目的路径下
File file1 = new File("G:\\idea\\java\\java01\\src\\com\\simon\\demo03\\hello.txt");//绝对路径
File类的常用方法
System.out.println(file.getName());//hello.txt
System.out.println(file.getAbsolutePath());//G:\idea\java\hello.txt
System.out.println(file.getParent());//null
System.out.println(file.getPath());//hello.txt
System.out.println(file.length());//0 文件的字节长度
System.out.println(file.lastModified());//0 最近一次修改时,时间戳!
创建文件或文件夹
//创建文件或文件夹 boolean newFile=false; try { newFile = file.createNewFile(); } catch (IOException e) { e.printStackTrace(); }finally { System.out.println(newFile); } //删除文件或文件夹 boolean delete1 = file1.delete(); System.out.println(delete1); boolean delete = file.delete(); System.out.println(delete); //创建文件夹 //mkdir 只能使用相对路径创建,此方法在上级目录存在的情况下才可以创建 //mkdirs,在上级目录不存在的情况下也可以创建,此时就一并创建了 boolean mkdir = file1.mkdir(); System.out.println(mkdir);
import java.util.Date;
java.sql.Date
—数据库中的Datepublic static void test2(){
//构造器一、空参构造器
Date d1 = new Date();//import java.util.Date;
//构造器二
Date date = new Date(2020, 1, 1);//自己定义,但是这个构造器已经过时了
Date date1 = new Date(1601802431564L);//Sun Oct 04 17:07:11 CST 2020
/*@Deprecated
public Date(int year, int month, int date) {
this(year, month, date, 0, 0, 0);*/
//java.sql.Date
java.sql.Date date2 = new java.sql.Date(1601802431564L);
System.out.println(date2.toString());//2020-10-04
}
}
两个方法的使用
//方法一
System.out.println(d1.toString());//Sun Oct 04 17:05:05 CST 2020
//方法二
System.out.println(d1.getTime());//1601802431564,时间戳
import java.util.Calendar;
可变性
不能直接new Calendar();因为该类是抽象类
可以new 其子类
Calendar c = new GregorianCalendar();
还可以调用其静态方法,进行new
Calendar instance = Calendar.getInstance();
常用方法
get()
int i = c.get(Calendar.DAY_OF_MONTH);
set()
c.set(Calendar.DAY_OF_MONTH,22);
add()
c.add(Calendar.DAY_OF_MONTH,3);
getTime()
Date time = c.getTime();
setTime()
c.setTime(date);
import java.text.SimpleDateFormat;
SimpleDateFormat实例化
SimpleDateFormat simpleDateFormat = new SimpleDateFormat();//默认的构造器
两个操作
Date date = new Date(); System.out.println(date.toString());//Sun Oct 04 17:30:31 CST 2020 //默认格式化 String format = simpleDateFormat.format(date); System.out.println(format);//20-10-4 下午5:30 //自己定义的格式化 //格式化日期 yyyy-MM-dd HH:mm:ss //带参的构造器 SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format1 = simpleDateFormat1.format(date); System.out.println(format1);//2020-10-04 17:39:53
解析:格式化的逆过程;字符串—>日期
String str="20-10-4 下午5:30"; Date parse = null; try { parse = simpleDateFormat.parse(str); } catch (ParseException e) { e.printStackTrace(); } System.out.println(parse);//Sun Oct 04 17:30:00 CST 2020
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
LocalDate、LocalDateTime、LocalTime
实例化:
public static void test5() {
//实例化
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
System.out.println(localDate);
System.out.println(localTime);
}
不可变性
常用方法
System.out.println(localDateTime.getDayOfMonth());//4
System.out.println(localDateTime.getDayOfWeek());//SUNDAY
System.out.println(localDateTime.getDayOfYear());//278
System.out.println(localDateTime.getMonth());//OCTOBER
//操作,体现不可变性
LocalDateTime localDateTime1 = localDateTime.withDayOfMonth(22);
System.out.println(localDateTime);//2020-10-04T19:57:27.576
System.out.println(localDateTime1);//2020-10-22T19:57:27.576
//增加天数
LocalDateTime localDateTime2 = localDateTime.plusDays(3);
System.out.println(localDateTime2);//2020-10-07T19:57:27.576
public static void test6() {
//需要考虑时区,获取本初子午线对应的标准时间
Instant instant =Instant.now();
System.out.println(instant);//2020-10-04T12:02:45.416Z
//根据时区去添加偏移量,+8
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2020-10-04T20:05:48.240+08:00
}
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
String format = dateTimeFormatter.format(LocalDateTime.now());
System.out.println(format);//2020/10/04 20:15:58
public static void test1(){
long l = System.currentTimeMillis();//时间戳
System.out.println(l);//1601801988015自1970.1.1 00:00:00开始到现在的时间差ms
String s = System.getProperty("java.version");
System.out.println(s);//1.8.0_202
String s1 = System.getProperty("java.home");
System.out.println(s1);//C:\Program Files\Java\jdk1.8.0_202\jre
}
public static void test01(){
int i = Math.abs(-1);//绝对值
double v = Math.sqrt(16);//平方根
double v1 = Math.pow(3, 3);//3*3*3
double v2 = Math.log(27);//自然对数
double v3 = Math.exp(2);//e为底的指数
double v4 = Math.random();//0-1随机数
System.out.println(i);//1
System.out.println(v);//4.0
System.out.println(v1);//27.0
System.out.println(v2);//3.295836866004329
System.out.println(v3);//7.38905609893065
System.out.println(v4);//0.41071285585678285
}
一般的float和double在进行商业计算的时候会有精度的损失,所有一般不使用浮点数,因此就出现BigDecimal类来进行高精度的计算
import java.math.BigDecimal;
public static void test02(){
BigDecimal bigDecimal = new BigDecimal(1635.16411);
BigDecimal bigDecimal1 = new BigDecimal(515);
//ROUND_CEILING四舍五入
System.out.println(bigDecimal.divide(bigDecimal1,BigDecimal.ROUND_CEILING));//3.175075941747572693043587349572227996529885
}
由于对象只能使用==或者!=,不能使用>或者<;所以需要比较对象的大小,就有了以下两个比较类;
像String和包装类就实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小的方式;
对于自定义类,如果需要进行排序,那么就需要自己实现Comparable接口和重写compareTo()。
指明compareTo(obj)按照什么方式排序。
Collection类的常用方法
public static void test03(){ Collection<Object> objects = new ArrayList<>(); //add() objects.add("123"); objects.add(123); objects.add("aa"); objects.add("bb"); objects.add(new Date()); System.out.println(objects.size());//5 System.out.println(objects);//[123, 123, aa, bb, Sun Oct 04 21:31:28 CST 2020] System.out.println(objects.isEmpty());//false System.out.println(objects.contains("123"));//true System.out.println(objects.remove(123));//true System.out.println(objects.hashCode());//1250521029 Object[] objects1 = objects.toArray();//集合转换为数组 StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("["); for (int i = 0; i <objects1.length ; i++) { if(i<objects1.length-1){ stringBuilder.append(objects1[i]+","); }else{ stringBuilder.append(objects1[i]); } } stringBuilder.append("]"); System.out.println(stringBuilder);//[123,aa,bb,Sun Oct 04 21:47:25 CST 2020] } }
contains是比较内容,而不是比较的是对象。
Iterator迭代器
//初始化
Iterator<Object> iterator = objects.iterator();
//遍历元素
//方式一
for (int i = 0; i <objects.size() ; i++) {
System.out.print(iterator.next()+"\t");//123 aa bb Sun Oct 04 21:59:40 CST 2020
}
//方式二
while (iterator.hasNext()){
System.out.print(iterator.next()+"\t");//123 aa bb Sun Oct 04 21:59:40 CST 2020
}
for-each(增强for循环)遍历集合或者数组
for(Object obj:objects){
System.out.print(obj+"\t");//123 aa bb Sun Oct 04 22:04:41 CST 2020
}
List接口是Collection的子接口,存储有序的,可重复的数据。
ArrayList、LinkedList、Vector均是List接口的实现类
但是ArrayList是List接口的主要实现类,Vector是最老旧的,基本上是不用的
三者之间的区别:
相同点:三者均实现List接口,存储数据的特点:存储有序可重复的数据。
ArrayList常用方法:
public static void test04(){ List<Object> objects = new ArrayList<>(); List<Object> objects1 = new LinkedList<>(); List<Object> objects2 = new Vector<>(); //添加数据 objects.add(1); objects.add(2); objects.add(3); objects.add(4); System.out.println(objects.get(2));//3 获取索引2处的数据 System.out.println(objects.set(2, 5));//3 修改数据 System.out.println(objects);//[1, 2, 5, 4] System.out.println(objects.remove(3));//4 移除索引为3处的数据 System.out.println(objects.indexOf(1));//0 数据第一次出现的位置 //遍历 Iterator<Object> iterator = objects.iterator(); while (iterator.hasNext()){ System.out.print(iterator.next());//125 } }
Set是Collection的另一个子接口,是存储无序的,不可重复的数据
Set的三个主要实现类:HashSet、LinkedHashSet、TreeSet
三者之间的区别:
HashSet常用方法:
全是Collection中存在的方法;
HashSet<Object> objects = new HashSet<>();
//添加数据
objects.add(1);
objects.add(3);
objects.add;
https://blog.csdn.net/weixin_45826188/article/details/108995282
————————————————
版权声明:本文为CSDN博主「Sicong Lee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。