达内java作业_【达内JAVA教程】达内Java基础题
原标题:【达内JAVA教程】达内Java基础题
【达内JAVA教程】达内Java基础题。的小编收集了四道JAVA基础题,下面快来跟随的小编来了解一下吧!
话说很多java程序员学过一段时间后,都应该找机会小试牛刀,达内深圳java培训(sz.java.tedu.cn)专家今天给大家带来几道java的基础题,你们练练手,看看自己的基础打得怎样吧:
一、==符的使用
首先看一段比较有意思的代码
Integer a = 1000,b=1000;
Integer c = 100,d=100; public void mRun(final String name){
new Runnable() {
public void run() {
System.out.println(name);
}
};
}
如果这道题你能得出正确答案,并能了解其中的原理的话。说明你基础还可以。如果你的答案是true 和true的话,你的基础就有所欠缺了。
首先公布下答案, 运行代码,我们会得到 false true。我们知道==比较的是两个对象的引用,这里的abcd都是新建出来的对象,按理说都应该输入false才对。这就是这道题的有趣之处,无论是面试题还是论坛讨论区,这道题的出场率都很高。原理其实很简单,我们去看下Integer.java这个类就了然了。
public static Integer valueOf(int i) {
return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
}
/**
* A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing
*/
private static final Integer[] SMALL_VALUES = new Integer[256];
static {
for (int i = -128; i < 128; i++) {
SMALL_VALUES[i + 128] = new Integer(i);
}
}
当我们声明一个Integer c = 100;的时候。此时会进行自动装箱操作,简单点说,也就是把基本数据类型转换成Integer对象,而转换成Integer对象正是调用的valueOf方法,可以看到,Integer中把-128-127 缓存了下来。官方解释是小的数字使用的频率比较高,所以为了优化性能,把这之间的数缓存了下来。这就是为什么这道题的答案回事false和ture了。当声明的Integer对象的值在-128-127之间的时候,引用的是同一个对象,所以结果是true。
二、String
接着看代码
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
大家又来猜一猜这道题的答案是什么?
按照==的语法来看, 首先s1、s2、s3是三个不同的对象,常理来说,输出都会是false。然而程序的运行结果确实true、false。第二个输出false可以理解, 第一个输出true就又让人费解了。我们知道一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,而堆内存中则存放new 出来的对象和数组。然而除此之外还有一块区域叫做常量池。像我们通常想String s1 = "abc"; 这样申明的字符串对象,其值就是存储在常量池中。当我们创建String s1 = "abc"这样一个对象之后,"abc"就存储到了常量池(也可叫做字符串池)中,当我们创建引用String s2 = "abc" 的时候,Java底层会优先在常量池中查找是否存在"abc",如果存在则让s2指向这个值,不会重新创建,如果常量池中没有则创建并添加的池中。这就是 为什么答案是true 和false的原因。
三、final关键字
还是来看一段代码
public void mRun(final String name){
new Runnable() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name);
}
}.start();
}
这种代码相信大家写过很多,当内部类访问局部变量的时候,需要在局部变量前加final修饰符,不然编译器就会报错。通常我们也是这么干的。好的,第二个 问题来了,为什么要加final修饰符?相信大多数小伙伴都没有思考过这个问题,但凡使用的时候,直接加上就得了,从来没去深究过其中的原理。这对于一个 优秀的程序员来说是不可取,我们不仅要知其然还要知其所以然。
现在达内深圳java培训(sz.java.tedu.cn)专家和大家一起分析一下,为什么要加final关键字。首先内部类的生命周期是成员级别的,而局部变量的生命周期实在方法体之类。也就是说会出现这样一种情况,当mRun方法执行,new 的线程运行,新线程里面会睡一秒。主线程会继续执行,mRun执行完毕,name属性生命周期结束。
1秒之后,Syetem.out.printh(name)执行。然而此时name已经寿终正寝,不在内存中了。Java就是为了杜绝这种错误,严格要求 内部类中方位局部变量,必须使用final关键字修饰。局部变量被final修饰之后,此时会在内存中保有一份局部变得的复制品,当内部类访问的时候其实 访问的是这个复制品。这就好像是把局部变量的生命周期变长了。说到底还是Java工程师提前把这个坑给我们填了,不然不知道又会有多少小伙伴会为了内部类 局部变量而发愁了。
四、Integer与int那些事
看下面代码
Integer a = new Integer(1000);
int b = 1000;
Integer c = new Integer(10);
Integer d = new Integer(10);
System.out.println(a == b);
System.out.println(c == d);
这道题是继第一题的后续,如果这道题你能很快速的得出答案,那么恭喜你,==比较符你就算掌握的比较透彻了。
正确答案: true 、false
看到这个答案很多小伙伴又会不解,先来说下第二个,按第一题来说Integer不是把-128-127缓存起来了吗?这不是应该是true嘛,但是你仔细 看,这里的Integer是我们自己new出来的,并不是用的缓存,所以结果是false。 现在来看第一个为啥又是true了呢? 首先这里的值为1000,肯定和我们所知的Integer缓存没有关系。既然和缓存没有关系,a是新new出来的对象,按理说输入应该是false才对。 但是注意b这里是int类型。当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,也就是把Integer转成int 类型,所以这里进行比较的是int类型的值,所以结果即为true。
希望以上内容对你有所帮助!深圳达内JAVA培训有着国内首家完整的移动JAVA课程体系,高度专注JAVA前沿技术。深圳JAVA培训项目全部来自于真实的企业项目,单独项目代码量超过 6万行。为了让学员尽快的进入到企业开发的项目中,深圳达内JAVA培训使用自主开发的产品和为客户定制的企业产品为案例,大批深圳JAVA培训开发学员都从中收益。
我们是一群热爱IT的年轻人,如果你也爱IT、爱JAVA开发,欢迎前来深圳达内JAVA培训中心参观学习,让我们共同为梦想发声。
更多JAVA培训、JAVA就业、JAVA薪资、JAVA教程等内容,请访问官方网站!众多资深达内JAVA大神级讲师为您答疑解惑!返回搜狐,查看更多
责任编辑:
达内java作业_【达内JAVA教程】达内Java基础题相关推荐
- 八门神器java版本_【修改教程】java基础知识字符串处理_八门神器
[Java基础知识]字符串处理1.获取字符串的长度 String s = "AIDE"; System.out.println(s "长度为:" s.lengt ...
- echarts java动态数据_[ASP.net教程]ECharts Java 动态加载数据,echartsjava
[ASP.net教程]ECharts Java 动态加载数据,echartsjava 0 2015-12-18 00:00:05 1.前台jsp页面html PUBLIC "-//W3C// ...
- java书籍_非科班,自学java需要把软件工程的课程全部学习完吗?
问题一:非科班是否能自学Java.问题二:自学Java是否需要把软件工程课程全部学完?问题三:如何自学Java? 解决问题一:非科班是否能自学Java.不知道你是否有这个担心疑虑,从事Java技术开发 ...
- 有控制雷电武器的java游戏_雷电飞机射击游戏 JAVA
一.程序概述 1.开发环境 开发程序的工具Eclipse是著名的跨平台的自由集成开发环境.一个开放源代码的.基于Java的课扩展开发平台.就其本身而言,它只是一个框架和一组服务,用与通过插件组件构建开 ...
- import java.awt 无法_java awt教程import java.awt.*
java awt教程import java.awt.* java.awt.* 这里的java是包名,包对应的就是你磁盘当中的目录,你可以看成文件夹,awt是这个包当中的子包, 连起来也就是这个java ...
- 双表查询java代码_什么是JDBC?Java数据库连接性简介
JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...
- java 2d绘图 stroke_Java标准教程:Java 2D绘图--第4章使用Text
Java标准教程:Java 2D绘图--第4章使用Text 本节介绍文本API的用法,以及他们的渲染能力.至今为止,您已经有了基本的Java 2D文本API,同时知道如何设置字体和位置,以及绘制文本. ...
- java组件_三个必不可少的Java平台组件:什么是JVM,JDK,JRE?有啥区别?
刚接触Java的开发人员经常想知道Java虚拟机,Java开发工具包和Java运行时环境与众不同的地方.他们也很好奇这三个Java平台组件如何在Java应用程序中一起工作.最后,开发人员需要知道他们将 ...
- java获取java版本_在运行时获取Java版本
最简单的方法(java.specification.version): double version = Double.parseDouble(System.getProperty("jav ...
最新文章
- 在 Windows 10 上安装 WSL | Microsoft Docs 转
- excel 进行二叉树_基础扩展 | 21. 遍历二叉树
- api如何使用_什么是API, API是如何工作的?
- 读《大道至简-- 第二章 是懒人造就了方法》 有感
- MySQL命令:增删与改
- 云服务器一般选什么系统,云服务器一般选择什么系统好
- 虚拟化技术、云计算服务模式、Docker安装
- Make things beautiful again !
- 芝加哥大学计算机专业硕士,芝加哥大学计算机硕士录取条件有哪些?_托普仕留学...
- P2184 贪婪大陆(树状数组)
- Windows10 LSTC 2021输入法无法使用的问题
- jQuery UI 插件
- CCPC 1010 YJJ's Salesman
- C/C++实现三角函数的方法
- 安装allennlp
- SSM酒店管理系统旅店(含源码+论文+答辩PPT等)
- 2020-01-07
- Pangu and Stones 解题报告
- 雅虎的无奈,将关闭地图、Pipes、GeoPlanet和PlaceSpotter APIs、一些区域网站
- CISP-信息安全保障-信息安全保障基础