java开发基础知识学习总结

本文详细阐述了面向对象编程的概念及其与面向过程的区别,并介绍了网络基础包括DNS、CDN、内外网IP等知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、面向对象概念

1. 面向对象和面向过程的区别?
面向过程 :面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。
面向对象 :面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,面向对象性能比面向过程低。

参考问题 :面向过程性能一定比面向对象高?
不一定,面向过程也需要分配内存,计算内存偏移量,Java性能差的主要原因并不是因为它是面向对象语言,而是Java是半编译语言,最终的执行代码并不是可以直接被CPU执行的二进制机器码。而面向过程语语多都是直接编译成机械码在电脑上执行,并且其它一些面向过程的脚本语言性能也并不一定Java好。

2. 对象和类的关系?举例说明

类是对象的模版,对象是类的实例。
举例:猫是一个类,你养的那只猫是一个对象;汽车是一个类,你开的那辆车是一个对象。

3. 类里面包含什么?

属性和方法。

4. 类的特性?

封装性
将数据和操作封装为一个有机的整体,保证内部的高内聚性和外部的第耦合性。以特定的访问权限来使用类的成员,能够增强安全性和简化编程。

继承性
继承性更符合认知规律,使程序更易于理解,同时节省不必要的重复代码。

多态性
同一操作作用于不同对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

二、网络基础

在这里插入图片描述

5. DNS是什么?

域名系统(英文:Domain Name System, 缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。

6.域名和端口

域名(英语:Domain Name),又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)。 由于IP地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点,人们设计出了域名,并通过网域名称系统(DNS,Domain NameSystem)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串。
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。
端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴。

7. CDN是什么?

CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有⽹络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

8. 外网IP和内网IP区别?内网IP网段?

外网IP就是互联网的IP,内网IP就是内部网的IP。
内⽹IP⽹段如下:
10.0.0.0/8--------------10.0.0.0~10.255.255.255(A类)
172.16.0.0/12---------172.16.0.0~172.31.255.255(B类)
192.168.0.0/16 ———192.168.0.0~192.168.255.255(C类)

9. VPN是什么?

虚拟专用⽹络(VPN)的功能是:在公用网络上建立专用网络,进行加密通讯。在企业网络中有广泛应用。VPN网关通过对数据包的加密和数据包目标地址的转换实现远程访问。VPN可通过服务器、硬件、软件等多种方式实现。

10.http和https
http是一个在计算机世界里专门在两点之间传播文字、图片、音频、视频等超文本数据的约定和规范。

状态码

在这里插入图片描述

http(1.1)的优点有哪些:
1)简单
2)灵活易于扩展
3)应用广泛和跨平台
缺点:
1)无状态
2)明文传输
3)不安全
http与https有哪些区别:
1)HTTP是超文本传输协议,信息是明文传输,在TCP和Http网络层之间加入了SSL/TLS安全协议HTTP连接建立相对简单
2)TCP三次握手之后便可以进行HTTP的报文传输。HTTPS在TCP三次握手之后,还需要进行SSL/TSL的握手过程
3)HTTP的端口号是80,http的端口号是443
从浏览器输入一个url到返回响应的完整过程
域名解析–》TCP三次握手建立连接–》发起http请求–》服务端接受并且做出响应–》浏览器收到响应并解析html代码–》TCP四次挥手断开连接–》浏览器渲染页面呈现给用户

11.Get和Post的区别
Get方法的含义是请求从服务器获取资源,这个资源可以是静态的文本、页面、图片视频等。
而POST方法则是相反操作、它向URL指定的资源提交数据,数据就放在报文body里面。

三、计算机原理和操作系统

内存、CPU、硬盘?

内存是计算机的重要部件之⼀。 它是外存与CPU进⾏沟通的桥梁,计算机中所有程序的运⾏都在内存中进⾏。内存性能的强弱影响计算机整体发挥的⽔平。 内存(Memory)也称内存储器和主存储器,它用于暂时存放CPU中的运 算数据,与硬盘等外部存储器交换的数据。 只要计算机开始运⾏,操作系统就会把需要运算的数据从内存调到 CPU中进⾏运算。当运算完成,CPU将结果传送出来。 内存的运⾏也决定计算机整体运⾏快慢的程度。 内存条由内存芯片、电路板、⾦⼿指等部分组成。
电脑硬盘是计算机最主要的存储设备。硬盘(港台称之为硬碟,英⽂ 名:Hard Disk Drive, 简称HDD 全名温彻斯特式硬盘)由⼀个或者多个 铝制或者玻璃制的碟片组成。这些碟片外覆盖有铁磁性材料。 绝⼤多数硬盘都是固定硬盘,被永久性地密封固定在硬盘驱动器中。 早期的硬盘存储媒介是可替换的,不过今日典型的硬盘是固定的存储媒 介,被封在硬盘里 (除了⼀个过滤孔,用来平衡空⽓压⼒)。随着发 展,可移动硬盘也出现了,⽽且越来越普及,种类也越来越多.⼤多数微 机上安装的硬盘,由于都采用温切斯特(winchester)技术⽽被称之为“温切 斯特硬盘”,或简称“温盘”。
中央处理器(CPU),是电⼦计算机的主要设备之⼀,电脑中的核⼼ 配件。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU 是计算机中负责读取指令,对指令译码并执⾏指令的核⼼部件。中央处理 器主要包括两个部分,即控制器、运算器,其中还包括⾼速缓冲存储器及 实现它们之间联系的数据、控制的总线。电⼦计算机三⼤核⼼部件就CPU、内部存储器、输⼊/输出设备。中央处理器的功效主要为处理指 令、执⾏操作、控制时间、处理数据。

Linux相关
https://blog.youkuaiyun.com/DDDDeng_/article/details/107707607

四、数据库基础

五、Java开发相关基础

Java基础知识面试题
https://blog.youkuaiyun.com/ThinkWon/article/details/104390612
1、JDK和JRE有什么区别

JDK,java开发工具包
JRE,java运行环境
JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。

2、==和equals的区别是什么
1.对于基本类型,==比较的是值;
2.对于引用类型,比较的是地址;
3.equals不能用户对基本类型的比较;
4.如果没有重写equals,equals就相当于

5.如果重写了equals,equals比较的是对象的内容;
3、final在java中有什么作用
1.final修饰的成员变量,必须在声明的同时赋值,一单创建不可修改;
2.final修饰的方法,不能被子类重写。
3.final类中的方法默认是final的;
4.private类型的方法默认是final的;
4、java 中的 Math.round(-1.5) 等于多少?
Math提供了三个与取整有关的方法:ceil、floor、round

(1)ceil:向上取整

Math.ceil(11.3) = 12;

Math.ceil(-11.3) = 11;

(2)floor:向下取整

Math.floor(11.3) = 11;

Math.floor(-11.3) = -12;

(3)round:四舍五入;

加0.5然后向下取整。

Math.round(11.3) = 11;

Math.round(11.8) = 12;

Math.round(-11.3) = -11;

Math.round(-11.8) = -12;

5、String 属于基础的数据类型吗?
不属于。

八种基本数据类型:byte、short、char、int、long、double、float、boolean。

6、String str="i"与 String str=new String(“i”)一样吗?

String str="i"会将起分配到常量池中,常量池中没有重复的元素,如果常量池中存中i,就将i的地址赋给变量,如果没有就创建一个再赋给变量。

String str=new String(“i”)会将对象分配到堆中,即使内存一样,还是会重新创建一个新的对象。

7、如何将字符串反转?
将对象封装到stringBuilder中,调用reverse方法反转。

8、String 类的常用方法都有那些?
(1)常见String类的获取功能

length:获取字符串长度;
charAt(int index):获取指定索引位置的字符;
indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引;
substring(int start):从指定位置开始截取字符串,默认到末尾;
substring(int start,int end):从指定位置开始到指定位置结束截取字符串;

(2)常见String类的判断功能

