热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:java基础点

篇首语:本文由编程笔记#小编为大家整理,主要介绍了java基础点相关的知识,希望对你有一定的参考价值。 1.eclipse什么时候编译java类文件2.在同一包中的类可以相互引用,无需用import语

篇首语:本文由编程笔记#小编为大家整理,主要介绍了java基础点相关的知识,希望对你有一定的参考价值。




1.eclipse什么时候编译java类文件


2.在同一包中的类可以相互引用,无需用import语句


3.在Java eclipse用ALT输入特殊符号

4.if else等语句,什么时候可以不加括号 


5.HashMap桶中链表转红黑树为什么选择数字8,hashcode 用数字31?

6.++i和i++的区别 

7.nanoTime vs currentTimeMillis 比较

8.JAVA import静态类的方法import static java.lang.System.out

9.Java import的作用

10.注释相关

11.半角和全角的区别

12.关于String对象创建的几个问题

 


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://www.cnblogs.com/lukelook/p/12834940.html

 

java中import作用详解:https://blog.csdn.net/qq_25665807/article/details/74747868

import 跟 #include 不同,是因为import 的功能到此為止,它不像#include 一样,会将其他java文件的内容载入进来。import 只是让编译器编译这个java文件时把没有姓的类别加上姓,并不会把别的文件程序写进来。你开心的话可以不使用import,只要在用到类别的时候,用它的全部姓名来称呼它就行了(就像例子一开始那样),这样跟使用import功能完全一样。

10.注释相关

用于提取注释的工具叫作javadoc

所 有javadoc命令都只能出现于“/**”注释中。但和平常一样,注释结束于一个“*/”

注 意javadoc只能为public(公共)和protected(受保护)成员处理注释文档。“private”(私有)和“友好”(详见5章)成员的 注释会被忽略.

11.中文半角和全角的区别

在编程序的源代码中只能使用半角标点(不包括字符串内部的数据) 

最直观的区别,在eclipse中用全角空格会报错。。。。

切换快捷键   中文输入法下 shift + space

扩展:


「全角」与「半角」两个术语应该都是从日本来的。
印刷上纵横比为1:1的字符(块)称为全角,其四、三、二分之一分别称作「四分」、「三分」、「二分」。
文字处理电子化之后,JIS C 6220 标准将所有片假名编入 ASCII 未用的单字节高位(同时对低位的几个字符做了修改,
比如 backslash,这就是为什么早期 Windows 上装日文游戏的时候路径分隔符会变成日元符号)。所有这些符号在早期
的点阵显示器上有 8 像素的宽度就可以得到很好的效果了。为了装入汉字,编码必须使用两个字节,而显示起来,8 像素捉
襟见肘,16 像素是最简单也是最贴合双字节编码的选择。这样一来,英文字符恰好在编码和显示时都是汉字的一半。JIS X 4051
《日本語文書の組版方法》里面,将全角定义为「汉字一文字的外框」,半角定义为「字宽为全角二分之一的文字之外框」。
至于为什么全角字符会有英文,我个人猜测是为了竖排,或者汉字必须行列对齐的其他情形。

什么是全角和半角?

(1)全角---指一个字符占用两个标准字符位置。

汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符。一般的系统命令是不用全角字符的,只是在作文字处理时才会使用全角字符。

(2)半角---指一字符占用一个标准的字符位置。

通常的英文字母、数字键、符号键都是半角的,半角的显示内码都是一个字节。在系统内部,以上三种字符是作为基本代码处理的,所以用户输入命令和参数时一般都使用半角。

B 全角与半角有什么区别?各在什么情况下使用?

全角占两个字节,半角占一个字节。

半角全角主要是针对标点符号来说的,全角标点占两个字节,半角占一个字节,而不管是半角还是全角,汉字都还是要占两个字节

在编程序的源代码中只能使用半角标点(不包括字符串内部的数据)

在不支持汉字等语言的计算机上只能使用半角标点(其实这种情况根本就不存在半角全角的概念)

其他时候好像基本上没怎么区分全角和半角,你觉得那种写着好看就用哪种吧

,.?\'! ……这些是半角的

,。?‘! ……这些是全角的

对于大多数字体来说,全角看起来比半角大,当然这不是本质区别了

全角是中文的标点.半角是英文的吧.

C 全角和半角的区别

全角就是字母和数字等与汉字占等宽位置的字

半角就是ASCII方式的字符,在没有汉字输入法起做用的时候输入的字母数字和字符都是半角的。

示例如下:(键盘的输入是一样的,输入法的设置不同)

[全角举例]AabB1234@#$%^&*;,。:

[半角举例]AabB1234@$%^&*;,.:

在汉字输入法出现的时候,输入的字母数字默认为半角,但是标点则是默认为全角

D 关于“全角”和“半角”:
全角:是指中GB2312-80(《信息交换用汉字编码字符集·基本集》)中的各种符号,如A、B、C、1、2、3等,应将这些符号理解为汉字。
半角:是指英文件ASCII码中的各种符号,如A、B、C、1、2、3、等。
在VFP命令及程序中,命令字不能用全角,如清屏命令应该是CLEAR,不能是CLEAR。所以应该在关闭汉字输入状态下,或即使在汉字输入状态下,也应在半角状态,
输入法状态条应是:中的状态,不应是状态,可用Shift+Space切换。

 12.关于String对象创建的几个问题

   对于下面声明的这个变量创建了几个对象?

          String str=new Stirng("xyz"); //创建了几个对象

          String str2="abc";//创建了几个对象

          首先说“String str=new Stirng("xyz");”创建了一个或者两个

          对于“xyz”这个对象而言,它是存放在字符串的缓冲区中的,不管出现多少遍,都是缓冲区中的那一个。而new String()每次都会创建一个新的对象。所以如果之前创建

          过“xyz”这个对象的话,那么久创建一个对象,而如果之前要是没有创建过这个字符串的话,那么就会创建两个对象。

          其次说String str2=“abc”会创建零个或者一个。

          这个是为什么我就不哆嗦了。

          需要注意str和str2是变量名不是对象。

         

          请看下面的这条语句创建了几个对象?

          String str="a"+"b"+"c"+"d"+"e"+"f"+"g"+"h"+"i"+"j"+"k";

          没错这里仅仅创建了一个对象即str=”abcdefghijk“;

  



推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
author-avatar
林伯勋玉萍竣梅
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有