java基础相关(代码片段)

青春无敌美少 青春无敌美少     2022-12-03     207

关键词:

1.接口和抽象类

1).接口的特点

不能实例化
没有构造方法
方法默认public abstract修饰
变量默认public static final修饰

2).抽象类特点

继承了抽象类的子类,要么对父类的抽象方法进行重写,要么自己也是抽象类
抽象类也可以拥有普通方法
抽象类不能创建对象
抽象类也有构造方法,但是是为了子类创建对象使用

3).接口和抽象类相同点

都是不断抽取出来的抽象概念

4).接口和抽象类的区别

接口是行为的抽象,是一种行为的规范,接口是like a 的关系;抽象是对类的抽象,是一种模板设计,抽象类是is a 的关系。
接口没有构造方法,而抽象类有构造方法,其方法一般给子类使用
接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
抽象体现出了继承关系,继承只能单继承。接口提现出来了实现的关系,实现可以多实现。接口强调特定功能的实现,而抽象类强调所属关系。
接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。

2.抽象类和普通类的区别

抽象类不能被实例化,抽象类的子类必须实现所有的抽象方法才能被实例化;普通类可以实例化。

抽象类必须用关键字abstract修饰;普通类不使用关键字abstract。

抽象类中的抽象方法只被声明,没有方法体;普通类有方法体。

抽象方法不能是private的,因为抽象类必须被子类继承进行方法重写;普通方法可以是public、private、protected的。

抽象类中可以没有抽象方法,但抽象方法必须在抽象类中;普通类没有抽象方法。

子类继承抽象类之后,必须重写抽象类所有的抽象方法,否则子类必须设置为抽象类。

抽象类可以使用多态;普通类不可以。

3.“==”和equals的区别

“==”和equals 最大的区别是
“==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。
equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。
一、“==”
 “==”是运算符
如果比较的对象是基本数据类型,则比较的是其存储的值是否相等;
如果比较的是引用数据类型,则比较的是所指向对象的地址值是否相等(是否是同一个对象)。

二、equals()
equals是Object的方法,用来比较两个对象的内容是否相等。

注意:
equals 方法不能用于比较基本数据类型,如果没有对 equals 方法进行重写,则相当于“==”,比较的是引用类型的变量所指向的对象的地址值。

一般情况下,类会重写equals方法用来比较两个对象的内容是否相等。比如String类中的equals()是被重写了,比较的是对象的值。

4.Set和Map区别

  1. Map是键值对,Set是值的集合,当然键和值可以是任何的值;

  2. Map可以通过get方法获取值,而set不能因为它只有值;

  3. 都能通过迭代器进行for…of遍历;

  4. Set的值是唯一的可以做数组去重,Map由于没有格式限制,可以做数据存储

  5. map和set都是stl中的关联容器,map以键值对的形式存储,key=value组成pair,是一组映射关系。set只有值,可以认为只有一个数据,并且set中元素不可以重复且自动排序。

5.互斥锁与同步锁的区别

1.1 互斥
所谓互斥,就是不同线程,通过竞争进入临界区(共享的数据和硬件资源),为了防止访问冲突,在有限的时间内只允许其中之一独占性的使用共享资源。如不允许同时写。

1.2 同步
同步关系则是多个线程彼此合作,通过一定的逻辑关系来共同完成一个任务。一般来说,同步关系中往往包含互斥,同时,对临界区的资源会按照某种逻辑顺序进行访问。如先生产后使用。

互斥是通过竞争对资源的独占使用,彼此之间不需要知道对方的存在,执行顺序是一个乱序。
同步是协调多个相互关联线程合作完成任务,彼此之间知道对方存在,执行顺序往往是有序的。

互斥就是线程 A 访问了一组数据,线程 BCD 就不能同时访问这些数据,直到 A 停止访问了
同步就是 ABCD 这些线程要约定一个执行的协调顺序。比如 D 要执行,B 和 C 必须都得做完,而 B 和 C 要开始,A 必须先得做完

6.读写锁

7.session和cookie的区别

