每日一练10

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

解析
HashSet内部使用Map保存数据,即将HashSet的数据作为Map的key值保存,这也是HashSet中元素不能重复的原因。而Map中保存key值前,会去判断当前Map中是否含有该key对象,内部是先通过key的hashCode,确定有相同的hashCode之后,再通过equals方法判断是否相同。

在这里插入图片描述

可以看出,对于-128到127之间的数,Java会对其进行缓存。而超出这个范围则新建一个对象。
所以现在回到这道问题

1和i2为128,超出范围,所以都需要新建对象,对象比较为false;

i5和i6为100,在范围之内,在执行Integer i5=100时,就会直接缓存到内存中,但执行执行Integer i6=100时,就直接从缓存里取,而不需要新建对象,所以为true。

链接:https://www.nowcoder.com/questionTerminal/0bc5e15365ec44a7bfa976f1a2a40b20
来源:牛客网

龙城。
String s =“abc”:通过字面量赋值创建字符串。则将栈中的引用直接指向该字符串,如不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串

String s = “a”+“bc”:编译阶段会直接将**“a”和“bc”结合成“abc”,这时如果方法区已存在“abc”,则将s的引用指向该字符串,如不存在,则在方法区生成字符串“abc”对象**,然后再将s的引用指向该字符串
String s = “a” + newString(“bc”):中先创建一个**"a"字符串常量,再创建一个"bc"字符串常量,编译阶段不会进行拼接,在运行阶段拼接成"abc"字符串常量并将s的引用指向它**,效果相当于String s = new String(“abc”),只有’+'两边都是字符串常量才会在编译阶段优化 发表于 2019-08-27 10:09

链接:https://www.nowcoder.com/questionTerminal/0bc5e15365ec44a7bfa976f1a2a40b20
来源:牛客网

supli

