Java的特征和优势
简单性,面向对象,可移植性,高性能,分布式,动态性,多线程,安全性,健壮性
Java
静态方法属于类,可以直接调用
非静态方法属于对象,需要创建对象才能调用
全局变量
public class demo{
int a = 0;
public static void main(){
int a = 1;//局部变量
sout("a = " + a); //a = 0
//想要用外部的变量,因为a是类demo的成员,可以用类名限制a来获取a的值,
sout("a = " + demo.a); //a = 1
}
}
静态方法
静态方法在编译时或程序启动时分配内存,而非静态只有在实例化的时候才会分配内存
所以静态方法可以直接用类名调用,非静态方法需要实例化一个类对象才能调用
public class Demo{
public static void main(){
//调用静态方法
Demo.staticMethodDemo();
//实例化Demo类对象
Demo demo = new Demo();
//调用非静态方法
demo.methodDemo();
}
public static int staticMethodDemo(){
sout("这是一个静态方法");
}
public int methodDemo(){
sout("这是一个非静态方法");
}
}
String
几种常用的构造方法如下:
String str =“字符串”;
String str =new String([“字符串”]):
String str =new String(char a[]):
String str =newString(char a[], int offset, int length)
参数offset表示开始截取字符串的位置,length表示截取字符串的长度。
String str2 ="abcd"+1+2+3; #abcd123
String str3 = 1+2+ 3+"abcd"; #6abcd
常用方法
比较字符串内容
str.equal(),
查找字符串的方法indexOf(String subStr)与lastIndexOf(String subStr)
indexOf(String subStr)方法返回的是搜索的字符或字符串首次出现的位置。
lastIndexOf(String subStr)方法返回的是搜索的字符或字符串最后一次出现的位置。
使用charAt()方法可将指定索引处的字符返回。
str.charAt(int)
获取子字符串
substring(int beginIndex)
substring(int beginIndex, int endIndex)
去除空格
str.trim()
字符串替换
str.replace(char oldChar,char newChar)
replace()方法返回的结果是一个新的字符串。如果字符串oldChar没有出现在该对象表达式中的字符串序列中,则将原字符串返回。
判断字符串的开始与结尾
str.startsWith(String prefix)
str.endsWith(String suffix)
startsWith()方法与endsWith()方法分别用于判断字符串是否以指定的内容开始或结束。这两个方法的返回值都为boolean类型
判断字符串是否相等
str1.equals(str2)
str1.equalsIgnoreCase(str2)
equals():区分大小写
equalsIgnoreCase():不区分大小写
按字典顺序比较两个字符串
str1.compareTo(str2)
如果按字典顺序str1对象位于str2之前,则比较结果为一个负整数;如果按字典顺序str1位于str2之后,则比较结果为一个正整数;如果这两个字符串相等,则结果为0
字母大小写转换
toLowerCase(),
toUpperCase()
字符串分割
str.split(“ ”);
split(String sign)方法,该方法根据指定的分割符对字符串进行完全分割
split(String sign,int limit)方法,根据给定的分割符对字符串进行拆分,并限定拆分的份数。
正则表达式
时间和日期
String str =String.format(“格式参数”,被格式对象);
在java中,String对象提供的format()方法通过给定的特殊转换符作为参数来实现对日期和时间的格式化。
类
- 类是数据(属性)和操作(方法)的组合
- 现实世界中,我们是从事物的特征(静态)和它的行为(动态)两个方面来认识同一类事物。
- 在计算机世界中,我们可以把事物的特征映射成属性(数据),把事物的行为映射成方法(操作)。
- 用属性和方法组合来描述同一类事物。
抽象类
- 由abstract关键字修饰的类都是抽象类。
- 抽象类一般是将多个具体类拥有的共同属性和签名方法提取出来,重新设计一个更加通用、更加大众化的类。
- 抽象类不能实例化
- 抽象类可以不包含抽象方法,但包含抽象方法的类一定是抽象类
- 子类必须实现抽象类中的全部抽象方法,否则子类也将是抽象类
接口
- 是一种契约,是一种行为约定。
- 是继承体系之外的,用于功能扩展!接口约定了具体类的方法,约定了类的外部行为。
- 类可以实现多个接口,接口可以多继承多个接口,实现多继承
- 类既可以继承的同时,又“实现”接口
- 接口跟类之间的关系是实现关系(ike/asa)
抽象类与接口比较
- 从语法角度:abstract class方法中可以有自己的数据成员,也可以有非abstract的成员方法,并可赋予方法的默认行为,而在interface方式中一般不定义成员数据变量,所有的方法都是abstract,方法不能拥有默认的行为。
- 从编程的角度:abstract class在java语言中表示的是种继承关系,一个类只能使用一次继承关系。而一个类可以实现多个interface。给抽象类添加一般具体方法所有子类自动有。给接口添加一个方法,所有实现类都必须实现该方法。
- 从问题域角度:abstract class在Java语言中体现了种继承关系,要想使得继承关系合理,父类和派生类之间必须存在“sa”关系,即父类和派生类在概念本质上应该是相同的。对于interface来说则不然,并不要求interface的实现者和interface定义在概念本质上是同一类,而仅仅是实现了interface定义的契约而已。
抽象
- 从具体需要出发概括出事物的共同的方面、本质属性与关系等,而将个别的或非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。
- 面向对象程序设计方法中,抽象是实现事物-类的映射的思维过程,类的定义就是对同一类事物的抽象。
- 抽象是一种重要的手段,是一个选择与舍弃的过程。
封装
- 将数据(属性)及处理数据的操作(方法)绑定在一起,对外隐藏数据,只公开必要的数据操作方法。
- 防止从外部直接访问对象的数据,保护数据安全。
- 隐藏内部实现细节,增强使用的方便性
- 提高系统的独立性,增强代码的复用率
多态
- 运行时多态:父类型变量可以引用各种各样的子类型实例。
- 发生了继承,实现/方法重写
- 父类引用指向子类
- 只能使用父类中的签名方法
- 编译时多态:类中方法的重载也是多态的表现类型。
Java注意
同一个scanner对象用不同的方法调用可能报错
Scanner scanner = new Scanner(System.in);
String a = scanner.next();
String b = scanner.nextLine();
System.out.println("a = " + a);
System.out.println("b = " + b);
//console
//asd
//a = asd
//b =
数组名存放的是地址
int[] n1 = {1,2,3,4,5}; //将数组{1,2,3,4,5}的地址赋值给n1
int[] n2 = {6,7,8,9}; //将数组{6,7,8,9}的地址赋值给n2
int[][] n3 = {n1,n2}; //将n1,n2的地址赋值给n3[0]和n3[1]
n2 = new int[4]; //new一个新的数组,将其地址赋给n2,并不影响数组{6,7,8,9}和n3
for (int[] n: n3) {
for (int i = 0; i < n.length; i++) {
System.out.print(n[i]+" ");//1234566789
}
}
for (int a: n2) {
System.out.print(a+" ");//0000
}
包装类
-
构造函数:包装类名(参数);
- 参数必须是对应当的基本数据类型或字符串
如:Integer integer=new Integer(123);
Integer integer = new Integer(“123”);
Boolean bl = new Boolean(true");
- 参数必须是对应当的基本数据类型或字符串
-
基本数据类型与对象之间转换的工具
- 把基本数据类型包装成对象:
valueOf(String s);把字符串转换成*对应的包装类型;
如:Double D=Double.Vaue0f“123.456);
Integer I =Integer.valueof(12345); - 把相对应的字符串变成基本数据类型:
parse*(String s);把字符串转换成*对应的基本类型;
如:double d=Double.paseDouble(“123.456);
int i=Integer.paselnt(12345");
- 把基本数据类型包装成对象:
-
自动封包和解包(JDK1.5)
Integer I =5; inti=l;
- 1、三角函数:sin(double a),cos(double a),toRadians(double angle);toDegrees(double angrad)
2、指数函数:ea:exp(double a);sqrt(double a); cbrt(double a);ab:pow(doube a,double b);
3、取最大、最小值,绝对值函数:
max (double a,double b);max (double a,double b);abs(int a); - Math.random()方法
在Math类中存在一个random()方法,用于产生随机数字,这个方法默认生成大于等于0.0小于1.0的double型随机数,即0<=Math.random()<1.0。 - 大数字运算
1、Biglnteger
2、BigDecimal
集合
集合类又被称为容器
常用的集合有List集合、Set集合、Map集合
- Set不重复,
要重写比较方法equals和hashCode方法 - TreeSet有序、不重复
要重写排序方法 - map
迭代器
Iterator iterator=集合对象.iteratror();
使用迭代器:
·hasnext0;/判断是否还有是否还有更多元素
·next0;/获取一个元素
·remove (;/删除一个元素。
lambda表达式
lambda表达式不能独立执行,因此必须实现函数式接口,并且会返回一个函数式接口的对象。
操作符左侧的是方法参数,操作符右侧的是方法体。
函数式接口
函数式接口指的是仅包含一个抽象方法的接口,如果接口中包含一个以上的抽象方法,则不符合函数式接口的规范,这样的接口不能用lambda表达式创建匿名对象。
很多函数式接口的抽放方法是无参数的,如线程接口Runnable接口只有一个run()方法,这样的无参
抽象方法在lambda表达式中使用“( )”表示。
当函数式接口的抽象方法需要实现复杂逻辑而不是返回一个简单的表达式的话,就需要在lambda表
达式中使用代码块。lambda表达式会自动判断返回值类型是否符合抽象方法的定义。
lambda表达式除了可以调用定义好的参数,还可以调用表达式以外的变量。但是,这些外部的变量
有些可以被更改,有些则不能。例如,lambda表达式无法更改局部变量的值,但是却可以更改外部
类的成员变量(也可以叫作类属性)的值
引用方法
引用静态方法
类名::静态方法名
引用成员方法
对象名::成员方法名
引用带泛型的方法
函数式接口名 对象 = 类名 :: 静态方法名
函数式接口名 对象 = 对象 :: 方法名
引用构造方法
类名::new
引用数组构造方法
类名[]::new
Function<T,R>接口
这个接口有以下两个泛型:
T:被操作的类型,可以理解为方法参数类型。
R:操作结果类型,可以理解为方法的返回类型。
lambda表达式的省略规则
省略规则:
1.参数类型可以省略,但是有多个参数的情况下,不能只省略一个
2.如果参数有且仅有一个,那么小括号可以省略
3.如果代码块的语句只有一条,可以省略大括号和分号,甚至是return
int method(int s1,int s2){
return s1+s2;
};
(s1,s2) -> s1+s2
Stream流
数据过滤
stream.filter() 过滤
stream.distinct() 去重
stream.limit() 限量
stream.skip() 排除
数据映射
map(Function<? super T,? extends R> mapper)
map( Function )
mapToDouble( )
mapToInt()
mapToLong()
数据查找
allMatch() 全部符合条件
anyMatch() 任一符合条件
noneMatch() 避开全部条件
findFirst() 符合条件的第一条结果
数据收集
Collectors.couting()统计个数
Collectors…averaging Double()平均值
Collectors.maxBy()最大值
Collectors.summingDouble()总和
Collectors.minBy()最小值
Collectors.joining()拼接
数据分组
Map<组名, 组员> map = stream.collect(Collectors.groupingBy(Function))
IO流
IO流是数据通道
O流的分类
处理的数据单位分为:字符流,字节流
数据流方向分为:输入流,输出流
数据封装形式分为:节点流(基础流) 处理流(封装流)
文件类:File
通过Fle类可以创建输入流的数据源和输出流的目的地。常通过下面三个构造函数创建文件对象:
File(String path); 如:File file=new File("d:/a.txt”);
File(String parent, Path String filePath); 如:File file=new File("d:/doc”, ”b.txt”);
File(File f, String filePath);
文件类的常用方法
字节输入流的关系
字节输出流的关系
字符输入流的关系
字符输出流的关系
Path类提供了resolve()方法来合并路径,
Path和Files工具类网页地址