1.保存的位置不同
cookie保存在浏览器端,session保存在服务端。
2.使用方式不同
cookie如果在浏览器端对cookie进行设置对应的时间,则cookie保存在本地硬盘中,此时如果没有过期,则就可以使用,如果过期则就删除。如果没有对cookie设置时间,则默认关闭浏览器,则cookie就会删除。
session:我们在请求中,如果发送的请求中存在sessionId,则就会找到对应的session对象,如果不存在sessionId,则在服务器端就会创建一个session对象,并且将sessionId返回给浏览器,可以将其放到cookie中,进行传输,如果浏览器不支持cookie,则应该将其通过encodeURL(sessionID)进行调用,然后放到url中。
3.存储内容不同:cookie只能存储字符串,而session存储结构类似于hashtable的结构,可以存放任何类型。
4.存储大小:cookie最多可以存放4k大小的内容,session则没有限制。
5.session的安全性要高于cooKie
6.cookie的session的应用场景:cookie可以用来保存用户的登陆信息,如果删除cookie则下一次用户仍需要重新登录
session就类似于我们拿到钥匙去开锁,拿到的就是我们个人的信息,一般我们可以在session中存放个人的信息或者购物车的信息。
7.session和cookie的弊端:cookie的大小受限制,cookie不安全,如果用户禁用cookie则无法使用cookie。如果过多的依赖session,当很多用户同时登陆的时候,此时服务器压力过大。sessionId存放在cookie中,此时如果对于一些浏览器不支持cookie,此时还需要改写代码,将sessionID放到url中,也是不安全。

8.重写和重载

重写:在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。
重载:在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。

区别:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

9.内存溢出和内存泄漏的区别及详解

jvm内存除了程序计数器不会发生内存溢出,其余的都可能存在内存溢出。

  1. 内存溢出(Out Of Memory)

是程序在申请内存时,没有足够的内存空间供其使用。比如:你需要10M的空间,内存空间只剩8M,这就会出现内存溢出。
以栈举例:栈满时在做进栈必定产生空间溢出,叫上溢,栈空时在做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出。

  1. 内存泄漏 (Memory Leak)

是程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重。memory leak最终会导致out of memory。
这块内存不释放,就不能再用了,就叫这块内存泄漏了。

内存泄漏分类

以发生的方式来分类,内存泄漏可以分为4类:

  1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
  2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
  3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
  4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。
真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较常发性和偶发性内存泄漏它更难被检测到。

3.内存溢出的原因及解决方案:

修改JVM启动参数,直接增加内存。
检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
对代码进行走查和分析,找出可能发生内存溢出的位置。
使用内存查看工具动态查看内存使用情况。

4.出现内存溢出和内存泄露,重点排查几点:

1、检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条以上记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询,查多少字段用多少字段。
2、检查代码中是否有死循环或递归调用。
3、检查是否有大循环重复产生新对象实体。
4、检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。使用list.clear()或者map.clear()

java基础--常用api--日期相关api(代码片段)

一、java.util.Date  1、只用于显示系统时间,其大部分操作由Calendar代替。    格林威治时间(GMT):指的是1970年1月1日0时,不同地区有时间差。    默认输出格式:星期、月、日、时、分、秒、时区、年   2、构... 查看详情

java----正则表达式基础及相关应用(代码片段)

...安全领域中不可或缺的一点。下面总讲一下正则表达式的基础知识以及相关应用   什么是正则表达式:正则表达式(regularexpression,简写为regex)是一个字符串,用来描述匹配一个字符串集合的 查看详情

java基础数组相关的基本使用(代码片段)

文章目录1.一维数组1.1数组的概念1.2数组的定义格式1.3数组的访问1.4Java中的内存划分1.5两个引用指向同一个数组1.6数组异常1.7获取数组长度1.数组作为方法的参数1.9数组作为方法的返回值1.10冒泡排序2.二维数组2.1声明2.2创建2.3初... 查看详情

java基础--常用api--集合类相关api(代码片段)

