JavaSE
简答
李广进
死磕自己
展开
-
HasMap是如何进行put的?
先判断map是否是空,空要扩容,再判断数组下标是否存在(key的hash值i),不存在就直接插入,不是空就判断key是否存在相同(equals),存在就直接覆盖,不存在判断是不是红黑树是就加,不是红黑树,遍历插入并看是不是到了链表长度8,到了就变为红黑树,最后再调整容量大小。ps: resize()调整容量: 默认大小是16 每到容量的0.75的时候进行扩容,是先扩容2倍,如果不够再扩容。源码...原创 2022-07-06 15:57:30 · 203 阅读 · 1 评论 -
JavaIO的基本架构、对象进行序列化、网络编程中的Socker、JavaIO中体现的设计模式有/是什么?
1 JavaIO的基本架构是什么?基于字节操作方式 的IO接口:InputStream和OutputStream基于字符操作方式 的IO接口:Reader和Writer基于磁盘操作方式的IO接口:File基于网络操作方式的IO接口:Socket字节到字符的转化桥梁:InputStreamReader基于磁盘操作方式中的访问文件方式有哪5种?标准访问文件方式直接IO访问方式同步访问文件方式异步访问文件方式内存映射方式Java中的类对象进行序列化有什么用?Java中的序列化是把一个对象原创 2020-06-09 01:07:09 · 205 阅读 · 0 评论 -
jdk的发展历史与jdk7与jdk8有什么区别?
jdk的发展历史与jdk7与jdk8有什么区别?1991年4月,由James Gosling博士开发Java语言的前身:Oak1995年 Oak语言改名为Java1996年 JDK 1.0发布,并进行版本更新。1999年 HotSpot虚拟机诞生2006年 JDK 6发布,本对Java虚拟机内部做了大量改进,包括锁与同步、垃圾收集、类加载等进行改动2011年 JDK7 本来JDK7计划支持Lambda表达式,支持函数式编程,但2009年 sum竞争中陷入泥潭以74亿美元被Oracle收购,还导致原创 2020-05-16 00:07:48 · 538 阅读 · 0 评论 -
java中常见的设计模式有那些?
Java有23 种设计模式, 分三大类:我们初级程序员常见的有:单例模式 简单工厂模式 代理模式(Proxy) 策略模式(Strategy) 策略模式(Strategy) 适配器模式单例模式特点:1.单例设计模式保证一个类只有一个实例。2.要提供一个访问该类对象实例的全局访问点。对一些类来说,只有一个实例是很重要的。例如很多时候对于某个系统只需要拥有一个全局对象,这样有利于我...原创 2020-04-27 10:59:40 · 706 阅读 · 0 评论 -
面向对象和面向过程的区别?
1面向过程:采用面向过程必须了解整个过程,每个步骤都有因果关系。优点: 性能比面向对象高,因为面向对象时,类调用时需要实例化,开销比较大,比较消耗资源;缺点: 没有面向对象易维护、易复用、易扩展2面向对象:它把所有的东西都分割为对象,实现这些对象,如果要完成一个功能,只要调用各个对象相互调协就可以了。优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的...原创 2020-04-27 10:49:52 · 127 阅读 · 0 评论 -
介绍一下面向对象编程特性?
封装 继承 多态封装:把一个对象属性进行私有化,只有需要提供给外界的属性才提供方法。好处:主要作用是对外部隐藏具体的实现细节,增加程序的安全性。继承:指在已有的类基础上进行扩展新的属性、功能等,好处:方便的复用代码以及扩展。多态:是事物的多种状态,java中多态的实现方式有两种,一种是编译时多态,另一种是运行时多态,编译时多态是通过方法的重载实现的,运行时的多态是通过方法的重写实现的。...原创 2020-04-27 10:49:03 · 115 阅读 · 0 评论 -
为什么要用线程池?
降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度: 当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性: 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。...原创 2020-04-27 10:38:58 · 75 阅读 · 0 评论 -
说一下synchronized 和 Lock 的比较?
1.Lock 是接口,而 synchronized 是 Java 中的关键字,synchronized 是内置的语言实现;2.synchronized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而 Lock 在发生异常时,如果没有主动通过 unLock()去释放锁,则很可能造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁;3.Lock 可以让等待锁的...原创 2020-04-27 10:38:15 · 164 阅读 · 0 评论 -
线程的睡眠和等待的区别(sleep 与 wait)?
sleep是Thread类中的方法,wait是Object类的方法,sleep不会释放对象锁,wait会释放对象锁。sleep可以在任何地方用,wait()只能在synchronized方法或块中使用。sleep一定要传入参数,wait不传参数的时候是进入无限等侍,要使用notife才能唤醒。...原创 2020-04-27 10:34:01 · 1968 阅读 · 0 评论 -
Thread 类中的 start() 和 run() 方法有什么区别?
start()方法是启动线程的,线程变就绪状态。当调用后,不用等run()结束,续执行下面代码。run()方法称为线程体,是线程要执行的内容,run方法结束就是线程结束。...原创 2020-04-27 10:32:39 · 142 阅读 · 0 评论 -
线程什么时候会进入阻塞状态?
阻塞的情况分三种: 1等待阻塞(o.wait->等待对列):运行的线程执行 o.wait()方法,JVM 会把该线程放入等待队列(waitting queue) 中。 2 同步阻塞(lock->锁池)运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该线程放入锁池中。 3其他阻塞(sleep/join)运行的线程执行 Thread.sleep(...原创 2020-04-26 23:08:13 · 4622 阅读 · 0 评论 -
创建线程的4种方式是什么?
1 继承Thread类:本质实现了Runnable接口,调用start()方法开启新线程,并执行run()方法。2 实现Runnable接口3 使用Callable接口创建线程返回值执行 Callable 任务后,可以获取一个 Future 的对象,在该对象上调用 get 就可以获取到 Callable 任务返回的 Object 了,再结合线程池接口 ExecutorService 就可以实...原创 2020-04-26 23:07:05 · 117 阅读 · 0 评论 -
什么是二分法(折半法)查找&&java代码实现?
前提是数组已经排好序,(查18的下标)数值 11 12 13 14 15 16 17 18 19 20下标 0 1 2 3 4 5 6 7 8 9 第一步,首先取得数组 0~9 的中间元素中间元素的位置为:(开始下标 0 + 结束下标 9)/2=下标 4通过下标 4 取得对应的值 1518 大于 15,那么我们在后半部分查找 第二步,取数组 4~9 的中间元...原创 2020-04-26 23:05:16 · 336 阅读 · 0 评论 -
什么是选择排序&&java代码实现?
选择排序对冒泡排序进行了改进,使交换次数减少,但比较次数仍然没有减少。选择排序是这样的,先从左端开始,找到下标为 0 的元素,然后和后面的元素依次比较,如果找到了比下标 0 小的元素,那么再使用此元素,再接着依次比较,直到比较完成所有的元素,最后把最小的和第 0 个位置交换。for (int i=0; i<data.length; i++) {int min = i;for (in...原创 2020-04-26 23:04:11 · 86 阅读 · 0 评论 -
什么是冒泡排序&&java代码实现?
冒泡排序的算法是这样的,首先从数组的最左边开始,取出第 0 号位置(左边)的数据和第 1 号位置(右边)的数据,如果左边的数据大于右边的数据,则进行交换,否而不进行交换。接下来右移一个位置,取出第 1 个位置的数据和第 2 个位置的数据,进行比较,如果左边的数据大于右边的数据,则进行交换,否而不进行交换。沿着这个算法一直排序下去,最大的数就会冒出水面,这就是冒泡排序。for (int i=dat...原创 2020-04-26 23:02:35 · 93 阅读 · 0 评论 -
数组可以如何进行优化?
1创建数组的时候,预先估计数组中存储的元素个数,2给定初始化容量,减少数组的扩容次数,减少数组的拷贝,3提高程序的执行效率。原创 2020-04-26 23:00:42 · 639 阅读 · 0 评论 -
HashMap是如何实现线程安全的?
1 使用Hashtable类或者是ConcurrentHashMap类进行替换.HashTable 和 ConcurrentHashMap 都是线程安全的。区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每一桶都有一把锁,当多个线程访问不同的段时,因为获取到的锁是不同的,效率比Hashtab...原创 2020-04-26 22:59:23 · 1010 阅读 · 0 评论 -
HashMap与Hashtable的区别?
HashMap是不线程安全的,底层都是数组+链表结构,key与value都可以是null;Hashtable是线程安全的,底层都是数组+链表结构,key与value都不可以是null;HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。HashMap扩容时是当前容量翻倍即:capacity2,Hashtable扩容时是容量翻倍+1即:capaci...原创 2020-04-26 22:56:21 · 108 阅读 · 0 评论 -
HashMap 的遍历方式?
第一种:普遍使用 for(String key :map.keySet()){}第二种,通过 map.entrySet() 使用 iterator 遍历 key 和 value")et<Map.Entry<String, String>> entries = map.entrySet();Iterator<Map.Entry<String, String&...原创 2020-04-26 22:55:31 · 61 阅读 · 0 评论 -
HasMap是如何进行put的?
先判断map是否是空,空要扩容,不用扩容就计算key的hash值i,判断数组下标是i是否是空,是空就进行插入,不是空就判断key是否存在相同(hasCodeg与equals),存在就直接覆盖,不存在判断是不是红黑树是就加,不是就看是不是到了链表长度8,到了就变为红黑树。最后再判断到达最大容量要不要扩容。...原创 2020-04-26 22:54:43 · 274 阅读 · 0 评论 -
Comparable 和Comparator 的区别?
Comparable 是默认的比较接口,Comparable 和需要比较的对象紧密结合到一起了Comparator 可以分离比较规则,所以它更具灵活性原创 2020-04-26 22:49:13 · 81 阅读 · 0 评论 -
关于ArrayList和Vector区别?
ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。Vector提供indexOf(obj, start)接口,ArrayList没有。Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。...原创 2020-04-24 00:18:57 · 133 阅读 · 0 评论 -
你可以说一下ArraryList和数组是如何进行转换的?
Integer[] array1 = (Integer[]) list.toArray(); // list转换arrayList list1 = Arrays.asList(array1); //array转换 list原创 2020-04-24 00:18:16 · 102 阅读 · 0 评论 -
ArrayList的三种遍历方式?
1、第一种,随机访问,它是通过索引值去遍历由于ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素。for (int i = 0; i < list.size(); i++){value = list.get(i);}2、第二种,foreach语句foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的...原创 2020-04-24 00:17:32 · 2699 阅读 · 0 评论 -
ArrayList的底层是如何实现?
它实现List接口,底层实现是动态数组,其容量能自动增长。操作都是对于数组进行操作的。两个私有属性:transient Object[] elementData;private int size;elementData存储ArrayList内的元素,size表示它包含的元素的数量。关键字 transient不明白->为了在一个特定对象的一个域上关闭serialization,可在此...原创 2020-04-24 00:16:54 · 630 阅读 · 0 评论 -
ArrarList是如何实现扩容的?
arrarList默认大小是10,当集合个数大于容量的时候,就会以1.5倍容量去进行扩容,如果还不够大就在扩容后的1.5倍再扩容。扩容后要对原来的集合进行cope到新的集合中。(在add()方法中调用确保内部容量方法,传入参数当前元素个数加一,当它大于实际数组大小的时候就调用grow()方法进行扩容。扩容是右移一位,进行扩容1.5倍,不够再进行扩容,通过copeof()方法进行数组的复制。)...原创 2020-04-24 00:14:15 · 761 阅读 · 0 评论 -
ArrarList是如何实现线程安全的?
1 使用Vector类进行替换.2 使用Collections.synchronizedList(List)进行替换List list2 = Collections.synchronizedList(new ArrayList<>());3 使用 java.util.concurrent(并发包/叫JUC) 里的 CopyOnWriteArrayList类进行替换。CopyOn...原创 2020-04-24 00:13:06 · 232 阅读 · 0 评论 -
给我介绍一下java中的集合吧?
集合分为单列集合collertion与双列集合Mapcollertion中又分为list与set集合list是有序可重复的集合set是无序不可以重复的集合map是无序集合。list集合主要的实现有三个分别是ArrarList与linkedList与VectorArrarList的底层实现是数组,默认大小是10个,扩容是以1.5倍扩,它的查询快,增删改慢。linkedList的实现是链...原创 2020-04-24 00:12:19 · 341 阅读 · 0 评论 -
集合框架的优点?
(1)使用集合类可以降低开发成本,而不用自己实现集合类。(2)因为我们用的集合框架类是经过严格测试的,所以代码质量会得到提高。(3)通过使用JDK附带的集合类,可以降低代码维护成本。(4)复用性和可操作性。...原创 2020-04-24 00:11:16 · 415 阅读 · 0 评论 -
final ,finally,finalize的区别?
final是修饰符(关键字),表示不可以修改的,而修饰类的时候表示是不可以派生子类的。static和final一块使用 static final用来修饰成员变量和成员方法,可简单理解为“全局常量”! 对于变量,表示一旦给值就不可修改,并且通过类名可以访问。 对于方法,表示不可覆盖,并且可以通过类名直接访问。finally是在异常处理时提供finally块,不管无异常发生,final...原创 2020-04-24 00:10:38 · 93 阅读 · 0 评论 -
Java 和 C++的区别?
1 都是面向对象的语言,都支持封装 继承 多态。2 C++中使用指针来直接访问内存,java中没有指针,更安全。3 java是单继承 ,而C++支持多继承。4 java中有内存管理机制,可以自动回收内存。...原创 2020-04-24 00:09:51 · 150 阅读 · 0 评论 -
this与super区别?
1 this 指调用当前对象,它的用处是:方法的局部变量和成员变量重名时候用this。调用本类中的其他构造方法,调用时要放在构造方法的首行。2 super 是子类调用父类的东西。子类调用父类构造方法的时候要放在第一行。super 只能应用在成员方法和构造方法中。3两者都不能应用在静态方法内this 与super都只能用在构造函数和实例方法内部,但this还可以用在成员变量的声明上。...原创 2020-04-24 00:09:11 · 89 阅读 · 0 评论 -
短路与&&和逻辑与&与区别?
1 计算方式不一样但计算结果一样。2 短路与&&比逻辑与&智能,短路与效率高。3 短路与&&的同左边是false的时候就不会再执行右边。原创 2020-04-24 00:08:30 · 207 阅读 · 0 评论 -
接口与抽象类的区别?
抽象类,可以有不抽象的方法,接口:一定都是抽象的东西,而且只有常量。接口:是为了解决java 中的单继承问题,一个类可以继承多个接口2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定3. 一个类可以实现多个接口,但最多只能实现一个抽象类现在有很多讨论和建议提倡用interface代替abstract类,两者从理论上可以做一般性的混用,但是在实际应用中,他们还是有一定区别...原创 2020-04-24 00:07:53 · 83 阅读 · 0 评论 -
equals与hashcode的区别?
如果两个对象相等,则 hashcode 一定也是相同的两个对象相等,对两个对象分别调用 equals 方法都返回 true两个对象有相同的 hashcode 值,它们也不一定是相等的因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相...原创 2020-04-24 00:06:58 · 69 阅读 · 0 评论 -
throws与throw的比较?
throws:声明一个方法可能产生的所有异常,不做任何处理但将异常往上传,谁调用抛给谁。throw:则是用来抛出一个具体的异常类型。1、throws出现在方法函数头;而throw出现在函数体。2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常。...原创 2020-04-24 00:04:52 · 134 阅读 · 0 评论 -
==与equals区别?
基本数据类型比较的是值等不等,引用数据类型比较的是内存地址;equals比较的是内存地址,但String引用数据类型重写了equals比较的是值是否相等。它的作用也是判断两个对象是否相等。分为重写了equals与没有重写equals(相当于==)。...原创 2020-04-24 00:04:06 · 68 阅读 · 0 评论 -
重载重写的区别?
重载是在类内方法名相同而参数的类型、顺序、个数不同而实现重载。重写是在继承父类后对父类的方法进行重写(方法名与参数一样)。返回值范围、抛出的异常范围都小于等于父类,访问修饰符范围大于等于父类;重写(覆盖)是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。...原创 2020-04-24 00:00:24 · 62 阅读 · 0 评论 -
StringBuilder、String、StringBuffer之间的联系与区别?
一、不同点:可变性String不可变 StringBuffer,StringBuilder可变线程安全String不可变可称为线程安全 StringBuffer线程安全 StringBuilder非线程安全性能在大量字符串拼接操作中String最差在非线程安全环境中StringBuilder性能要比StringBuffer好二、相似点实现 底层均为...原创 2020-04-23 23:59:47 · 213 阅读 · 0 评论 -
成员变量与局部变量的区别?
1.在类中的位置成员变量:在类中方法外面局部变量:在方法的内部或者在方法的声明中2.在内存中的位置成员变量:在堆内存(成员变量属于对象,对象进堆内存)局部变量:在栈内存(局部变量属于方法,方法进栈内存)3.生命周期成员变量:随着对象的创建而存在,随着对象的消失而消失局部变量:随着方法的调用而存在,方法调用完毕就消失4.初始化值成员变量:有默认初始化值局部变量:没有初始化值,必...原创 2020-04-23 23:59:10 · 209 阅读 · 0 评论