equals(Object obj): 比较字符串的内容是否相同,区分大小写;
contains(String str): 判断字符串中是否包含传递进来的字符串;
startsWith(String str): 判断字符串是否以传递进来的字符串开头;
endsWith(String str): 判断字符串是否以传递进来的字符串结尾;
isEmpty(): 判断字符串的内容是否为空串"";

(3)常见String类的转换功能

byte[] getBytes(): 把字符串转换为字节数组;
char[] toCharArray(): 把字符串转换为字符数组;
String valueOf(char[] chs): 把字符数组转成字符串。valueOf可以将任意类型转为字符串;
toLowerCase(): 把字符串转成小写;
toUpperCase(): 把字符串转成大写;
concat(String str): 把字符串拼接;

(4)常见String类的其他常用功能

replace(char old,char new) 将指定字符进行互换
replace(String old,String new) 将指定字符串进行互换
trim() 去除两端空格
int compareTo(String str) 会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果,如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果,如果连个字符串一摸一样 返回的就是0。

9、new String(“a”) + new String(“b”) 会创建几个对象?
对象1:new StringBuilder()

对象2:new String(“a”)

对象3:常量池中的"a"

对象4:new String(“b”)

对象5:常量池中的"b"

深入剖析:StringBuilder中的toString():

对象6:new String(“ab”)

强调一下,toString()的调用,在字符串常量池中,没有生成"ab"

附加题

String s1 = new String(“1”) + new String(“1”);//s1变量记录的地址为:new String
s1.intern();//在字符串常量池中生成"11"。如何理解:jdk6:创建了一个新的对象"11",也就有新的地址;jdk7:此时常量池中并没有创建"11",而是创建了一个指向堆空间中new String(“11”)的地址;
String s2 = “11”;
System.out.println(s1 == s2);//jdk6:false;jdk7:true

10、普通类和抽象类有哪些区别?
抽象类不能被实例化;
抽象类可以有抽象方法,只需申明,无须实现;
有抽象方法的类一定是抽象类;
抽象类的子类必须实现抽象类中的所有抽象方法,否则子类仍然是抽象类;
抽象方法不能声明为静态、不能被static、final修饰。

11、接口和抽象类有什么区别?
(1)接口

接口使用interface修饰;
接口不能实例化;
类可以实现多个接口;

①java8之前,接口中的方法都是抽象方法,省略了public abstract。②java8之后;接口中可以定义静态方法,静态方法必须有方法体,普通方法没有方法体,需要被实现;

(2)抽象类

抽象类使用abstract修饰;
抽象类不能被实例化;
抽象类只能单继承;
抽象类中可以包含抽象方法和非抽象方法,非抽象方法需要有方法体;
如果一个类继承了抽象类,①如果实现了所有的抽象方法,子类可以不是抽象类;②如果没有实现所有的抽象方法,子类仍然是抽象类。

12、java 中 IO 流分为几种?

(1)按流划分,可以分为输入流和输出流;

(2)按单位划分,可以分为字节流和字符流;

字节流:inputStream、outputStream;

字符流:reader、writer;

13、BIO、NIO、AIO有什么区别?

https://blog.youkuaiyun.com/m0_38109046/article/details/89449305

同步与异步
同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。
异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。
同步和异步的区别最大在于异步的话调用者不需要等待处理结果,被调用者会通过回调等机制来通知调用者其返回结果。
阻塞和非阻塞
阻塞: 阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。
非阻塞: 非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。

(1)同步阻塞BIO
一个连接一个线程。
JDK1.4之前,建立网络连接的时候采用BIO模式,先在启动服务端socket,然后启动客户端socket,对服务端通信,客户端发送请求后,先判断服务端是否有线程响应,如果没有则会一直等待或者遭到拒绝请求,如果有的话会等待请求结束后才继续执行。

(2)同步非阻塞NIO
一个请求一个线程。
NIO主要是想解决BIO的大并发问题,BIO是每一个请求分配一个线程,当请求过多时,每个线程占用一定的内存空间,服务器瘫痪了。
JDK1.4开始支持NIO,适用于连接数目多且连接比较短的架构,比如聊天服务器,并发局限于应用中。

(3)异步非阻塞AIO
一个有效请求一个线程。
JDK1.7开始支持AIO,适用于连接数目多且连接比较长的结构,比如相册服务器,充分调用OS参与并发操作。

14、java反射

https://blog.youkuaiyun.com/SUN__CGJ/article/details/109557238?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.baidujs&dist_request_id=&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.baidujs

15、什么是java序列化?什么情况下需要序列化?
序列化就是一种用来处理对象流的机制。将对象的内容流化,将流化后的对象传输与网络之间。序列化是将对象转换为容易传输的格式的过程。

序列化方法:implement serializable接口-》使用一个输出流(FileOutputStream)来构造一个改对象-》接着使用该对象的writeOBject方法就可以将参数的obj对象写入磁盘。需要恢复的时候使用输入流。

一般程序在运行时,产生对象,这些对象随着程序的停止而消失,但我们想将某些对象保存下来,这时,我们就可以通过序列化将对象保存在磁盘,需要使用的时候通过反序列化获取到。

对象序列化的最主要目的就是传递保存对象,保存对象的完整性可传递性

譬如通过网络传输或者把一个对象保存成本地一个文件的时候,需要使用序列化。

16、为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么?

(1 )为什么要使用克隆?
相对一个对象进行复制,又想保留原有的对象进行接下来的操作。

(2)如何实现对象克隆
实现Cloneable接口,重写clone方法;
实现Serializable接口,通过对象的序列化和反序列化实现深克隆。

(3)深拷贝和浅拷贝的区别是什么
浅拷贝:仅仅克隆基本类型变量,不克隆引用类型变量。
深拷贝:即克隆基本类型变量,又克隆应用类型变量。

17、throw 和 throws 的区别?
(1)throw
作用在方法内,表示抛出具体异常,由方法内的语句处理;
(2)throws
作用在方法声明上,表示抛出异常,由调用者来处理异常;

18、final、finally、finalize 有什么区别?

final可以修饰类,变量,方法,修饰的类不能被基础,修饰的变量不能被重新赋值,修饰的方法不能被重写

finally用户抛出异常,finally代码块内语句无论是否发生异常,都会执行finally,经常用于一些流的关闭。

finalize方法用于垃圾回收。

19、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
会,顺序是 catch–>finally–>catch中return语句
在这里插入图片描述
20、常见的异常类有哪些?

在这里插入图片描述
21、hashcode是什么,有什么作用?

java中Object有一个方法:

public native int hashcode();

(1)hashcode()方法作用

hashcode()方法主要配合基于散列的集合一起使用,比如HashSet、HashMap、HashTable。

当集合中要添加新对象的时候,先调用这个对象的hashcode()方法,得到对应的hashcode值,例如hashmap中会保存已经存入的的对象的hashcode值。如果不存在该hashcode值,则直接存入,如果存在,就调用equals方法与新元素比较,相同就不存,不同就存入。

(2)equals和hashcode的关系

如果equals为true,hashcode一定相等;
如果equals为false,hashcode不一定不相等;
如果hashcode值相等,equals不一定相等;
如果hashcode值不等,equals一定不相等

(3)重写equals方法时,一定要重写hashcode方法

提高程序运行效率,减少equals

22、java 中操作字符串都有哪些类?它们之间有什么区别?
(1)String

String是不可变对象,每次对String类型的改变时都会生成一个新的对象。

(2)StringBuilder

线程不安全,效率高,多用于单线程。

(3)StringBuffer

线程安全,由于加锁的原因,效率不如StringBuilder,多用于多线程。

不频繁的字符串操作使用String,操作频繁的情况不建议使用String。

StringBuilder > StringBuffer > String。

23、java中都有哪些引用类型

(1)强引用

Java中默认声明的就是强引用,比如:

Object obj = new Object();
obj = null;

