Java知识小店
···ASCII码表···运算符优先级1.标识符标识符不能有.即使在中间也不行Java中的关键字有很多常见的单词如“newthis”等要注意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 a10; byte x(byte)a;8.溢出上述代码属于‘溢出“对于byte类型的数据最大的正数127128溢出得到-128————————如果-1~10min~max11为溢出得到-19.java中的boolean10.用pow计算水仙花数该程序错误sumMath.pow(x%10,3);//pow(a,b)——计算a的b次方11.12.溢出与超过范围的区别超过范围溢出13.水仙花数1531^35^33^316341^46^43^44^4是几位数就是几次方。题目输出0~999999之间所有的这样的数字、注意pow函数的求和方法14.辗转相除法求最大公约数过程注意除数和被除数无大小之分具体原因如上图例15.求加减交替的数字之和16.打印“X”图案17.判断两个字符串是否相等x.equals(字符串字面常量或变量名称);18.汉诺塔题目要求19.函数返回类型为void时递归的每一步都不能返回值递归求斐波那契数列 public static int fib(int n){ if(n1||n2){ return 1; } return fib(n-2)fib(n-1); } public static void main(String[] args) { Scanner scannew 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]——只打印一次22.补充——一个数组最多只有一个多数元素数组存在大于2个的重复数字时同理3.如果题目假设该数组总存在多数元素那么排序后的数组的中间元素一定是多数元素25.奇数位于偶数之前正解注意如果内部while循环没有ij的条件会出错如下图原数组的奇偶顺序已是排列好的调用方法后也多了一步交换26.求只出现一次的数字——异或法本题特点1.其余数字都出现2次2.0^nn;n^n0;27.变量的初始化成员变量可以不初始化编译器会根据其对应类型为其赋值局部变量必须初始化否则会编译错误28.this指针的用法首先tihis指针只能在本类内的非静态成员函数内部使用1.this.data——访问类内的成员变量2.this.func——访问类内的成员函数3.this构造函数参数——访问该类的构造函数29.未实例化的对象可以访问类内的静态成员函数hello是一个被static修饰的静态成员函数调用静态方法不需要创建实例对象30.import语句不能导入一个指定的包B不同包下的类名互不冲突C:import语句可以导入某包下的一类可以导入某包的所有类不能导入一个具体的包Dimport语句可以导入一些静态方法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.使用ideal1.方法源码查询在类内页面双击Shift ---- 出现提示框 ---- 勾选右上角 ---- 输入方法名---- 展示该方法源码41.所有的Java类都直接或间接继承自java.lang.Object选c42.重写方法不一定抛出比被重写方法更为广泛的检查异常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·接口的修饰符只能为public48.所有的引用类型不能通过-号比较大小比如String类型49.在使用Comparator时一定要导Comparator包50.51.ACc必须在JDK8下JDK9接口内的方法可以是被private修饰的52.BC53.抽象类与接口的区别与共性54.为什么在实现Comparator接口时不重写其它方法不会报错所有的类内默认直接或间接来自Java.lang.Object类而Object类内已经重写了equals方法所以不用重写其他方法55.static与final的区别被static修饰的变量可以被修改被final修饰的变量不能再被修改56.局部内部类可以访问其方法所在的类内的被final修饰的成员变量57.匿名内部类有关D:匿名内部类在创建的时候需要“继承一个类或者实现一个接口”并不代表它可以继承其他类不要搞混58.划了横线的方法已过时但能使用59.sout方法直接输出引用时会默认先调用引用的toString方法如果重写了toString方法输出的结果就不是引用的地址但是per1per2本身还是对象的地址60.发生类型提升时引用不能访问子类本身的对象转化为子类对象才可以访问子类对象61.Java中两个没有继承关系的类不能进行类型转换编译时不会报错但是运行时会抛出”类型转换异常“62.ASCII中的不可打印字符0~31以及127delete控制字符不可打印可打印字符63.不借助第三个数交换ab两数的值异或法aa^b;——混合原a原b的值 ba^b;——利用混合后值消去原b aa^b;——利用混合后值消去原a64.equalsIngoreCase方法——比较字符串时忽略大小写65.String类型的字符串是字符串常量的理解常量不可改变那为什么下一句s“jdbie”不报错因为“race e carq”在内存中创建一个对应的字符串对象此时s引用这个对象。当执行s“jdbie”后s引用指向”jdbie”而“race e carq”对象没有新引用指向它的话就会被编译器的垃圾回收机制处理。所以对子符串的修改不是在源字符串对象上进行修改而是会在内存中建立一个新的对象66.两个char类型的变量相加会自动类型提升为int且charintint所以要结果要转化为char类型的67.toLoweCase的返回值是String比较的是字符串的引用的地址toLoderCase的返回值是new的String而“admin”是常量池中的所以地址不一样68.String的对象是常量所以把String作为参数时传递的实际上是原String引用的副本这个参数指向新的对象69.使用contains方法可以判断字符串中是否包含某个子字符串d70.转为小写字母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语句捕获异常CError不需要捕获DRuntimeException也可以通过hrow异常2.try-catch语句捕获异75.finallyfially语句会覆盖try和catch中的语句76.异常子类方法不能抛出比父类抛出的异常范围大能抛出Error吗77.自动补充类型——.var78.String与StringBuilder不能隐式转换需要显式调用toString方法79.DateTimeFormatter的预定格式常量的区别ISO_DATE_TIME:可格式化和解析符合ISO 8061标准的日期和时间ISO_LOCAL_DATE:只关注日期部分按照ISO 8061标准格式化和解析本地日期80.手动终止当前运行的JVM推出整个程序——System.exitint81.单例模式创建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.forNameclassName——生成class——newInstance——生成object实例——向下转型2.返回对象——返回对象的简单类名88.构造函数没有返回值如果类中有方法名为类名但有返回值的方法不是构造方法89.String不是以\0结尾的90.char在Java中的存储的是UniCode编码不是ASCLL编码91.new出来的字符串是在堆上存储str1在字符串常量池中存储new出来的str2堆对上存储92.被final修饰的成员只能在其定义时就初始化。不能在类的构造方法或类内方法中再初始化93.父类引用初始化子类对象如果用父类引用调用子类中新写的方法时会编译报错运行结果编译错误94.如果有构造方法Aint x那么在类A的其它构造方法中调用该构造方法时thisx95.检查输入流是否有下一行in.hasNextLine()——当程序执行到这一行时程序会进入“阻塞”状态即暂停等待用户输入并回车然后再检查是否有下一行结束CtrlD回车96.ch32——自动提升为int型ch变为Unicode与32相加得到小写字母需强转为char97.cin.nextInt()与cin.nextLine()对换行符的处理方式不同异常输出正常输出原因98.cin.next()与cin.nextLine()对换行符的处理方式不同注意顺序不同cin.next()会跳过开头的空白符但不会处理输入结束后的\ncin.nextLine()会跳过开头的空白符会处理输入结束后的\ncin.next()读取到输入的空白符处结束不包含空白符所以cin.next()不能读取有空格的字符串99.空白符空格制表换行等100.删除公共字符解法一解法二注意1.s.containss2s2必须是字符串如果是字符“”转为字符串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‘ch105.种子与随机数Rabdom生成的随即数是伪随机数即种子不同生成的随机序列不同种子相同生成的随机数列完全一样也就是如果想要随机数变化new 的random里的参数要一直变化——可以调用时间106.抽象类没有抽象方法时可以使用匿名内部类实例化一个抽象类对象107.抽象类有抽象方法时要继承他的抽象方法108.final1.被final修饰的成员变量只能初始化一次并且只能在定义时初始化2.被final修饰的类不能被继承3.被final修饰的方法不能被重写只能被重载109.接口1.接口里的变量被final修饰2.接口里的方法都被abstract修饰3.finalabstract都可以省略4.变量没有初始化时会报错原因如上110.接口与抽象类的默认权限111.抽象类内的抽象方法和接口内的抽象方法不能有函数体112.实现接口的类重写接口的抽象方法时其访问权限必须大于等与接口显式声明为public否则默认为default113.重写重载114.抽象类不能被实例化但可以把实例对象改为具体的子类错误正确115.变量的作用域限制在{}里声明的变量只能在{}内部使用出{}变量已被销毁107.父类有抽象方法子类中没有重写父类的抽象方法那么子类就是抽象类必须声明为abstract正确报错108.在子类中重写的方法的访问权限必须父类中声明的访问权限public protected default private接口中方法默认是public abstract在接口被实现后的类中重写方法时访问权限是defaultdefaultpublic所以报错修改109.str1.indexOf()1.str1.indexOf(String s)——查找str1里是否存在s若存在返回第一个s的第一个字符出现的下标2.str1.indexOf(String sint idx)——从idx下标的位置开始查找是否有s字符串存在于str1中若存在则返回s第一个字符出现的下标3.str1.indexOf(char ch)110.java里的String结尾没有\0111.str.lastIndexOf(String s)——从数组末尾开始找起注意返回下标不是把末尾当作0位置112.转义中的非法字符1.“.”在正则中是通配符即”.“可以代表任何一个字符即按照任意每一个字符分割。如果直接写split“.,会按照”abc“——分割后的数组为{”“”“”“}保留去掉字符留下的空隙即空字符串——”“2.所以需要用”\.“——把”.“给正则转义为字符”.“split”\.“,但只是这样写是不行的。因为java规定必须先给java转义出”\“再给正则转移出”.“3.所以需要”\\.“113.s.isEmpty——s只能为String113.StringBuffer与StringString是常量对常量进行操作是违法的。所以有了StringBuffer类错误错1数组没有str.length方法只有str.lengthstr.length是计算字符串长度的错2String类的常量不能改变故其没有reverse方法需将其改为StringBuffer类正确注意StringBuffer与String的互相转换114.为什么要有包装类Java中八大基本数据类型不具有对象的特征为了让基本数据类型具有对象的特征所以有了包装类115.包装类转为其他类型116.字符串和基本数据类型的相互转换117.对象的equals方法1.类没有重写equals方法没有重写equals方法那么比较的就是两个引用的地址是否指向同一块地址。与各自的属性值没有任何关系2.类重写了equals方法1.thisobj比较的是两个引用是否指向同一个对象引用中存的是对象的地址118.getClass119.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.splitindexOf查找“.”的区别s.substrings是String类型的s..toUpperCase()s是String类型错误·正确122.Date相关1.实例化Date类对象有参无参无参打印的时间就是当下时间有参打印的就是从1900开始加上参数的时间注意月份2.比较两个时间1.getTime——getTime返回值为整型2.time1.beforetime2、.time1.aftertime2、.time1.equalstime23.compareT——Date类实现了comparable接口compareTo返回值为int0:0:2.SimpleDateFormat——格式化日期用户可选择自定义的日期格式来运行先实例化Date类引用再实例化SimpleDateFormat类的引用并传入格式日期的参数调用SimpleDateFormat类的formatDate方法来格式化日期E代表周几yyyy年份MM月份1~12dd日期1~31‘at’被单引号括起来的固定文本直接输出不解析为日期格式hh小时mm分钟ss秒a上午am/下午pmzzz时区常表示为CST——China Standard Time时间模式的·字符串中所有ASCII字母被保留位模式字母3.printf格式化日期4.注意$控制格式化哪个参数123.sleep——使当前进程进入停止状态阻塞当前进程124.System.currentTimeMillis()属于java.lang.Syatem提供的静态方法计算的是从“1970-1-1-000000”到现在经过的毫秒125.Math126.ArrayList类计算一个ArrayList类集合里的元素个数用ArrayList.size方法打印集合的第i个元素没有list[i],可用list.geti获取或打印127.集合与数组的区别集合是一个工具类存储任意个具有相同属性的集合集合的长度可变数组的长度不可变一个数组只能存储有限个相同类型的元素一个集合可以存储任意个不同类型的元素128.删除集合中的数据一个方法list.remove参数该方法被重载1.参数为元素在集合中的索引2.参数为元素的引用——用Obiect接收3.因为参数是Object类型的所以不用担心索引和参数相等时的歧义问题4.注意比较引用的对象与集合中的元素是否相等时比较的是元素值是否相等与地址是否指向同一个对象无关5.注意ArrayList是一个动态数组所以是remove(0),remove(0)129.集合框架注意1.Collection添加成员直接添加数据Map添加数据必须有两个一个是“key”一个是“Value”并且Map添加元素的方法是map.putkeyvalue2.set集合的数据是无序的所以数据不可重复。List集合的数据是有序的所以可以重复3.Map的数据也不可以重复4.ArrayList是基于动态数组的数据结构。linkedList是基于链表的数据结构并且LinkedList是双向链表。130.Map的泛型泛型指的是类所以不能用基本数据类型,Integer不能用int1.注意1.key“”这是key在以下代码中的使用形式带“”2.key值不可以重复value的值可以重复1.增加和修改Map中的元素map.putkeyvalue2因为Map中的value元素不能重复key值只对应一个固定内存的值所以修改也使用put2.打印——map.getkeySystem.out.println(姓名 map.get(name) 性别 map.get(sex));3.删除——map.removekey4.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给JVM3.throw关键字用来主动抛出异常注意当使用关键字在程序某一块加上thorw异常时在方法名之后必须明确throws表明调用这个方法可能会抛出的异常并且在主动thorw的异常中又分为编译时异常和运行时异常。而编译时异常必须在方法名后加throws运行时异常可以不加135.lastIndexOf(“str”index)——从index开始往前找str136.static与final static区别被static修饰的是类变量所有对象共享137.类的成员变量如果是引用类型那么其默认值为null138.泛型E和T都可以表示泛型但通常E——element元素的类型通常指集合中元素的类型T——type范围更广139.括号匹配1.必须判断字符串是否为空否则直接charAt0可能抛出StringIndexOutOfBoundsException异常2.stack.pop()前必须进行stack.empty()否则可能抛出EmptyStackException异常140.逆波兰表达式——中缀表达式转后缀表达式141.递归的时间复杂度时间复杂度算法的执行时间随问题规模增长的变化趋势求是否为平衡二叉树每个根节点左右子树的高度之差1On*n最坏情况下每个结点遍历多次On每个节点只遍历一次142.计数排序1.定义计数数组时注意计数数组的长度如果min0计数数组的长度没问题如果min0数组长度就错误所以更改为143.Math.ceil(double) 的返回值是double