提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
java刷题语法笔记
1.数组
int[] array=new int[]{11,22,33};
double[] array2=new double[]{11.1,22.2,33.3};
简化
int[] array={11,22,33};
double[] array2={11.1,22.2,33.3}
int[] arr=new int[3];
长度:arr.length
数组遍历
idea提供的:数组名.fori,可自动生成循环
数组中的随机索引
Random r=new Random();
int randomIndex=r.nextInt(arr.length);
二维数组
int[][] arr=new int[][]{{11,22}.{33,44}};
int[][] arr={{11,22}.{33,44}};
二维数组遍历
public static void printArr1(int[][] arr) {
for (int x = 0; x < arr.length; x++) {
for (int y = 0; y < arr[x].length; y++) {
System.out.print(arr[x][y] + " ");
}
System.out.println();
}
}
2.字符串
java.lang.String代表字符串
String s2=new String();
Strng s1=“abc”;
char型数组转字符串;
char[] chs={‘a’,’b’,’c’,’d’};
String s4=new String(chs);
字节数组转字符串:
byte[] bytes={97,98,99,100};
String s5=new String(bytes);
- 字符串是引用地址类型,直接赋值在串池中,会复用,而new的都会创建一个。
String s1=new String(“abc”);
String s2=new String(“abc”);
System.out.println(s1==s2);//false
//引用数据类型比较的是地址值
String s1=“abc”;
String s2=“abc”;
System.out.println(s1==s2);//true
1. s.charAt(0)
返回的是某个索引下的char值
string s=‘12345’ s.charAt(0)=‘1’;
2.getValue()
可能是一个对象的实例方法,用于返回该对象的某个属性值。
int preNum = getValue(s.charAt(0));
3.字符串长度
s.length()
(c++是s.size())
4.toCharArray
toCharArray():将字符串对象中的字符转换为一个字符数组
char[] str1 = ransomNote.toCharArray();
char[] str2 = magazine.toCharArray();
5.字符串比较
Boolean result1=s1.equals(s2);
忽略大小写的比较
s1.equalsIgnoreCase(s2);
6.字符串截取-substring
String start=s1.substring(0,3);//0,1,2
左开右闭
String start1=s1.substring(7);//从7到结尾
7.字符串替换-replace()
String result=talk.replace(“abc”,”***”);
StringBuilder-可变
- 可变但不可修改,如需修改需要转成字符数组
StringBuilder sb=new StringBuilder();
char[] arr=sb.toString().toCharArray();
可以看成一个容器,创建之后里面的内容是可变的
StringBuilder sb=new StringBuilder();//空白
StringBuilder sb=new StringBuilder(“abc”);
append | sb.append(", World!"); |
多个追加 | sb.append("Name: ").append("Alice").append("\nAge: ").append(30); |
insert | 在指定位置插入sb.insert(5, "China "); |
delete | 删除范围,左开右闭sb.delete(5, 11); |
deleteCharAt | 删除单个字符sb.deleteCharAt(4); |
reverse | 反转sb.reverse(); |
replace | 替换sb.replace(6, 11, "China"); // 替换从索引6到11的部分为"China" |
setCharAt | 允许替换指定位置的字符。sb.setCharAt(0, 'h'); // 将第一个字符替换为小写'h' |
length() | int length = sb.length(); |
capacity容量 | 返回 StringBuilder 的内部数组的大小StringBuilder sb = new StringBuilder(50); int capacity = sb.capacity(); // capacity = 50 |
IndexOf | 用于查找指定字符或子串的首次出现位置int index = sb.indexOf("W"); |
lastIndexOf | 用于查找指定字符或子串的最后一次出现的位置int lastIndex = sb.lastIndexOf("o"); |
转换为字符串:toString | String str = sb.toString(); |
StringJoiner-可指定开始符号,结束符号和中间间隔符号
jdk8出现的
初始化:
StringJoiner sj=new StringJoiner("---");//1---2---3
StringJoiner sj=new StringJoiner(", ","[","]");
add | sj.add("aaa"); 链式添加:sj.add("aaa").add("bbb"); |
length() | sj.length(); |
toString() | 转成String类型,sj.toString(); |
3. 哈希表-hash_map
map
map提供一个很常用的功能,那就是提供key-value的存储和查找功能。
map<string, string> namemap;
namemap["岳不群"]="华山派掌门人,人称君子剑";
namemap["张三丰"]="武当掌门人,太极拳创始人";
namemap["东方不败"]="第一高手,葵花宝典";
hash_map
使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)相对应,于是用这个数组单元来存储这个元素。
hash_map<int, string> mymap;
mymap[9527]="唐伯虎点秋香";
mymap[1000000]="百万富翁的生活";
mymap[10000]="白领的工资底线";
定义:
Map<Character,Integer> map = new HashMap<Character,Integer>();
操作:
containsKey()
containsKey():来判断键(key)是否存在。
if(map.containsKey(z))
put
put方法用于向Map中添加键值对。
如果Map中不存在该键,则直接添加;如果Map中已经存在该键,则新值会覆盖旧值。
map.put(z,1);
get
Java中的Map>接口的get方法用于从(key)中取得(value)。
如果映射中不存在该键,则返回null。
map.get(z);
4.随机数Random
Random rand=new Random();
for (int i = 0; i < 10; i++) {
System.out.println(rand.nextInt(100) + 1);
}
获取指定范围随机数
- 生成区间 [64,128] 中随机值的代码为:
rand.nextInt(65)+ 64;
- randNumber 属于[MIN, MAX]
int randNumber = rand.nextInt(MAX - MIN + 1) + MIN;
在集合内随意生成字符
ArrayList<Character> list = new ArrayList<>();
for (int i = 0; i < 26; i++) {
list.add((char)('a' + i));
list.add((char)('A' + i));
}
int index = r.nextInt(list.size());
5.集合-ArrayList
- 集合不能用下标,用get方法.
泛型:限定集合中存储数据的类型
初始化
jdk7以前ArrayList<String> list=new ArrayList<String>();
jdk7以后ArrayList<String> list=new ArrayList<>();
| | |
|–|--|
| add() | 添加元素sites.add("Google");
|
|get()|访问 ArrayList 中的元素,System.out.println(sites.get(1));
|
|set()|修改sites.set(2, "Wiki"); // 修改第三个元素
|
|remove()|删除sites.remove(3); // 删除第四个元素
|
|size()|长度|
6.character类-char型
Character 类用于对单个字符进行操作。它将基本数据类型 char 包装在一个对象中,并提供了一系列方法来操纵字符
- JDK5以后,charcter和char型可互相转换
char ch = 'a';
Character character = new Character(ch);
System.out.println(character); // 输出 'a'
char ch = ‘5’ | ||
---|---|---|
isDigit(char c) | 判断字符是否是数字 | boolean isDigit = Character.isDigit(ch); // true |
isLetter(char c) | 判断字符是否是字母 | boolean isLetter = Character.isLetter(ch); // false |
getNumericValue(char c) | 转换为数字 | int num = Character.getNumericValue(ch); |
toString() | 转换为字符串 | char ch = 'a';String str = Character.toString(ch); // "a" |
toUpperCase(char c) | 切换大写 | char ch = 'a';char upperCh = Character.toUpperCase(ch); // 'A' |
toLowerCase(char c) | 切换小写 | char ch = 'a';char lowerCh = Character.toLowerCase(ch); // 'a' |
字符数组
char[] arr
字符数组转字符串
char[] str = {'h','e', 'l', 'l', 'o', ' ', '1','2','3'}; //创建一个字符数组
String string1 = new String(str);
String string2 = String.valueOf(str);
类
-
一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。
-
实际开发中建议还是一个文件定义一个class类。
● 成员变量的完整定义格式是:修饰符 数据类型 变量名称=初始化值;一般无需指定初始化值,存在默认值。
javabean类
javabean类-用来描述一类事物的类
- javabean类中,不写main方法
测试类
- 写main方法的类,叫做测试类
main方法
public:被JVM调用,访问权限足够大
static:被JVM调用,不用创建对象,直接类名访问
- 因为main方法是静态的,所以测试类中其他方法也是静态的
void:不需要返回值
main:虽然不是关键字,但被JVM识别
String[] args:以前用于接收键盘录入数据的,现在不用,但为了向下兼容,所以保存
工具类
帮助我们做一些事情的类
私有化构造方法
JDK的安装目录
文件夹 | 解释 |
---|---|
bin | 该路径下存放了各种工具命令。其中比较重要的有:javac和java |
conf: | 该路径下存放了相关配置文件。 |
include: | 该路径下存放了一些平台特定的头文件。 |
jmods: | 该路径下存放了各种模块。 |
legal: | 该路径下存放了各模块的授权文档。 |
lib: | 该路径下存放了工具的一些补充JAR包。 |
编译(javac)&&运行(java)
编译:javac是JDK提供的编译工具,我们可以通过这个工具,把当前路径下的
HelleWerld.java文件编译成class文件
运行:java也是JDK提供的一个工具。
作用就是用来运行代码的。
运行当前路径下的HelloWorld.class这个文件。在运行的时候是不加后缀名的。
java SE&&java ME&&java EE
java SE:用于桌面应用的开发,标准版
java ME:嵌入式电子设备或小型移动设备
java EE:企业版,用于web方向的网站开发
JVM&&JDK
JVM:虚拟机,真正运行程序的地方
JDK:java开发工具包。JVM+核心类库+开发工具
- 开发工具;
javac:编译工具
java:运行工具
jdb:调试工具
jhat:内存分析工具
JRE:运行环境:JVM+核心类库+运行工具(开发的一些工具不需要)
项目结构
项目(project) | 相当于创建一个能用 idea 打开的文件夹,包含一个idea文件和一个iml文件![]() |
模块(module) | 可选java项目,maven项目和springboot项目带一个src下main函数,以及一个iml文件![]() |
包(package) | (文件夹)为了保障每个 Java包命名的唯一性,在最新的Java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以程序员一般采用自己在互联网上的域名称作为自己程序包的唯一前缀。例如: com.sun.swt.一般公司命名会以com.公司名.项目名.模块名…com.实际表示你类所在的包名,有一定的规则,一般是工程域名的倒序,比如imooc的程序,一般包名起为com.imooc.为前缀。后面就会知道,不同包名中是可以互相调用的,假如我们有两个相同名称的类,那么有不同的包名是至关重要的。也就是说,他可以区分不同包下的类。 |
类(class) |
- 如果同时使用两个包中的同名类,需要用全类名
Java内存分配
栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行 |
堆 | 存储对象或者数组,new来创建的,都存储在堆内存,静态区也在这里(jdk8以后) |
方法区 | 存储可以运行的class文件 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关 |
寄存器 | 给CPU使用,和我们开发无关 |
串池(StringTable): | 字符串直接赋值则存放在串池中(在JDK7版本开始,从方法区挪到了堆内存) |
找方法:ctrl+B->跟进
刷题模板
输入:
import java.util.Scanner;
public class df {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();
System.out.println(i);
}
}
字符串输入
Scanner sc=new Scanner(System.in);
String str=sc.next();//new出来的
public class df {
public static void main(String[] args) {
System.out.println("HelloWorld");
}
}
细节
注释:单行://
多行:/* */
其他
\t
制表符,补齐到8的倍数
- 布尔类型是
boolean
- null不能直接打印,如需打印需要加上双引号
- 在系统可以最先整一个ArrayList集合作为数据库的备选
long 类型
long 类型的变量,变量值后需要加一个L(大小写都可以)
long n=99999999L System.out.println(n);
float类型
float 类型的变量,变量值后需要加一个F(大小写都可以)
float f=10.1F
switch
switch(表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
default:
语句体n+1;
break;
}
jdk14新写法:这种不需要写break
switch (choose)
{
case "1"-> System.out.println("添加学生");
case "2"-> System.out.println("删除学生");
case "3"-> System.out.println("修改学生");
case "4"-> System.out.println("查询学生");
case "5"-> {
System.out.println("退出");
break;
}
}
loop-跳出想要的循环
loop:while (true) {
break loop;
}
退出的方法:
System.exit(0);//停止虚拟机运行
静态变量
public static String teacher;
静态变量是随着类的加载而加载的,是优于对象的
- 静态方法只能访问静态变量和静态方法
- 非静态方法可以访问静态变量和静态方法,也可以访问非静态的成员变量和非静态的成员方法
- 静态方法中没有this关键字
继承
public class Student extends Person {}
- 一个子类只能继承一个父类,子类不能继承多个父类(c++允许多继承)
- 可多层继承,爷父子(但没有爷孙关系,只有直接继承和间接继承的关系)
- 每一个类都直接或间接的继承Object
- 子类只能访问父类中非私有的成员
子类继承父类中的内容
非私有 | 私有 | |
---|---|---|
构造方法 | 不能 | 不能 |
成员变量 | 能 | 能(不能直接使用,用get和set方法) |
成员方法 | 能 | 不能(具体的说是虚方法表中的可以,否则不能) |
虚方法表
- 成员方法有一个虚方法表,非private,非static,非final。
- 只有父类中的虚方法才能被子类继承
- Object有5个虚方法
String name = "Fu";
}
public class Zi extends Fu{
String name = "Zi";
public void ziShow(){
String name = "ziShow";
System.out.println(name);//"ziShow"
System.out.println(this.name);//"Zi";
System.out.println(super.name);//"Fu";
}
}
重写
当父类中方法不符合要求时,需要把这个方法进行重写,
- 子类重写的方法上面需要加上@override
- 子类的访问权限必须大于等于父类(空着不写<protected<public)
- 子类的返回值类型子类小于等于父类
- 私有方法不能被重写
- 子类不能重写父类的静态方法,重写会报错
- 只有加到虚方法表中的方法才能被重写
this
理解为一个变量,表示当前方法调用者的地址值
super
代表父类存储空间
final
方法:该方法是最终方法,不能被重写
类:是最终类,不能被继承
变量:只能被赋值一次
public static final double PI=3.1415926;
命名规则
常量:单个单词,全部大写
多个单词:全部大写,单词之间用下划线隔开
多态
Student s=new Student;
Person p=new Student;
Fu f=new Zi();
- 有方法的重写
- 使用父类型作为参数,可以接收所有子类对象
- 不能调用子类的特有功能:(强制类型转换Dog d=(Dog)a);
instanceof:判断前面所记录的对象是不是后面类型
变量调用:编译看左边,运行也看左边(正常父的优先级更高)
方法调用:编译看左边(看左边有没有这个方法,有则编译成功,没有则报错),运行看右边(子类覆盖了)
快捷键
生成generate,get和set方法的快捷键:alt+insert
- 按住alt键,鼠标滚轮往下拖,可以实现一竖排的选中