一、泛型  1、泛型的本质是将类型参数化,即将数据类型作为参数。   2、泛型可以在编译期进行检查,其所有的强制转换是隐式且自动的,提高了代码的安全性。    3、泛型可以用在类(泛型类)、接口(泛型接口... 查看详情

java全栈javase:17.基础api与常见算法(代码片段)

...标了解数学相关API了解日期时间API了解系统类API掌握数组基础算法掌握数组工具类的使用熟练掌握String类的API熟练掌握StringBuilder和StringBuffer类的API能够处理字符串相关的算法处理1.和数学相关的类1.1java.lang.Mathjava.lang.Math类包含... 查看详情

java基础15java常用类(代码片段)

超详细的Java知识点路线图前言Java提供了强大的类库,帮助开发者快速完成开发任务,这也是其叱咤风云20多年的一个重要原因。我们现在就学习一些Java中常用的类。本文将介绍:字符串相关:String、StringBuffer、St... 查看详情

java基础-反射(代码片段)

反射基础反射静态语言和动态语言动态语言静态语言JavaReflectionJava反射机制研究及使用Java反射机制提供的功能Java反射优点和缺点Java反射相关的主要APICLass类获取Class类的实例哪些类型可以有Class对象Java的内存分析了解:类的... 查看详情

java基础-反射(代码片段)

反射基础反射静态语言和动态语言动态语言静态语言JavaReflectionJava反射机制研究及使用Java反射机制提供的功能Java反射优点和缺点Java反射相关的主要APICLass类获取Class类的实例哪些类型可以有Class对象Java的内存分析了解:类的... 查看详情

smali相关的基础知识点(代码片段)

... 其实Smali语言并不是很难,如果你有一些汇编指令的基础,学习Smali就更加简单了,有兴趣的可以接着往下看,这里就不多说了!!!Smali语言基础知识点:寄存器:寄存器的命名分为两种,V*P*简单理解为V*代表本地寄存器:... 查看详情

java注解基础入门(代码片段)

...深入的理解,在工作中可以巧妙的使用注解,完善自己对基础知识的理解和使用。目录  1.注解概述    2.注解作用   &n 查看详情

java进阶——线程基础(代码片段)

线程基础1、线程介绍1.1、线程相关概念程序(program):是完成特定任务,用某种语言编写的一组的集合(例如:java代码就是一个程序)进程:是指运行中的程序(比如:我现在使用的Typora)进程是程序的一次执行过程是动态的... 查看详情

java基础扫盲(代码片段)

本篇博文针对有其它编程语言基础,但未接触Java的读者。读完本篇博文,能够对Java面向对象的特性有个基本认识,基本掌握Java语法,看懂相关代码。包名取名规范包名=域名反向例如:域名:www.baidu.com... 查看详情

java基础15----方法的定义与使用(代码片段)

文章目录引言方法的定义方法重载总结引言在日常的程序开发中,经常会遇到这样的情况,程序的某个功能需要被多次执行,不定义相关的方法的话,每次需要执行该功能就需要我们写相关代码,耗时耗力ÿ... 查看详情

java基础-io-读取文件内容(代码片段)

File类  读取文件内容使用IO流,操作文件夹./文件内容使用File类,如创建/遍历/删除文件夹,查看文件的相关属性操作代码操作:Filefile=newFile("/Users/weilina/Downloads/java");file.mkdir();//创建文件夹System.out.println(file1.getPath());//返回路... 查看详情

线程八大基础核心五(线程相关方法一)(代码片段)

1.引子在java多线程并发编程中,有八大基础核心。考考你:看看都有哪八大基础核心呢?它们分别是: 1.创建线程的方式 2.线程启动 3.线程停止 4.线程生命周期 5.线程相关的方法 6.线程相关的属性 7.线程异常处理 8.线程安全今天... 查看详情

java实训课web网页相关知识点总结(代码片段)

文章目录Mysql基础操作操作指令数据库实验DAO模式DAO封装的增删改查代码DAO封装的增改查测试代码jspjavaWeb创建一个新的工程文件IDEA配置Web项目环境环境:IDEA+tomcat在当前的文件过程下配置web添加tomcat本地连接配置web.xml文... 查看详情

深入理解java注解——注解基础(代码片段)

一直以来对Java注解的理解都不是特别深刻,但是在多年的软件开发生涯中接触了不少注解相关的东西,所以有必要深入理解一下Java注解知识,通过本篇博客记录学习Java注解的一些知识点。深入理解Java注解(二&#x... 查看详情

java基础servlet技术(代码片段)

文章目录  下午处理了Tomcat的javaweb项目的配置报错,追踪分析了一下javax.servlet包中的抽象类HttpServlet、接口HttpServletRespons、接口ServletResponse、公共类PrintWriter,以及相关调用方法。虽然没有进行系统的理论学习,但... 查看详情