关于字符串的解释(摘自:https://www.cnblogs.com/huajiezh/p/6565301.html):String str1=”java”; //指向字符串池 String str2=”blog”; //指向字符串池

String s=str1+str2;
//s指向堆中值为"javablog"的对象,+运算符会在堆中建立来两个String对象,这两个对象的值分别是"java" “blog”.
也就是说从字符串池中复制这两个值,然后在堆中创建两个对象,然后再建立对象s,然后将"javablog"的堆地址赋给s.
这句共创建了?个String 对象!

System.out.println(s==”javablog”); //结果是false。 Jvm确实对型如String str1=”java”;的String对象放在常量池里,但是它是在编译时那么做的,而String s=str1+str2;是在运行时刻才能知道,也就是说str1+str2是在堆里创建的,所以结果为false了 发表于 2018-07-04
21:43

链接:https://www.nowcoder.com/questionTerminal/0bc5e15365ec44a7bfa976f1a2a40b20
来源:牛客网

LSur 关于拆箱和装箱问题,可参考博客http://www.importnew.com/15712.html 引申: 若题中代码改为
Integer i5 = new Integer(100);Integer i6 = new Integer(100); 则i5== i6
结果为false,因为两个对象之间比较并不会自动拆箱,所以比的是对象的引用地址,故不相等。而原来题目中相等是因为当自动装箱时,JVM会优化,出于节省内存的考虑,JVM会缓存-128到127的Integer对象,所以当自动装箱的数值在这区间时,所装箱的结果都是对缓存池中同一个对象的引用,故比较地址会为tru

笔筒虫
例题一: 第一次String a="1234"时,会在常量池中创建一个常量1234,String b=1234时,常量池中已经有了该常量,所以直接取,a和b的地址一样,所以地址值相等

String c = newString(“1234”)重新new了对象,在堆内存中开辟了新的空间,所以地址值不想等,而equals方法比较的是值是否相等

链接:https://www.nowcoder.com/questionTerminal/0bc5e15365ec44a7bfa976f1a2a40b20
来源:牛客网

拓展与总结: 在String中 == 是判断地址是否相等
关于equals这个方法,在String类中是被重写了的,可以先判断地址是否相同,再比较值是否相同
并不是所有类的equals都是比较值,例如object类的equals方法和==是一样的
注:instanceof是用来判断前后两个对象是否是一个家族中的,也就是判断是否有继承关系

而对于-128到127之间的数(最小值-128是确定了的,但是最大值127是可以通过虚拟机的配置文件来配置),Java会对其进行缓存。而超出这个范围则新建一个对象。

链接:https://www.nowcoder.com/questionTerminal/0bc5e15365ec44a7bfa976f1a2a40b20
来源:牛客网

迪儿78
integer对象在-128和127范围内,是使用的内存中对象,比较值。而超过这个范围,则要新建一个对象,比较的是对象所在的内存地址,所以两个都要新建对象,地址不一样,false.
i5和i6都是100,使用的是内存中的对象,比较的是值的大小,所以是true 。 string i3=100 在常量池中创建100
string i4=“1”+new string(“00”)
是常量池中新建1,,然后建立一个字符串对象。然后在常量池中新建00,,建立一个字符串对象。最后是常量池中新建100,,建立一个字符串对象。
字符串比较,==比较的是地址是否相同,equals比较地址是否相同,相同然后比较值是否相同。 显然地址不相同的,对象个数都不一样。 编辑于
2019-03-15 13:33

链接:https://www.nowcoder.com/questionTerminal/0bc5e15365ec44a7bfa976f1a2a40b20
来源:牛客网

我只要亿个Offer
1.Integer等包装类(Float除外)等valueOf方法时具备缓存的,取值为1byte范围,即-128~127范围内的值会从常量池中直接取出,所以引用地址一样
2.String a = “1” + “0”,若存在+号,那么实质是在堆中创建了“1”和“0”这两个字符串,然后在合并为第三个字符串“10”,这和**位于字符串常量池的“10”**不属于同一个
发表于 2019-10-10 12:21

链接:https://www.nowcoder.com/questionTerminal/0bc5e15365ec44a7bfa976f1a2a40b20
来源:牛客网

八级大狂风reverse Integer有个缓冲池
-128到127。如果值的范围在这个区间,直接返回池子里的对象。如果不在这个范围内,才会去创建一个对象。 第一个和第三个答案就出来了 。

String i = '100" ; // 对象放在字符串常量池中。 String str = “a”+“b”;
结果也是放在常量池里面 new 出来的字符串在堆内存里面。 两个地址肯定不一样

嘿嘿嘿1212
i3存入常量池中,而i4赋值中存在new String(),所以i4不是常量池中的,i3与i4对象不同
所以i3==i4为false

在这里插入图片描述
总结:
为啥i1!=i2: 当这样创建(第三眼 修正:赋值)时,Integer i1=128,会自动调用一个方法,然后当值在-127(看了第二眼修正:-128) -127之间时,(看一眼 ==)会缓存,即-128-127会缓存,因为是Integer.valueof的一个方法,而本题为128,所以会自动地创建一个对象,所以两个对象值不相等。而i5=100,i6=100,都是Integer 直接赋值,而又在范围之内,所以(从常量池中取出),引用地址相同
为啥:i3!=i4
i3:对象放在常量池中
i4:new了一个,是在堆中,地址不相等

啥是拆箱和装箱:
意思就是 包装类和(基本类型)数据 进行 ==操作时,使用地一系列操作,如果包装类 == 包装类 比较地址,基本类型 == 基本类型 比较数值,非基本类型 == 非基本类型,比较地址,包装类 == 基本类型 把包装类转换为基本类(拆箱)型再比较数值 三种

在这里插入图片描述

Mr.😜201907191115940头像 Mr.😜201907191115940 复制大佬答案,目的是方便自己复习
CountDownLatch 允许一个线程或多个线程等待特定情况,同步完成线程中其他任务。举例:百米赛跑,就绪运动员等待发令枪发动才能起步。
CyclicBarrier
和CountDownLatch一样都可以协同多个线程,让指定数量的线程等待期他所有的线程都满足某些条件之后才继续执行。举例:排队上摩天轮时,每到齐四个人,就可以上同一个车厢。
发表于 2019-11-10 09:09:32

在这里插入图片描述

半纸流年
中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。
(简单来说,中间件并不能提高内核的效率,一般只是负责网络信息的分发处理)
发表于 2016-04-09 15:07:52
在这里插入图片描述
Z4Knight
这题只说定义一个类,但是没有说这个类是普通外部类或者内部类。
因为普通类也就是外部类,通过 eclipse 的警告“Illegal modifier for the class Test; only public, abstract & final are permitted” 可知只能用 public, abstract 和 final 修饰。
内部类则可以用 修饰成员变量的修饰符修饰内部类,比如 private, static, protected 修饰。
编辑于 2017-06-02 16:11:0

在这里插入图片描述添加链接描述

链接:https://www.nowcoder.com/questionTerminal/47ffaf4670384e34a925e294fcd686c0
来源:牛客网

bbblemon 选AB
A,D考的一个知识点,final修饰变量,变量的引用(也就是指向的地址)不可变,但是引用的内容可以变(地址中的内容可变)。
B,finally表示总是执行。但是其实finally也有不执行的时候,但是这个题不要扣字眼。

  1. 在try中调用System.exit(0),强制退出了程序,finally块不执行。
  2. 在进入try块前,出现了异常,finally块不执行。 C,finalize方法,这个选项错就错在,这个方法一个对象只能执行一次,只能在第一次进入被回收的队列,而且对象所属于的类重写了finalize方法才会被执行。第二次进入回收队列的时候,不会再执行其finalize方法,而是直接被二次标记,在下一次GC的时候被GC。
    放一张图吧

在这里插入图片描述

解析
A,D是正确的;创建Statement是不传参的,PreparedStatement是需要传入sql语句

在这里插入图片描述在这里插入图片描述添加链接描述

链接:https://www.nowcoder.com/questionTerminal/91a9e070c84249f58908775796d00ce2
来源:牛客网

RiseKyle

Java一维数组有两种初始化方法 1、静态初始化

int array[] = new int[]{1,2,3,4,5}

或者

int array[] = {1,2,3,4,5}

需要注意的是,写成如下形式也是错误的

int array[] = new int[5]{1,2,3,4,5}

2、动态初始化

int array[] = new int[5]; array[0] = 1; array[1] = 2; array[2] = 3;
array[3] = 4; array[4] = 5;

静态与动态初始化的区别就在于,前者是声明的时候就初始化,后者是先声明,再动态初始化。 发表于 2017-06-14 15:25

在这里插入图片描述添加链接描述

傻不拉几的小傻瓜
互斥锁指的是只有一个线程可以访问该对象。 通过继承Thread类或实现Runnable接口,只是创建线程的两种方式。

发表于 2018-07-17 09:52 回复(2) 举报

今天yy收到offer了!
A选项中,如果变量用volatile修饰,则该变量是线程共享的,无法获得该变量的互斥锁 发表于 2019-03-23 01:40

加油677 A应该是"任何"那错了,比如在一个static方法中就无法对一个非static对象加锁

private volatile String a = "lock";

public static void f() {
  synchronized (a) {} //错误的,无法获取该对象的锁
}

链接:https://www.nowcoder.com/questionTerminal/f01690e35b8543d0a52ade5571c7357a
来源:牛客网

梦合九千 发表一下自己的看法 A.可以获得对任何对象的互斥锁定,感觉说的太绝对,错误原因不知道。 B 线程的创建方式与线程之间互斥无关 C
synchronized关键字可以实现互斥 D 线程创建方式不止通过继承Thread类来实现 编辑于 2018-07-19 15:21

在这里插入图片描述

what007
解析:处理异常常用的两种方式:
1、try…catch(捕获处理机制);
2、throws(冒泡处理机制).
注意细节:使用try…catch块捕获时可以没有catch块,但当没用catch块的时候必须得有finally块.故选A)
发表于 2017-06-04 18:45:56
回复(2)

