···!!!!ASCII码表
···运算符优先级
1.标识符
标识符不能有".",即使在中间也不行;
Java中的关键字有很多常见的单词,如“new,this”等,要注意!!!
2.字节码
3.JDK,JRV,JVM相关
4.文档
.Overview (Java SE 17 & JDK 17)
java帮助文档
5.Java中,Array和String是引用的数据类型
6.包装类
7.Byte类型
这句话不能正常通过编译,因为像char、byte这种小于4个字节的数据,Java会自动把他们提升为int类型,所以需要强制转化
即使数据范围在-128~127之间,也需要强制转化
int a=10; byte x=(byte)a;8.溢出
上述代码属于‘溢出“;
对于byte类型的数据:最大的正数127
128溢出得到-128
————————
如果-1~10(min~max),11为溢出,得到-1
9.java中的boolean
10.用pow计算水仙花数
该程序错误;
sum+=Math.pow(x%10,3);//pow(a,b)——计算a的b次方
11.![]()
12.溢出与超过范围的区别
超过范围:
溢出:
13.水仙花数
153=1^3+5^3+3^3
1634=1^4+6^4+3^4+4^4
是几位数就是几次方。
题目:输出0~999999之间所有的这样的数字
、
注意pow函数的求和方法
14.辗转相除法求最大公约数
过程:
注意:除数和被除数无大小之分,具体原因如上图
例:
15.求加减交替的数字之和
16.打印“X”图案
17.判断两个字符串是否相等
x.equals("字符串字面常量或变量名称");
18.汉诺塔
题目要求:
19.函数返回类型为void时,递归的每一步都不能返回值
递归求斐波那契数列 public static int fib(int n){ if(n==1||n==2){ return 1; } return fib(n-2)+fib(n-1); } public static void main(String[] args) { Scanner scan=new Scanner(System.in); System.out.println("请输入一个整数:"); int n= scan.nextInt(); System.out.println(fib(n)); }20.快速定义一个数组
Arrays.toString().var+回车
21.Java中范围都是“左闭右开”
22.各类型对应的默认值
23.整数除法
24.多数元素
1.解题步骤:
1.先把数组从大到小或从小到大依次排序
2.利用2步骤,避免元素重复
[2,2,1,1,2,1,2]——会打印4次元素2
[1,1,1,2,2,2,2]——只打印一次2
2.补充——一个数组最多只有一个多数元素
数组存在大于2个的重复数字时,同理
3.如果题目假设该数组总存在多数元素,那么排序后的数组的中间元素一定是多数元素
25.奇数位于偶数之前![]()
正解:
注意:如果内部while循环没有i<j的条件,会出错
如下图,原数组的奇偶顺序已是排列好的,调用方法后也多了一步交换
26.求只出现一次的数字——异或法
本题特点:
1.其余数字都出现2次
2.0^n=n;
n^n=0;
27.变量的初始化
成员变量可以不初始化,编译器会根据其对应类型为其赋值
局部变量必须初始化,否则会编译错误
28.this指针的用法
首先,tihis指针只能在本类内的(非静态)成员函数内部使用
1.this.data——>访问类内的成员变量
2.this.func()——>访问类内的成员函数
3.this(构造函数参数)——>访问该类的构造函数
29.未实例化的对象可以访问类内的静态成员函数
hello是一个被static修饰的静态成员函数,调用静态方法不需要创建实例对象
30.import语句不能导入一个指定的包
B:不同包下的类名互不冲突
C:import语句可以导入某包下的一类,可以导入某包的所有类;不能导入一个具体的包
D:import语句可以导入一些静态方法
31.向上转型——子类向父类转型
本质:小范围——>大范围,体系归属
B,C类都属于A类,所以可以
32.创建子类对象的引用时,编译器会自动在子类构造方法的第一行添加父类的构造函数——super()
在执行到第11行Alpha()后,此时编译器会默认自动调用隐藏的super(),调用父类的构造函数,然后再继续执行Alpha()方法里的代码部分
33.对象创建的两种方式
1.不用变量接受
2.用变量接受
34.父类是有参构造函数时必须在子类构造函数内部显式调用父类构造函数
正确写法如下:
总结:
1.在有继承关系的代码中,子类构造函数调用时,必须先调用父类的构造函数
2.父类构造函数的调用必须在子类构造函数的第一行,否则编译失败。并且父类无参构造编译器会自动调用;父类有参构造函数需要显式调用
35.当有继承关系时,一定先执行父类的实例成员初始化、父类方法,然后再执行子类内的成员初始化
实例(父)——>构造(父)——>实例(子)——>构造(子)
如果说子类构造函数调用时会自动调用父类构造函数,那为什么结果不是YXXYZ?
因为父类构造函数在子类构造函数之前且只执行一次
36.对supe关键字的理解
A:不包含在子类对象中是指:super关键字只是在子类中指向了父类的成员,而不是在子类中新定义了父类成员。
37.对静态变量访问
静态成员属于类成员,只有一份。所有对静态变量的操作都是对一个静态的变量操作
38.静态变量只能在类内方法外定义,因为它是类变量。否则报错
39.用类与对象实现swap函数
40.使用ideal
1.方法源码查询
在类内页面双击Shift ----> 出现提示框 ----> 勾选右上角 ----> 输入方法名----> 展示该方法源码
41.所有的Java类都直接或间接继承自java.lang.Object
选c
42.重写方法不一定抛出比被重写方法更为广泛的检查异常
RuntimeException比NullRuntimeException范围更广
IOException是Exception的子类,但此时抛出的异常会报错
43.关于向上转型的对象的访问
向上转型后,p引用在编译时是按照Person类来检查是否书写出错的。所以p即使本身是Child类引用,其指向的对象只有Person类的,没有Child类
即——向上转型后可以访问父类对象,不能访问子类对象,否则编译时报错
特例!!!:private修饰的父类对象只能在其声明的类内访问
44.final修饰的成员变量在声明时必须初始化;final修饰的局部变量在使用前必须初始化
45.使用接口引用调用类的方法可以实现多态
46.instanceof运算符的使用
A instanceof B——返回值是布尔类型
左操作符A必须是一个对象的引用
右操作符B可以是某个类,某个类的子类,接口
用法
1.判断引用实际类型属于哪个类(或者是否是子类)
2.判断对象的类是否实现了某个接口
47.Java·接口的修饰符只能为public
48.所有的引用类型不能通过-+号比较大小
比如String类型
49.在使用Comparator时一定要导Comparator包!!!
50.
51.
AC
c必须在JDK8下;JDK9接口内的方法可以是被private修饰的
52.
BC
53.抽象类与接口的区别与共性
54.为什么在实现Comparator接口时,不重写其它方法不会报错?
所有的类内默认直接或间接来自Java.lang.Object类,而Object类内已经重写了equals方法,所以不用重写其他方法
55.static与final的区别
被static修饰的变量可以被修改
被final修饰的变量不能再被修改
56.局部内部类可以访问其方法所在的类内的被final修饰的成员变量
57.匿名内部类有关
D:匿名内部类在创建的时候需要“继承一个类或者实现一个接口”,并不代表它可以继承其他类!!!!!!不要搞混
58.划了横线的方法已过时,但能使用
59.sout方法直接输出引用时,会默认先调用引用的toString方法;如果重写了toString方法,输出的结果就不是引用的地址;但是per1,per2本身还是对象的地址
60.发生类型提升时,引用不能访问子类本身的对象!!!!!
转化为子类对象才可以访问子类对象
61.Java中两个没有继承关系的类不能进行类型转换,编译时不会报错,但是运行时会抛出”类型转换异常“
62.ASCII中的不可打印字符
0~31以及127(delete):控制字符,不可打印
可打印字符:
63.不借助第三个数交换a,b两数的值
异或法:
a=a^b;——混合原a,原b的值 b=a^b;——利用混合后值消去原b a=a^b;——利用混合后值消去原a
64.equalsIngoreCase方法——比较字符串时忽略大小写
65.String类型的字符串是字符串常量的理解
常量:不可改变
那为什么下一句s=“jdbie”不报错?
因为“race e carq”在内存中创建一个对应的字符串对象,此时s引用这个对象。
当执行s=“jdbie”后,s引用指向”jdbie”,而“race e carq”对象没有新引用指向它的话,就会被编译器的垃圾回收机制处理。
所以,对子符串的修改不是在源字符串对象上进行修改,而是会在内存中建立一个新的对象
66.两个char类型的变量相加会自动类型提升为int;且char+int=int
所以要结果要转化为char类型的
67.toLoweCase的返回值是String
==比较的是字符串的引用的地址
toLoderCase的返回值是new的String,而“admin”是常量池中的,所以地址不一样
68.String的对象是常量,所以把String作为参数时,传递的实际上是原String引用的副本,这个参数指向新的对象
69.使用contains方法可以判断字符串中是否包含某个子字符串
d
70.转为小写字母
71.初始化一个字符
我们知道,在Java中Scanner类没有输入char类型,所以可以利用String类的方法初始化一个字符
注意:toCharArray()的返回值是一个char型的数组
72.保留小数四舍五入输出
1.调用Formatter类的format方法
new一个Formatter类(匿名)对象——调用该对象的format方法——该方法的返回值是Formatter——用toString方法转化为字符串
2.调用String类内重写的format方法
String类内重写的format方法是一个静态方法,调用时可以不新建对象,直接调用即可
并且该方法的返回值是String,所以不用调用toString方法
73.((TestClass)null).testMethod();解析
74.关于异常类的描述
B:非运行时异常(非error)是外部错误(编译时异常),可以通过:
1.抛出throw异常
2.try-catch语句捕获异常
C:Error不需要捕获
D:RuntimeException也可以通过
hrow异常
2.try-catch语句捕获异
75.finally
fially语句会覆盖try和catch中的语句
76.异常
子类方法不能抛出比父类抛出的异常范围大
能抛出Error吗?
77.自动补充类型——.var
78.String与StringBuilder不能隐式转换,需要显式调用toString方法
79.DateTimeFormatter的预定格式常量的区别
ISO_DATE_TIME:可格式化和解析符合ISO 8061标准的日期和时间
ISO_LOCAL_DATE:只关注日期部分,按照ISO 8061标准格式化和解析本地日期
80.手动终止当前运行的JVM,推出整个程序——System.exit(int)
81.单例模式创建Scanner对象需要传入参数(System.in)
并且单例模式创建Scanner对象与其它自定义类不同的是,Java官方已经定义了Scanner类,所以我们不能新建Scanner类。
所以注意单例模式下的返回值
82.删除数组中重复的数字
正解:
错解:
1.k必须从下标1开始,如果nums[k]=nums[i],k从0开始,而i又从下标1开始,那么第一个元素一定会遗漏!!
2.返回值是k,不是k++。最后一次满足if进入条件语句后k++,这时的k就是新数组的长度
83.实现接口的类,重写接口中的方法时注意修饰限定符
如果去掉这个public就会编译失败。因为接口中的方法默认是public,而在类中的方法默认是default,所以会编译失败
84.super——关键字。在子类中调用父类的所有类型的成员(包括被private修饰的)
85.数组初始化像C语言那样在Java中也是正确的
86.数组下标越界在编译阶段不会提示编译失败
运行结果:编译通过运行失败
87.字符串实例化为具体类;打印简单类名
1.
Class.forName(className)——生成class——newInstance()——生成object实例——向下转型
2.
返回对象——返回对象的简单类名
88.构造函数没有返回值,如果类中有方法名为类名但有返回值的方法不是构造方法
89.String不是以"\0"结尾的
90.char在Java中的存储的是UniCode编码,不是ASCLL编码
91.new出来的字符串是在堆上存储
str1在字符串常量池中存储,new出来的str2堆对上存储
92.被final修饰的成员只能在其定义时就初始化。不能在类的构造方法或类内方法中再初始化
93.父类引用初始化子类对象,如果用父类引用调用子类中新写的方法时会编译报错
运行结果:编译错误
94.如果有构造方法A(int x),那么在类A的其它构造方法中调用该构造方法时:this(x)
95.检查输入流是否有下一行
in.hasNextLine()——当程序执行到这一行时,程序会进入“阻塞”状态,即暂停,等待用户输入并回车,然后再检查是否有下一行
结束:Ctrl+D+回车
96.ch+32——自动提升为int型(ch变为Unicode,与32相加得到小写字母),需强转为char
97.cin.nextInt()与cin.nextLine()对换行符的处理方式不同
异常输出
正常输出
原因:
98.cin.next()与cin.nextLine()对换行符的处理方式不同
注意顺序不同
cin.next()会跳过开头的空白符,但不会处理输入结束后的'\n'
cin.nextLine()会跳过开头的空白符,会处理输入结束后的'\n'
cin.next()读取到输入的空白符处结束,(不包含空白符),所以cin.next()不能读取有空格的字符串
99.空白符
空格,制表,换行等
100.删除公共字符
解法一:
解法二:
注意:
1.s.contains(s2),s2必须是字符串,如果是字符,+“”转为字符串
2.初始化ret用StringBuilder类,是因为在append字符时,如果是String,每拼接一次就会产生一个新string对象,浪费内存,效率低
101.二维数组不初始化“列”数
注意每行调用时都要new一个一维数组并第一大小
102.append只能在字符串末尾添加字符
103.s.insert(index,char)
insert是在i前插入字符
104.常用进制转换
1.整数以二进制的形式转为二进制字符串:Integer.toString(num,2(radix))
2.(二进制)字符串以二进制的形式输出为int型数据:Integer.parseInt(s,2(radix))
同理,如果是8进制只能包含[0~7]
3.直接将10进制的整数转为二进制字符串:Integer.toBinaryString(num)
4.单个数字转为字符:(char)(‘0‘+ch)
105.种子与随机数
Rabdom生成的随即数是伪随机数
即:
种子不同,生成的随机序列不同
种子相同,生成的随机数列完全一样
也就是,如果想要随机数变化,new 的random里的参数要一直变化——可以调用时间
106.抽象类没有抽象方法时,可以使用匿名内部类实例化一个抽象类对象
107.抽象类有抽象方法时,要继承他的抽象方法
108.final
1.被final修饰的成员变量只能初始化一次,并且只能在定义时初始化
2.被final修饰的类不能被继承
3.被final修饰的方法不能被重写,只能被重载
109.接口
1.接口里的变量被final修饰
2.接口里的方法都被abstract修饰
3.final,abstract都可以省略
4.变量没有初始化时会报错,原因如上
110.接口与抽象类的默认权限
111.抽象类内的抽象方法和接口内的抽象方法不能有函数体
112.实现接口的类,重写接口的抽象方法时,其访问权限必须大于等与接口
显式声明为public,否则默认为default
113.重写重载
114.抽象类不能被实例化,但可以把实例对象改为具体的子类
错误:
正确:
115.变量的作用域限制
在{}里声明的变量,只能在{}内部使用,出{}变量已被销毁
107.父类有抽象方法,子类中没有重写父类的抽象方法,那么子类就是抽象类,必须声明为abstract
正确:
报错:
108.在子类中重写的方法的访问权限必须>=父类中声明的访问权限
public > protected >default >private
接口中方法默认是public abstract,在接口被实现后的类中重写方法时,访问权限是default,
default<public,
所以报错
修改:
109.str1.indexOf()
1.str1.indexOf(String s)——查找str1里是否存在s,若存在,返回第一个s的第一个字符出现的下标
2.str1.indexOf(String s,int idx)——从idx下标的位置开始查找是否有s字符串存在于str1中,若存在则返回s第一个字符出现的下标
3.str1.indexOf(char ch)
110.java里的String结尾没有'\0'
111.str.lastIndexOf(String s)——从数组末尾开始找起,注意返回下标不是把末尾当作0位置
112.转义中的非法字符
1.“.”在正则中是通配符,即”.“可以代表任何一个字符,即按照任意(每一个)字符分割。如果直接写split(“."),会按照:”abc“,——>分割后的数组为{”“,”“,”“};(保留去掉字符留下的空隙,即空字符串——”“)
2.所以需要用”\.“——把”.“给正则转义为字符”.“,split(”\.“),但只是这样写是不行的。因为java规定必须先给java转义出”\“,再给正则转移出”.“
3.所以需要”\\.“
113.s.isEmpty()——s只能为String
113.StringBuffer与String
String是常量,对常量进行操作是违法的。
所以有了StringBuffer类
错误:
错1:数组没有str.length()方法,只有str.length;str.length()是计算字符串长度的
错2:String类的常量不能改变,故其没有reverse方法,需将其改为StringBuffer类
正确:
注意StringBuffer与String的互相转换
114.为什么要有包装类?
Java中八大基本数据类型不具有对象的特征,为了让基本数据类型具有对象的特征,所以有了包装类
115.包装类转为其他类型
116.字符串和基本数据类型的相互转换
117.对象的equals方法
1.类没有重写equals方法
没有重写equals方法,那么比较的就是两个引用的地址是否指向同一块地址。与各自的属性值没有任何关系
2.类重写了equals方法
1.this==obj比较的是两个引用是否指向同一个对象
引用中存的是对象的地址
118.getClass()
119.Cloneable方法
为什么要有clone()方法存在?
如果用引用传递,那么修改obj2的值,obj1的值也被修改。因为obj1与obj2指向同一块堆内存,即指向同一个对象。
如果想要copy一份obj1的值,复制对象本身并且两个指向不同的堆内存,就可以用到Clonable接口clone()方法。。
在Object类中,clone()方法的原函数为:
120.包装类与相对应的基本类型的比较
所有包装类重写了equals方法(一个类如果没有重写equals方法比较的就是地址)
1.所以两个包装类型的数据作“equals”比较时,比较的是属性值是否相等
2.而两个包装类的数据作“==”比较的是引用指向的地址是否相等
1.注意Java的包装类有缓存机制,即复用高频,小范围对象,减少内存开销
Integer的缓存范围是-128~127
不显示new对象时如果数据范围在缓存范围内,两个引用就会指向同一片内存空间,这是比较地址时就是相同的
1.但是如果超出了缓存范围,就会new新对象,而不是复用同一个
2.注意:一个包装类型与一个他的基本数据类型的数据作“==”比较时,包装类会自动拆包
121.split,indexOf查找“.”的区别;s.substring()s是String类型的;s..toUpperCase()s是String类型
错误·:
正确:
122.Date相关
1.实例化Date类对象,有参无参
无参打印的时间就是当下时间
有参打印的就是从1900开始,加上参数的时间;注意月份
2.比较两个时间
1.getTime()——getTime返回值为整型
2.time1.before(time2)、.time1.after(time2)、.time1.equals(time2)
3.compareT()——Date类实现了comparable接口
compareTo返回值为int:
>0:
<0:
2.SimpleDateFormat——格式化日期(用户可选择自定义的日期格式来运行)
先实例化Date类引用
再实例化SimpleDateFormat类的引用并传入格式日期的参数
调用SimpleDateFormat类的format(Date)方法来格式化日期
E:代表周几
yyyy:年份
MM:月份(1~12)
dd:日期(1~31)
‘at’:被单引号括起来的固定文本直接输出,不解析为日期格式
hh:小时
mm:分钟
ss:秒
a:上午am/下午pm
zzz:时区(常表示为CST——China Standard Time)
时间模式的·字符串中所有ASCII字母被保留位模式字母
3.printf格式化日期
4.注意:$控制格式化哪个参数
123.sleep()——使当前进程进入停止状态(阻塞当前进程)
124.System.currentTimeMillis()
属于java.lang.Syatem提供的静态方法
计算的是从“1970-1-1-00:00:00”到现在经过的毫秒
125.Math
126.ArrayList类
计算一个ArrayList类集合里的元素个数,用ArrayList.size()方法
打印集合的第i个元素,没有list[i],可用list.get(i)获取或打印
127.集合与数组的区别
集合:是一个工具类,存储任意个具有相同属性的集合
集合的长度可变,数组的长度不可变
一个数组只能存储有限个相同类型的元素,一个集合可以存储任意个不同类型的元素
128.删除集合中的数据
一个方法:list.remove(参数)
该方法被重载
1.参数为元素在集合中的索引
2.参数为元素的引用——用Obiect接收
3.因为参数是Object类型的,所以不用担心索引和参数相等时的歧义问题
4.注意:比较引用的对象与集合中的元素是否相等时比较的是元素值是否相等,与地址是否指向同一个对象无关
5.注意:ArrayList是一个动态数组
所以是remove(0),remove(0)
129.集合框架
注意:
1.Collection添加成员直接添加数据;Map添加数据必须有两个,一个是“key”,一个是“Value”,并且Map添加元素的方法是map.put(key,value)
2.set集合的数据是无序的,所以数据不可重复。List集合的数据是有序的,所以可以重复
3.Map的数据也不可以重复
4.ArrayList是基于动态数组的数据结构。linkedList是基于链表的数据结构,并且LinkedList是双向链表。
130.Map的泛型
泛型指的是类,所以不能用基本数据类型,Integer不能用int
1.注意:
1.key=“”,这是key在以下代码中的使用形式,带“”
2.key值不可以重复,value的值可以重复
1.增加和修改Map中的元素
map.put(key,value2)
因为Map中的value元素不能重复,key值只对应一个固定内存的值,所以修改也使用put
2.打印——map.get(key)
System.out.println("姓名:" + map.get("name") + "性别:" + map.get("sex"));
3.删除——map.remove(key)
4.map.toString()——打印map中的所有元素
131.成员变量的隐藏和成员方法的重写
成员变量不存在重写。也就是说,当子类父类存在同名成员变量时,父类引用子类对象不会发生动态绑定,没有多态。引用是什么类型,打印的成员变量就是哪个类中的。
成员变量:编译看左边,运行看左边
成员方法:编译看左边,运行看右边
132.成员变量运行时看左边,成员方法运行时看右边
133.在Java中被public修饰的类只能有一个,并且这个类与.java文件的名称相同
134.异常
1.异常分类
异常是Java中的错误,但不是所有错误都是异常
Exception又分为运行时异常RuntimeException(非受检异常)和编译时异常IOException(受检异常)
2.处理异常
1.try-catch捕获异常
2.出现触发异常的代码——在方法{}前加throws异常——在调用方法的的内部——1.捕获异常try-catch或2.throws给JVM
3.throw关键字,用来主动抛出异常
注意,当使用关键字在程序某一块加上thorw异常时,在方法名之后必须明确throws表明调用这个方法可能会抛出的异常
并且在主动thorw的异常中,又分为编译时异常和运行时异常。而编译时异常必须在方法名后加throws,运行时异常可以不加:
135.lastIndexOf(“str”,index)——从index开始往前找str
136.static与final static区别
被static修饰的是类变量,所有对象共享
137.类的成员变量如果是引用类型,那么其默认值为null
138.泛型
E和T都可以表示泛型,但通常:
E——element,元素的类型,通常指集合中元素的类型
T——type,范围更广
139.括号匹配
1.必须判断字符串是否为空,否则直接charAt(0)可能抛出StringIndexOutOfBoundsException异常
2.stack.pop()前必须进行stack.empty(),否则可能抛出EmptyStackException异常
140.逆波兰表达式——中缀表达式转后缀表达式
141.递归的时间复杂度
时间复杂度:算法的执行时间随问题规模增长的变化趋势
求是否为平衡二叉树:每个根节点左右子树的高度之差<=1
O(n*n),最坏情况下每个结点遍历多次
O(n),每个节点只遍历一次
142.计数排序
1.定义计数数组时,注意计数数组的长度
如果min=0,计数数组的长度没问题
如果min!=0,数组长度就错误,所以更改为: