JavaSE易错知识点
总是记不住或者记错的一些Java基础知识
努力找到工作呀!!!
这个作者很懒,什么都没留下…
展开
-
常量池、字符串常量池与运行时常量池区分
常量池每个class一份,存在于字节码文件中。常量池中有字面量(数量值、字符串值)和符号引用(类符号引用、字段符号引用、方法符号引用),虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等类型运行时常量池每个class一份,存在于方法区中(元空间)。当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,经过解析(resolve)之后,也就是把符号引用替换为直接引用,解析的过程会去查询全局字符串池,也就是下面的StringTable,以保证运行时常量池所引用的字符转载 2021-07-23 23:18:12 · 486 阅读 · 1 评论 -
关于类与对象的创建,以及静态属性与实例属性的赋值
文章目录1.类创建的整体流程1.1类加载1.2链接1.2.1验证1.2.2准备1.2.3解析1.3类的初始化1.4静态属性的赋值总结2.对象创建的整体流程2.1类的加载、链接、初始化2.2开辟内存空间2.2.1指针碰撞2.2.2空闲列表2.2.3并发问题2.3赋默认值2.4设置对象头2.5初始化2.6实例属性的赋值总结1.类创建的整体流程1.1类加载所谓加载,就是将 Java 类的字节码文件加载到机器内存中,并在内存中构建出 Java 类的原型——类模板对象。所谓类模板对象,其实就是Java 类在原创 2021-07-23 23:10:37 · 1035 阅读 · 1 评论 -
java快排详解
思路个人觉得快排是冒泡的进阶版,都是利用了交换的思想快排的一般步骤:1、设置中轴数,可以是最左边的数,可以是中间索引的数,可以是随机索引的数(防止出现极端数组造成时间复杂度太高)2、中轴左边的值小于中轴数,中轴右边的值大于中轴数3、调用递归,中轴左半边按照1、2步递归,中轴右半边按照1、2步递归程序程序一:中轴数为数组最左边的数(单指针) public int[] MySort (int[] arr) { // write code here原创 2021-07-17 10:16:20 · 781 阅读 · 0 评论 -
ArrayList详解
文章目录数据结构线程安全问题继承关系构造方法动态扩容机制数据结构ArrayList的底层数据结构就是一个数组,数组元素的类型为Object类型,对ArrayList的所有操作底层都是基于数组的。线程安全问题线程不安全,只能用在单线程环境。解决:第一,使用synchronized关键字;第二,可以用Collections类中的静态方法synchronizedList()对ArrayList进行调用即可继承关系实现了Serializable接口,因此它支持序列化,能够通过序列化传输;实现了Ran原创 2021-07-06 19:48:08 · 338 阅读 · 0 评论 -
HashMap详解
文章目录简介构造函数数据结构工作原理PUT 方法hashCode方法扩容机制JDK1.8对hashMap的优化HashMap和HashTable 的异同优化 HashMap线程安全问题有序的Map简介HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。原创 2021-07-05 17:11:58 · 467 阅读 · 0 评论 -
匿名内部类
匿名内部类的创建格式为: new 父类构造器(参数列表)|实现接口(){//匿名内部类的类体实现}使用匿名内部类时,必须继承一个类或实现一个接口匿名内部类由于没有名字,因此不能定义构造函数匿名内部类中不能含有静态成员变量和静态方法...原创 2021-05-31 21:01:52 · 94 阅读 · 0 评论 -
继承、构造函数与synchronized
1、JAVA语法规定构造方法不能被synchronized关键词修饰,而且构造方法每次都是构造出新的对象,不存在多个线程同时读写同一对象中的属性的问题,所以不需要同步 。2、子类的同名方法可以覆盖父类的对应方法,只不过synchronized修饰符不会被继承,也就是说子类覆盖后对应方法就不同步了,但是可以调用的。这个时候调用父类的对应方法还是可以同步的...原创 2021-05-29 22:26:51 · 548 阅读 · 0 评论 -
抽象类与接口一些易错点
1、接口中方法的默认修饰符时public abstract,抽象方法没有方法体;JDK8中,接口中的方法可以被default和static修饰,但是被修饰的方法必须有方法体。2、abstract 类中最好不要有private的成员,不代表必须没有。3、关于抽象类JDK 1.8以前,抽象类的方法默认访问权限为protectedJDK 1.8时,抽象类的方法默认访问权限变为default关于接口JDK 1.8以前,接口中的方法必须是public的JDK 1.8时,接口中的方法可以是public的原创 2021-05-28 21:56:34 · 266 阅读 · 0 评论 -
构造函数与对象创建
构造函数完成对象的初始化1、子类构造函数第一行是默认super()调用父类无参构造函数。2、当程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。3、分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化。其他方法完成初始化调用Java.io.ObjectInputStream的readObject()方法和调用对象的clone()方法中,对象的初始化并不是通过构造函数完成的,而是读取别的内存区域中的对象的各个域来完成。.原创 2021-05-26 21:21:10 · 115 阅读 · 0 评论 -
泛型之间的包含关系
1、只看尖括号里边的:如果尖括号里的是一个类,那么尖括号里的就是一个点,比List,List如果尖括号里面带有问号,那么代表一个范围,<? extends A> 代表小于等于A的范围,<? super A>代表大于等于A的范围,<?>代表全部范围2、尖括号里的所有点之间互相赋值都是错,除非是俩相同的点3、尖括号小范围赋值给大范围,对,大范围赋值给小范围,错。如果某点包含在某个范围里,那么可以赋值,否则,不能赋值4、List<?>和List 是相等的,.原创 2021-05-25 21:36:08 · 135 阅读 · 0 评论 -
关于程序编译
java编译成的是字节码,在运行时被各系统的jvm翻译成本系统可以识别的机器码,这就是java一次编程多平台应用的跨平台性java源文件生成的是class文件,与系统无关java编译出来的目标文件,不能运行在任意jvm上...原创 2021-05-24 22:04:36 · 66 阅读 · 0 评论 -
关键字修饰的易错点
1、abstract只能修饰类和方法,不能修饰字段2、构造方法可以用private,protected,default,private3、public:同类、同包、子类、不同包protected:同类、同包、子类default:同类、同包private:同类原创 2021-05-21 21:56:36 · 133 阅读 · 0 评论 -
字符串的拼接
String test="javaandpython";String strl="java";String str2="and";String str3="python";System.out.println(test=="java"+"and"+"python"):System.out.println(test ==strl + str2 + str3);结果对于上面这段代码,结果是true false原理这是因为字符串字面量拼接操作是在Java编译器编译期间就执行了,也就是说编译器编原创 2021-05-20 22:10:35 · 122 阅读 · 0 评论 -
五种单例模式简介
1.饿汉式(线程安全,调用效率高,但是不能延时加载);2.懒汉式(线程安全,调用效率不高,但是能延时加载);3.Double CheckLock实现单例:DCL也就是双重锁判断机制(由于JVM底层模型原因,偶尔会出问题,不建议使用);4.静态内部类实现模式(线程安全,调用效率高,可以延时加载);5.枚举类(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用)...原创 2021-05-10 21:22:00 · 87 阅读 · 0 评论 -
节点流与处理流
按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为节点流和处理流两类。**节点流:**可以从或向一个特定的地方(节点)读写数据。如FileReader.**处理流:**是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。JAVA常用的节点流:文 件 FileInputStream FileOutputStrean FileReader FileWr转载 2021-05-07 22:28:23 · 75 阅读 · 0 评论 -
编码问题
char foo='中’这里的’中‘应该是不管用什么编码方式存储,赋值给char变量后都会先转换成对应的unicode的序号\u4e2d,之后再用UTF-16BE来作为\u4e2d这个字符编码的存储方案。因此,只要是utf-16be能表示的unicode编码都是可以成功的,与java文件本身的字符编码无关系。比如,’中‘在gbk中的编码是d6d0,那当赋值给char类型时,java知道这是gbk字符集下表示的’中‘,那就能通过对比gbk和unicode,找到d6d0对应的是\u4e2d.同理,utf-8原创 2021-05-05 21:40:07 · 62 阅读 · 0 评论 -
运行时异常与非运行时异常
Java的异常分为两种,一种是运行时异常(RuntimeException),一种是非运行异常也叫检查式异常(CheckedException)。运行时异常运行时异常不需要程序员去处理,当异常出现时,JVM会帮助处理。常见的运行时异常有:ClassCastException(类转换异常)ClassNotFoundExceptionIndexOutOfBoundsException(数组越界异常)NullPointerException(空指针异常)ArrayStoreException(数组存原创 2021-04-24 21:54:25 · 324 阅读 · 0 评论 -
try catch finally与return
结论一:finally块前有return,会先执行return语句,并保存下来,再执行finally块,最后return(return的值会暂存在栈里面,等待finally执行后再返回)。结论二:如果finally块中有return语句的话,它将覆盖掉函数中其他return语句。finally块前有return、finally块中也有return,先执行前面的return,保存下来,再执行finally的return,覆盖之前的结果,并返回。...原创 2021-04-14 22:00:07 · 106 阅读 · 0 评论 -
正则表达式
正则表达式的规则 任意一个字符表示匹配任意对应的字符,如a匹配a,7匹配7,-匹配-。 []代表匹配中括号中其中任一个字符,如[abc]匹配a或b或c。 在中括号里面和外面代表含义不同,如在外时,就匹配-,如果在中括号内[a-b]表示匹配26个小写字母 中的任一个;[a-zA-Z]匹配大小写共52个字母中任一个;[0-9]匹配十个数字中任一个。 在中括号里面和外面含义不同,如在外时,就表示开头,如7[0-9]表示匹配开头是7的,且第二位是任一数字的字符串;如果在中括号里面,表示除了原创 2021-04-06 08:46:56 · 153 阅读 · 0 评论 -
一些jvm命令
jps:查看本机java进程信息。 jstack:打印线程的栈信息,制作线程dump文件。 jmap:打印内存映射,制作堆dump文件 jstat:性能监控工具 jhat:内存分析工具 jconsole:简易的可视化控制台 jvisualvm:功能强大的控制台...原创 2021-04-02 08:39:38 · 52 阅读 · 0 评论 -
hashCode()方法和equals()方法
hashCode()方法和equals()方法的作用其实是一样的,在Java里都是用来对比两个对象是否相等一致。重写的equals()里一般比较全面,但效率比较低,而hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),但效率比较高可以得出:equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。hashCode()相等的两个对象他们的equal()不一定相等,也就是hashC原创 2021-04-01 08:45:55 · 67 阅读 · 0 评论 -
HashMap、HashTable与TreeMap键值对的问题
HashMap基于哈希表实现Map接口的类,并允许null的值和null键。HashTable不允许null的值和null键。TreeMap通过红黑树实现Map接口的类,key不可以为null,会报NullPointerException异常,value可以为null。原创 2021-03-31 08:48:57 · 100 阅读 · 0 评论 -
多态中的方法调用
java多态有两种情况:重载和覆写**在覆写中,**运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法;**在重载中,**运用的是静态多分派,即根据静态类型确定对象,因此不是根据new的类型确定调用的方法...原创 2021-03-26 08:47:57 · 174 阅读 · 0 评论 -
局部变量
1、被static修饰的变量称为静态变量,静态变量属于整个类,而局部变量属于方法,只在该方法内有效,所以static不能修饰局部变量2、在方法中定义的局部变量在该方法被执行时创建:错误不是局部变量在该方法被执行/调用时创建,而是应该为在该变量被声明并赋值时创建,可以理解为“当代码执行到该变量被赋值的代码时才被创建”...原创 2021-03-25 15:03:22 · 641 阅读 · 0 评论 -
基本数据类型间相互转换
float f = 45.0;错误,小数如果不加 f 后缀,默认是double类型。double转成float向下转换,意味着精度丢失,所以要进行强制类型转换。char s = ‘\u0639’;正确,是使用unicode表示的字符。d:Object o = ‘f’;正确,‘f’ 字符会自动装箱成包装类,可以向上转型成ObjectDouble d = 100;错误,整数默认是int类型,int类型不能转型为Double,最多通过自动装箱变为Integer但是Integer与Double没有继承原创 2021-03-25 08:50:51 · 393 阅读 · 0 评论 -
与线程有关的方法
sleep()方法:在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。sleep()使当前线程进入阻塞状态,在指定时间内不会执行。wait()方法:在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。notify()方法:唤醒当前对象锁的等待线程使用noti原创 2021-03-24 08:56:40 · 108 阅读 · 0 评论 -
抛InterruptedException的代表方法
抛InterruptedException的代表方法java.lang.Object 类的 wait 方法java.lang.Thread 类的 sleep 方法java.lang.Thread 类的 join 方法原创 2021-03-23 08:54:44 · 90 阅读 · 0 评论 -
i++与++i
结果:numcount=0分析:count = count++ 原理是 temp = count; count = count+1 ; count = temp就是先把局部变量表中count的值0放入操作数栈中,然后直接对局部变量表中的count加1,然后再把操作数栈中的0出栈赋值给局部变量表中的count,最终局部变量表中的count值仍为0**若是改为count=++count;(先自加,再返回自加后的值),结果就是5050101=510050了**...原创 2021-03-22 08:48:47 · 76 阅读 · 0 评论 -
JAVA初始化过程加载顺序
JAVA初始化过程加载顺序初始化过程:初始化父类中的静态成员变量和静态代码块 ;初始化子类中的静态成员变量和静态代码块 ;初始化父类的普通成员变量和代码块,再执行父类的构造方法**(如果父类构造方法中调用了在子类中重写的方法,实际执行子类重写后的方法);**初始化子类的普通成员变量和代码块,再执行子类的构造方法补充:静态块:用static申明,JVM加载类时执行,仅执行一次构造块:类中直接用{}定义,每一次创建对象时执行执行顺序优先级:静态块>main()>构造块>构造方原创 2021-03-21 10:46:56 · 118 阅读 · 0 评论 -
数据类型转换
float f = 45.0错误,小数如果不加 f 后缀,默认是double类型。double转成float向下转换,意味着精度丢失,所以要进行强制类型转换。char s = ‘\u0639’正确,是使用unicode表示的字符。Object o = ‘f’正确,‘f’ 字符会自动装箱成包装类,可以向上转型成ObjectDouble d = 100错误,整数默认是int类型,int类型不能转型为Double,最多通过自动装箱变为Integer但是Integer与Double没有继承关系,也没法原创 2021-03-20 18:57:08 · 205 阅读 · 0 评论 -
基本类型与包装类
基本类型与包装类的比较基本型和基本型封装型进行“==”运算符的比较基本型封装型将会自动拆箱变为基本型后再进行比较,封装类与封装类进行不会自动拆箱,碰到运算符才会自动拆箱。int a = 220;Integer b = 220;System.out.println(ab);//true两个Integer类型进行“==”比较如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,-128~127保存在常量池,超过此范围就要new对象原创 2021-03-20 16:09:18 · 53 阅读 · 0 评论 -
Java内部类
内部类在Java中,可以将一个类定义在另一个类里面或者一个方法里边,这样的类称为内部类,广泛意义上的内部类一般包括四种:成员内部类,局部内部类,匿名内部类,静态内部类 。成员内部类(1)该类像是外部类的一个成员,可以无条件的访问外部类的所有成员属性和成员方法(包括private成员和静态成员);(2)成员内部类拥有与外部类同名的成员变量时,会发生隐藏现象,即默认情况下访问的是成员内部类中的成员。如果要访问外部类中的成员,需要以下形式访问:【外部类.this.成员变量或外部类.this.成员方法】;转载 2021-03-20 09:20:48 · 48 阅读 · 0 评论 -
位运算
位运算运算符与运算符(&):运算符左右两边均为1结果为1,其余情况结果为0或运算符(|) :运算符左右两边只要任意一边出现1,结果为1异或运算符(^):只要相同都是false(0),只有不同才是true(1)取反运算符(`):0变1,1变0左移运算(<<):把所有位向左移动几位,后把右边空的用0补上,最左边多出的去掉快速的算法:M << n = M * 2n右移运算符(>>):右移和左移其实是一样的,但是还是有点不同的,不同点在于对于正数和负数补原创 2021-03-19 20:41:21 · 56 阅读 · 0 评论 -
方法重写与方法重载
方法重写与方法重载方法重写\方法覆盖(overwrite\override)条件:发生在具有继承关系的父子类之间规则:方法名相同,参数类型相同子类返回类型小于等于父类方法返回类型,子类抛出异常小于等于父类方法抛出异常,子类访问权限大于等于父类方法访问权限。注意:私有方法不能继承,因此不能重写构造方法不能继承,因此不能重写静态方法不存在覆盖覆盖只针对方法,不针对属性方法重载(overload)条件:同一个类中规则:方法名相同,参数列表不同注意:与返回值无关,与修饰符列表无关原创 2021-03-19 16:04:14 · 68 阅读 · 2 评论 -
按值调用和按引用调用
按值调用和按引用调用按值调用:方法接收的是调用者提供的值按引用调用:方法接受的是调用者提供的变量地址Java是按值调用按值调用###参数是基本数据类型:结果为5传参的时候对a进行了拷贝,修改被拷贝的a并不会影响原来的a###参数是引用数据类型:结果为张三引用变量做为形参也是复制了一份地址指向对象,因此可以改变对象的内容但如果形参的地址发生了改变,不会改变实参指向的地址注:此为平时自己在各个平台整理的知识点,来源忘记了,如果其中有侵权内容请联系我~...原创 2021-03-19 09:14:35 · 374 阅读 · 0 评论