这?
try{
}catch(){
}finally{
}
finally不管是否有异常都会执行,而且,try可以和catch和finally中的一个搭配使用,但是catch和finally不能单独使用
发表于 2017-08-30 21:34:55

在这里插入图片描述

特务依昂头像 特务依昂 在接口中,属性都是默认public static final修饰的,所以:
A(错误):不能用private修饰;
B(正确):在接口中,属性默认public static final,这三个关键字可以省略;
C(错误):没写属性的类型;
D(错误):final修饰的属性必须赋值; 发表于 2019-07-15 23:13:55

在这里插入图片描述

解析

B

错 java多态有两种情况:重载和覆写 在覆写中,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法;
在重载中,运用的是静态多分派,即根据静态类型确定对象,因此不是根据new的类型确定调用的方法

在这里插入图片描述

陈效威头像 陈效威

[😕/]

这是个很明显的陷阱 [ ] 里面是不重复的,所以等价于[😕] 如果[
]后面没有带+号的话,是不会贪婪匹配的,就只能匹配到://中的其中一个 编辑于 2019-06-01 10:15:45

添加链接描述

OfferOverFlowError

链接:https://www.nowcoder.com/questionTerminal/4294440c29e749e3ba6d7a6b2dfe25a3
来源:牛客网

B. [😕/] 表示匹配 😕/ 中的任何一个字符,也就是匹配 : 或 / C. [htps] 表示匹配 htps
中的任何一个字符,[htps]+ 表示一次或多次匹配前面的字符或子表达式,所以 [htps]+ 可以匹配 https 发表于
2019-10-12 10:11