只要强引用存在,gc回收期就永远不会回收被引用的对象。如果想被回收,可以将对象置为null;

(2)软引用(SoftReference)

在内存足够的时候,软引用不会被回收,只有在内存不足时,系统才会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会跑出内存溢出异常。

byte[] buff = new byte[1024 * 1024];
SoftReference<byte[]> sr = new SoftReference<>(buff);

(3)弱引用(WeakReference)

进行垃圾回收时,弱引用就会被回收。

(4)虚引用(PhantomReference)

(5)引用队列(ReferenceQueue)

引用队列可以与软引用、弱引用、虚引用一起配合使用。

当垃圾回收器准备回收一个对象时,如果发现它还有引用,就会在回收对象之前,把这个引用加入到引用队列中。

程序可以通过判断引用队列中是否加入了引用,来判断被引用的对象是否将要被垃圾回收,这样可以在对象被回收之前采取一些必要的措施。

24、在Java中,为什么不允许从静态方法中访问飞静态变量
1.静态变量属于类本身,在类加载的时候就会分配内存,可以通过类名直接访问;
2.非静态变量属于类的对象,只有在类的对象产生时,才会分配内存,通过类的实例去访问;
3.静态方法也属于类本身,但是此时没有类的实例,内存中没有非静态变量,所以无法调用。

25、说说javaBean的命名规范

1.JavaBean 类必须是一个公共类,并将其访问属性设置为 public
2.JavaBean 类必须有一个空的构造函数:类中必须有一个不带参数的公用构造器,此构造器也应该通过调用各个特性的设置方法来设置特性的缺省值。
3.一个javaBean类不应有公共实例变量,类变量都为private
4.持有值应该通过一组存取方法(getXxx 和 setXxx)来访问:对于每个特性,应该有一个带匹配公用 getter 和 setter 方法的专用实例变量。

属性为布尔类型,可以使用 isXxx() 方法代替 getXxx() 方法。

通常属性名是要和 包名、类名、方法名、字段名、常量名作出区别的:

首先:必须用英文,不要用汉语拼音

(1)包(package)

用于将完成不同功能的类分门别类,放在不同的目录(包)下,包的命名规则:将公司域名反转作为包名。比如www.sohu.com 对于包名:每个字母都需要小写。比如:com.sohu.test;该包下的Test类的全名是:com.sohu.Test.Java 。

如果定义类的时候没有使用package,那么java就认为我们所定义的类位于默认包里面(default package)。

(2)类

首字母大写,如果一个类由多个单词构成,那么每个单词的首字母都大写,而且中间不使用任何的连接符。尽量使用英文。如ConnectionFactory

(3)方法

首单词全部小写,如果一个方法由多个单词构成,那么从第二个单词开始首字母大写,不使用连接符。addPerson

(4)字段

与方法相同。如ageOfPerson

(5)常量

所有单词的字母都是大写,如果有多个单词,那么使用下划线链接即可。

如:public static final int AGE_OF_PERSON = 20; //通常加上static

26、在java中,什么时候用重载,什么时候用重写

(1)重载是多态的集中体现,在类中,要以统一的方式处理不同类型数据的时候,可以用重载。

(2)重写的使用是建立在继承关系上的,子类在继承父类的基础上,增加新的功能,可以用重写。

(3)简单总结:

重载是多样性,重写是增强剂;
目的是提高程序的多样性和健壮性,以适配不同场景使用时,使用重载进行扩展;
目的是在不修改原方法及源代码的基础上对方法进行扩展或增强时,使用重写;

27、举例说明什么情况下会更倾向于使用抽象类而不是接口
1.在一些对时间要求比较高的应用中,倾向于使用抽象类,它会比接口稍快一点
2.如果希望把一系列行为都规范在类继承层次内,并且可以更好地在同一个地方进行编码,那么抽象类是一个更好的选择。

28、实例化对象有哪几种方式

  1. new
  2. clone()
  3. 通过反射机
class.forname
  1. 序列化反序列化
