java基础点
1.eclipse什么时候编译java类文件
2.在同一包中的类可以相互引用,无需用import语句
3.在Java eclipse用ALT输入特殊符号
5.HashMap桶中链表转红黑树为什么选择数字8,hashcode 用数字31?
7.nanoTime vs currentTimeMillis 比较
8.JAVA import静态类的方法import static java.lang.System.out
1.eclipse什么时候编译java类文件
1)第一次创建类的时候会编译一次
2) 每次修改了这个文件保存之后会编译一次
2.在同一包中的类可以相互引用,无需用import语句
(1)引入包中的类(如果我们只想引入某个包中的类)
import java.io.File;
(2)引入整个包
import java.io.*;(①这样虽然方便,但是当导入包中所有的类时,java编译器就会用额外的内存来存储包中类和方法的名字,以便跟踪这个包中所有的元素,这在pc机上没有太大的性能差异。然而当在手持设备上,一般的手持设备内存都比较小,这种方式就不太好了,更适合第一种方式想引用哪个类就具体引用哪个②当通过网络远程加载一个类时,如果它导入了一包中所有的类,那么在加载的时候就会把所有的类和方法加载到本地来,这就会造成java程序执行时间上的延迟。所以只有当需要导入这个包中很多类的时候,再用这种方式。)
(3)在同一包中的类可以互相引用,无需import语句(非要手动加入也不会报错)
注意:java.lang包是自动引入的,不需要显式的加import引入。因此可以直接引用System、String
3.在Java eclipse代码注释后如何输入n的3次方,就是n的右上角的数字3如何写上出?
平方的输入是按住alt后不放,依次按小键盘上的178三个键,放开所有按键,就会得到² 同样,立方还是上面的方法,按小键盘上的179
扩展:详见:https://www.cnblogs.com/lukelook/p/6840113.html#t4
4.if else等语句,什么时候可以不加括号
今天在写代码的时候无意间发现了 if 和 else 后面不用带括号
if (Boolean)
true
else
false
有大括号的时候
大括号里面所有的 都归if管。只有条件为真的时候 才会执行。
没有大括号的时候 只有下面的一句归if管,
也就是说 当只有一句的时候 大括号可以省略 其它的 没区别。
这种情况,没多久就忘了,再记录一次,加深印象。不然读代码的时候让人很疑惑。
今天分享这个就是想到java规范里面很多都有if后面即使一句都要使用大括号,不只是直观,很多时候能帮我们避免很多错误。以后编程一定要尽量根据规范进行。
看如下代码:
案例1:
if(Character.isLowerCase(c))
if(count[c-'a']==1)
return i;
else
if(count[c-'A'+26]==1)
return i;
预期的执行效果
if(Character.isLowerCase(c)){
if(count[c-'a']==1)
return i;
}
else{
if(count[c-'A'+26]==1)
return i;
}
而其实编译后为
if(Character.isLowerCase(c))
if(count[c-'a']==1)
return i;
else
if(count[c-'A'+26]==1)
return i;
案例2:
if (status == null)
x=1;y=2;z=3;
预期的执行效果
if (status == null){
x=1;y=2;z=3;
}
而实际编译后为
if (status == null)
{ x=1};
y=2;
z=3;
所以说,为了防止类似错误发生,以后一律统统按规范加括号,这样就OK了
5.HashMap桶中链表转红黑树为什么选择数字8,hashcode 用数字31?
.在JDK8及以后的版本中,HashMap引入了红黑树结构,其底层的数据结构变成了数组+链表或数组+红黑树。添加元素时,若桶中链表个数超过8,链表会转换成红黑树。之前有写过篇幅分析选择数字8的原因,觉得不够严谨。最近重新翻了一下HashMap的源码,发现其源码中有这样一段注释:
Because TreeNodes are about twice the size of regular nodes, we use them only when bins contain enough nodes to warrant use (see TREEIFY_THRESHOLD). And when they become too small (due to removal or resizing) they are converted back to plain bins. In usages with well-distributed user hashCodes, tree bins are rarely used. Ideally, under random hashCodes, the frequency of nodes in bins follows a Poisson distribution (http://en.wikipedia.org/wiki/Poisson_distribution) with a parameter of about 0.5 on average for the default resizing threshold of 0.75, although with a large variance because of resizing granularity. Ignoring variance, the expected occurrences of list size k are (exp(-pow(0.5, k) / factorial(k)). The first values are: 0: 0.60653066 1: 0.30326533 2: 0.07581633 3: 0.01263606 4: 0.00157952 5: 0.00015795 6: 0.00001316 7: 0.00000094 8: 0.00000006 more: less than 1 in ten million
翻译过来大概的意思是:理想情况下使用随机的哈希码,容器中节点分布在hash桶中的频率遵循泊松分布(具体可以查看http://en.wikipedia.org/wiki/Poisson_distribution),按照泊松分布的计算公式计算出了桶中元素个数和概率的对照表,可以看到链表中元素个数为8时的概率已经非常小,再多的就更少了,所以原作者在选择链表元素个数时选择了8,是根据概率统计而选择的。
为什么在定义hashcode时要使用31这个数呢?
散列计算就是计算元素应该放在数组的哪个元素里。准确的说是放到哪个链表里面。按照Java的规则,如果你要想将一个对象放入HashMap中,你的对象的类必须提供hashcode方法,返回一个整数值。
https://blog.csdn.net/HNUST_LIZEMING/article/details/88709589
https://blog.csdn.net/steveguoshao/article/details/12576849
6.++i 和 i++的区别
前者先自增再使用,
后者先使用再自增;
public class ClassTest { public static void main(String[] args) {
// TODO Auto-generated method stub
int i = 0;
int j = 0; System.out.println(++i);
System.out.println(j++);
System.out.println(j);
} }
输出结果为
1
0
1
另外 i++ (i = i + 1)不是原子操作,而 i = 1 是原子操作。
7.nanoTime vs currentTimeMillis 比较
1.currentTimeMillis返回的是系统当前时间和1970-01-01之前间隔时间的毫秒数,如果系统时间固定则方法返回值也是一定的(这么说是为了强调和nanoTime的区别),精确度是毫秒级别的;
nanoTime的返回值本身则没有什么意义,因为它基于的时间点是随机的,甚至可能是一个未来的时间,所以返回值可能为负数。但是其精确度为纳秒,相对高了不少。
2.currentTimeMillis不仅可以用来计算代码执行消耗的时间 ,也可以和Date类方便的转换。而nanoTime则不行
可以这么说吧,currentTimeMillis是一个时钟,而nanoTime是一个计时器,你可以用时钟来计算时间差,也可以用来单纯的看时间,但是作为计时器的nanoTime则只能用来计算时间差,好在优点是精确度高
3.currentTimeMillis是基于系统时间的,也就是说如果你再程序执行期间更改了系统时间则结果就会出错,而nanoTime是基于CPU的时间片来计算时间的,无法人为干扰
前面说了nanoTime基于的时间点是随机的,但是对于同一个JVM里,不同地方使用到的基点时间是一样的
此方法只能用于测量已过的时间,与系统或钟表时间的其他任何时间概念无关。返回值表示从某一固定但任意的时间算起的毫微秒数(或许从以后算起,所以该值可能为负)。此方法提供毫微秒的精度,但不是必要的毫微秒的准确度。它对于值的更改频率没有作出保证。在取值范围大于约 292 年(263 毫微秒)的连续调用的不同点在于:由于数字溢出,将无法准确计算已过的时间。
public class ClassTest { public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Test for currentTimeMillis");
for (int i = 0; i < 5; i++) {
System.out.println(i + " : " + System.currentTimeMillis());
} System.out.println("Test for nanoTime");
for (int i = 0; i < 5; i++) {
System.out.println(i + " : " + System.nanoTime());
} } }
输出结果
Test for currentTimeMillis
0 : 1588297108093
1 : 1588297108093
2 : 1588297108093
3 : 1588297108094
4 : 1588297108094
Test for nanoTime
0 : 10509981773594
1 : 10509981950048
2 : 10509982119115
3 : 10509982337424
4 : 10509982888533
8.JAVA import静态类的方法import static java.lang.System.out;
java。System.out.print(); 能够通过使用import来省略System甚至是System.out吗? import static java.lang.System.out; // 静态导入System类的 out 静态属性
或
import static java.lang.System.*; // 静态导入System类内的所有静态成员 以上都能省略“System”,调用时只需这样写:
out.println();
9.Java import的作用
详见:java中import作用详解:https://blog.csdn.net/qq_25665807/article/details/74747868
java基础点的更多相关文章
- java基础点总结
基础知识这种东西,没注意到的永远比想象中多.大部分都是在面试中问到的... 1.static关键字 变量,方法修饰;静态代码块;静态内部类; 静态导入:import static ,静态方法省略类名, ...
- 需要了解的几个Java基础点
关键字 native:表示要调用非Java语言写函数,比如用C语言使用JNI实现的接口.比如windows环境的dll文件.举例:Object.hashcode() 位运算 << n:左移 ...
- java基础点<一>
1. 九种基本数据类型的大小,以及他们的封装类.byte,short,int,long,boolue,float,double,char,特殊voidByte,Short,Integer,Long,B ...
- Java学习---面试基础知识点总结
Java中sleep和wait的区别 ① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线 ...
- Java如何打好牢固的基础?
如果纯粹是为了学Java,那么不建议阅读本文,因为本文不是从理论和教科书的角度讲述如何打好java基础,而是会从"快速用java挣钱"这个角度,讲边学.边做项目和边提升的方法. 在 ...
- spring-retry的简单使用
添加Maven依赖: <dependency> <groupId>org.springframework.retry</groupId> <artifactI ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java虚拟机垃圾回收:基础点(转载)
1.Java虚拟机垃圾回收 垃圾回收,或称垃圾收集(Garbage Collection,GC)是指自动管理回收不再被引用的内存数据. 在1960年诞生于MIT的Lisp语言首次使用了动态内存分配和垃 ...
- java类及编写public类的基础点
1.一个java文件中只能有一个public类.且公共类名称必须与java文件名一致,否则会出现错误提示.与其他面向对象编程语言的一样,在利用java分析问题时,基本思路即为将问题的属性(静)与行为( ...
随机推荐
- 【Linux】采用nginx反向代理让websocket 支持 wss
背景:玩swoole 服务 使用Nginx反向代理解决wss问题. 即客户端通过wss协议连接 Nginx 然后 Nginx 通过ws协议和server通讯. 也就是说Nginx负责通讯加解密,Ngi ...
- Apache调优(一)
(1).Apache和Tomcat的关系 Apache HTTPD Server与Apache Tomcat同属于Apache的开源项目.两个都可以单独作为web server使用,但是又都有各自的特 ...
- python flask框架学习(一)——准备工作和环境配置与安装
Flask装备: 学习自:知了课堂Python Flask框架——全栈开发 1.Python版本:3.6 2.Pycharm软件: 3.安装虚拟环境: (1)安装virtualenv: pip ins ...
- yaml中使用harbor
1.在harbor的ui界面上注册一个账号 姓名:zihao 全名:zhuzihao 密码:Zihao@5tgb 邮箱:15613691030@163.com 2.在需要下载镜像的机器上,同样需要修改 ...
- CentOS8安装docker
参考:https://www.cnblogs.com/ding2016/p/11592999.html 一,安装环境查看 二,下载docker-ce的repo curl https://downloa ...
- 【ARTS】01_41_左耳听风-201900819~201900825
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- Tomcat教程(转)
转载链接: https://www.cnblogs.com/jingmoxukong/p/8258837.html?utm_source=gold_browser_extension 简介 Tomca ...
- [Oracle] - 使用32位 PLSQL(PL/SQL Developer)登陆64位Oracle失败之解决
配置环境 Oracle服务端oracle_winx64_12c_database.iso Oracle客户端instantclient-basiclite-nt-12.1.0.1.0.zip 集成开发 ...
- Prometheus入门到放弃(2)之Node_export安装部署
1.下载安装 node_exporter服务需要在三台机器都安装,这里我们以一台机器为例: 地址:https://prometheus.io/download/ ### 另外两个节点部署时,需要先创建 ...
- tp5功能模块添加与调试
在原先完善的功能基础上添加比如导出列表为excel ,一下子把所有属性写全了,出了问题,不好查找问题在哪? 所以遇到这种问题,需要最简单的测试.比如新建一个mysql表内就放一列一行数据.减少代码量, ...