牛客613762572号
[]中的重复的元素只会显示一个,所以[://]表示[:/] []表示里面的元素可能出现
发表于 09-13 22:48

在这里插入图片描述在这里插入图片描述在这里插入图片描述

theliang

修饰非静态方法 锁的是this 对象

修饰静态方法 锁的是class对象 发表于 2019-08-22 07:47:56 回复(12)
添加链接描述

链接:https://www.nowcoder.com/questionTerminal/718f28312bf34cbdb00bc80ee42b83e4
来源:牛客网

kk白云苍狗
方法a为同步方法,方法b里面的是同步块,同步方法使用的锁是固有对象this,同步块使用的锁可以是任意对象,但是方法b里面的同步块使用的锁是对象this,所以方法a和方法b锁住的是同一个对象。方法
c为静态同步方法,使用的锁是该类的字节码文件,也就是Test.class。方法d里面的也是同步块,只不过使用的锁是Test.class,所以方法c和方法d锁住的是同一个对象。

public class Test {
    private synchronized void a() {
  //同步方法 固有对象this  }
    private void b() {
        synchronized (this) {//同步块 锁可以是任意对象,这里锁是this 所以是锁住的同一个对象
        }
    }
    private synchronized static void c() {//静态同步方法 锁该类的字节码文件 Test.class
    }
    private void d() {
        synchronized (Test.class) {//..
        }
    }
}

链接:https://www.nowcoder.com/questionTerminal/718f28312bf34cbdb00bc80ee42b83e4
来源:牛客网

OfferOverFlowError

同步代码块(synchronized(this),synchronized(类实例对象),锁是小括号()中的实例对象)
同步非静态方法(synchronized method),锁的是当前对象的实例对象 

获取类锁

同步代码块(synchronized(类.class)),锁是最小括号 () 中的类对象(Class对象)
同步静态方法(synchronized static method),锁是当前对象的类对象(Class 对象) 

总结

有线程访问对象的同步代码块时,另外的线程可以访问该对象的非同步代码块
若锁住的是同一个对象,一个线程在访问对象的同步代码块时,另一个访问对象的同步代码块的线程会被阻塞。
若锁住的是同一个对象,一个线程在访问对象的同步方法时,另一个访问对象的同步方法的线程会被阻塞。
若锁住的是同一个对象,一个线程在访问对象的同步代码块时,另一个访问对象同步方法的线程会被阻塞,反之亦然。
同一个类的不同对象的锁互不干扰
类锁由于也是一种特殊的对象锁,因此表现和上述一致,而由于一个类只有一把对象锁,所以同一个类的不同对象使用类锁将会是同步的
类锁和对象锁互不干扰 

发表于 2019-10-12 10:27

。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值