序列化对象:
ObjeactOutputStream out = new ObjeactOutputStream(new FileOutputStream("D:/data.txt"));
);
out.writeObjeact(user);
out.close();

反序列化:
ObjeactInputStream in = new ObjeactInputStream(new FileInputStream("d:/data.txt"));
User user2 = (User)ijn.readObjeact();

29、byte类型127+1等于多少
byte的范围是-128~127。

字节长度为8位,最左边的是符号位,而127的二进制为01111111,所以执行+1操作时,01111111变为10000000。

一个数如果为正,则它的原码、反码、补码相同;一个正数的补码,将其转化为十进制,可以直接转换。

已知一个负数的补码,将其转换为十进制数,步骤如下:
先对各位取反;
将其转换为十进制数;
加上负号,再减去1;
例如10000000,最高位是1,是负数,①对各位取反得01111111,转换为十进制就是127,加上负号得-127,再减去1得-128;

更多集合相关
https://lyyong.blog.youkuaiyun.com/article/details/119222784

30、Java 容器都有哪些?

(1)Colleaction

set:HashSet、TreeSet
list:ArrayList、LinkedList、Vector

(2)Map
HashMap、HashTable、TreeMap

31、Collection 和 Collections 有什么区别?

(1)Colleaction是最基本的集合接口,Colleaction派生了两个子接口list和set,分别定义了两种不同的存储方式。

(2)Colleactions是一个包装类,他包含各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等)
此类不能被实例化,就像一个工具类

32、list与Set区别

list:
(1)ArrayList: 由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。
(2)LinkedList:向List中间插入与删除的开销并不大。随机访问则相对较慢。addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
set 不保存重复元素。
(1)HashSet:为快速查找设计的Set。存入HashSet的对象必须定义hashcode。
(2)TreeSet:保存次序的Set。底层为树结构。有序序列

list和set区别
(1)都继承自Collection接口
(2)List特点:元素有放入顺序,可重复。Set特点:元素无放入特点,不可重复,重复的会覆盖掉
(3)Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,list可以动态增长,查找元素效率高,插入和删除效率低。因为会引起其他元素位置改变。

33、HashMap和Hashtable有什么区别

  1. HashMap线程不安全,table安全
  2. HashMap的key和value都是可以是null,key只允许一个null;Hashtable的key和value都不可为null
  3. HashMap的默认容器是16,为2倍扩容,HashTable默认是11,为2倍+1扩容

34、说一下 HashMap 的实现原理

(1)简介
HashMap基于map接口,元素一键值对方式存储,允许有null值,HashMap是线程不安全的。
(2)基本属性
初始化大小,默认16,2倍扩容
负载因子0.75
初始化的默认数组
threshold.判断是否需要调整hashmap容量,size*负载因子 12
(3)HashMap的存储结构

JDK1.7中采用数组+链表的存储形式。

HashMap采用Entry数组来存储key-value,每一个键值对组成了一个Entry实体,Entry类 实际上是一个单向的链表结构,它具有next指针,指向下一个Entry实体,以此来解决Hash冲突的问题。
HashMap实现一个内部类Entry,重要的属性有hash、key、value、next。

JDK1.8中采用数据+链表+红黑树的存储形式。当链表长度超过阈值(8)时,将链表转换为红黑树。在性能上进一步得到提升。

35、set有哪些实现类

(1)HashSet

HashSet是set接口的实现类,set下面最主要的实现类就是HashSet(也就是用的最多的),此外还有LinkedHashSet和TreeSet。
HashSet是无序的、不可重复的。通过对象的hashCode和equals方法保证对象的唯一性。
HashSet内部的存储结构是哈希表,是线程不安全的。

(2)TreeSet

TreeSet对元素进行排序的方式:

元素自身具备比较功能,需要实现Comparable接口,并覆盖compareTo方法。
元素自身不具备比较功能,需要实现Comparator接口,并覆盖compare方法。

(3)LinkedHashSet

LinkedHashSet是一种有序的Set集合,即其元素的存入和输出的顺序是相同的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值