java基础的知识_Java基础知识点(一)
前言:本篇随笔,主要记录Java的基础知识点,不管是用于项目或者面试中,笔者认为都非常有用,所以将持续更新......
1.Java的访问权限
Java中有四种访问权限:默认访问权限、public、private、protected
这四种访问权限中,只有默认访问权限和public才能修饰类(这里所说的类为外部类,对于内部类,四种权限都可以进行修饰),对于字段和方法,四种权限都可以进行修饰。
默认访问权限(字段或类前不加任何修饰符):用默认访问权限进行修饰,只能在同包中进行访问。
public:任何地方都可见(方法、字段、包)。
private:用private修饰的方法或字段只能在本类中进行访问。
protected:用protected修饰类的方法或字段,在同包中可以被访问,对于不同的包,只能通过继承对其方法或字段进行访问。
2.Java中"=="与equals()方法的区别
1)对于8种基础数据类型,"=="比较值是否相等。
如果作用于引用类型的变量,则比较的是所指向对象的地址。
注:equals方法是不能作用与基础类型数据的,只能作用与引用类型数据。
2)对于equals方法:
如果equals方法未被重写,则比较的是引用类型变量所指向的对象地址。
对于String、Integer、Date等复写了equals方法的对象,则比较的是对象内容。
注:重写了equals方法的对象:String、8种基础类型的包装类、Date等,这里并未列举完。
具体参考:
3.在重写equals方法,为什么有必要同时重写hashCode方法
重写hashCode方法,主要是为了维护hashCode方法的协定,该协定规定,相等的对象必须有相同的哈希码。
4.String、StringBuffer和StringBuilder
这三个对象在平时使用和面试中出现的频次非常的高。
要点:
String是不可变对象。这点可以从String的源码中看到。String源码分析传送门:String源码分析
StringBuffer是线程安全的。从源码中可以看到函数上使用了synchronized进行修饰。
StringBuilder是非线程安全的。
特别指出String中的intern()方法,该方法从源代码中可以看出为本地方法(并且与jdk的版本有关系,以jdk1.6为分界点),并且在面试题中极其容易出现,具体区别为:
在jdk1.6以前:
调用intern方法时,首先会去常量池中查找是否存在与当前String值相同的值,
如果存在的话,则直接返回常量池中这个String值的引用;如果不存在的话,则会将原先堆中的该字符串拷贝一份到常量池中,并返回该字符串在常量池中的引用。
jdk1.7:
调用intern方法时,首先会去常量池中查找是否存在与当前String值相同的值,
如果存在的话,则直接返回常量池中这个String值的引用;如果不存在的话,则只会将原先堆中该字符串的引用放置在常量池中。注意:不会拷贝这个字符串到常量池中。
注意:由于jdk1.7对字符串常量池做出了调整,从PermGen区中调整到了堆中,所以在使用intern方法时,并不会进行字符串的拷贝。
下面给出相应例子,更清楚的说明intern方法。
1 String str1 = "abcd";2 String str2 = new String("ab") + new String("cd");3 System.out.println(str2.intern() ==str1);4 System.out.println(str2 == str1);
jdk1.6中输出:
false
false
jdk1.7中输出:
true
false
解释:
在jdk1.6中字符串常量池和堆区被完全区分开,所以会返回两个false。
在jdk1.7中
在执行第1行String str1=“abcd”时,会将“abcd”直接存储到常量池中。
在执行第2行String str2=new String("ab")+new String("cd")时,在类加载的时候,会在常量池中存储"ab"和"cd"。
当执行str2.intern()方法时,发现常量池中存在"abcd"(第一行代码的结果),所以返回此时"abcd"字符串的引用,即str1,所以str2.intern()==str1为true,两处的引用相同的。
第四行,str2==str1,两个引用的地址明显不同,str2指向堆,str1指向字符串常量池中,所以为false。
将上述代码进行变形,形式如下:
1 String str2 = new String("ab") + new String("cd");2 str2.intern();3 String str1="abcd";4 System.out.println(str2 == str1);
在jdk1.6中,同样输出false。
但是在jdk1.7中输出true。
解释:
在执行第1行String str2=new String("ab")+new String("cd")时,在类加载的时候,会在常量池中存储"ab"和"cd"。注意:这时常量池中是没有"abcd"的。
在执行第2行str2.intern()方法时,发现常量池中没有"abcd",于是将str2的引用放入常量池中,并不会进行拷贝。
在执行第3行时,发现常量池中已经存在"abcd"的引用了,直接赋值给str1,所以最后的结果为true。
将上述代码再次变形,将第2行与第3行互换位置。形式如下:
1 String str2 = new String("ab") + new String("cd");2 String str1 = "abcd";3 str2.intern();4 System.out.println(str2 == str1);
在jdk1.6与jdk1.7中都是输出false。
这个原理比较简单了,str2与str1,明显是两个不同的引用,str2指向堆,str1指向字符串常量池,所以为false。
具体参考:
5.关于集合类
重点归纳:
List有序集合,可以包含重复元素。
Set无序(TreeSet有序,二叉树排序),不能包含重复元素。
Map不能包含重复的键值,因为键值对,重复键会被覆盖。
注:参考博文中说,所有集合类都实现了Iterator接口,但是Map集合是没有实现该接口的。
下面对常见集合的主要特点进行总结:
HashMap:
#1.非同步的,也就说是线程不安全,与Hashtable相反。
#2.无序,允许null键和null值(HashTable不允许键或值为null),不能包含重复的键,出现重复的键值时,在put操作时会进行覆盖。
#3.在HashMap中扩容时,是非常耗性能的;HashMap默认数据容量大小为16,loadFactor(扩容因子默认值为0.75),当元素个数大于16*0.75=12时,就会进行扩容,扩大一倍:2*16=32。
#5.HashMap线程不安全体现传送门:HashMap线程不安全的体现
Hashtable:
#1.Hashtable是线程安全的。
#2.无序,不允许null键或null值。
#3.继承Dictionary接口,也实现了Map接口。
#4.Hashtable扩容时,扩大的容量为:2n*+1,扩大一倍并加1。Hashtable默认数据容量为11。
#5.Hashtable源码分析传送门:Hashtable源码分析
ConcurrentHashMap的实现原理,参考:
ConcurrentHashMap:
1)线程安全的,主要使用锁分离技术(分段锁)。
2)初始容量大小为16,默认并发度也为16。
3)由于使用分段锁技术,只有对于同一段数据操作,才会考虑线程同步。
4)无序,不允许null键或null值。(源码put函数可以得出该结论)
by Shawn Chen,2018.3.19日,下午。
相关内容
java基础的知识_Java基础知识点(一)相关推荐
- java的语法知识_Java语法知识点
特殊字符 \n 换行符 \t 制表符8个基本数据类型byte 字节型 1 short 短整型 2 int 整型 4 long 长整型 8 char 字符型 2 boolean 布尔型 1 float ...
- java循环基础知识_Java基础知识·循环语句
掘友们,大家好呀,我是宸道. 今天要讲解的是Java基础的循环语句,虽然很基础但还是希望大家看完,就当时复习知识了,基础越牢固越好,对我们是有很大帮助的. 相关推荐 循环语句可以在满足循环条件的情况下 ...
- java基础小项目_java基础小项目练习之1----3天做出飞机大战
Shoot射击游戏第一天 一.关键问题(理论): 1.简述FlyingObject.Enemy.Award.Airplane.Bee.Bullet.Hero之间的继承与实现关系 2.简述Hero类构造 ...
- java框架知识_java框架知识点总结
java框架知识点总结 面对Java丰富的知识资料,很多初学者难免觉得迷惘,下面是小编为大家整理的java框架知识点总结,欢迎参考~ 1 对象的初始化 (1) 非静态对象的初始化在创建对象时,对象所在 ...
- java io流 教程_Java基础教程:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...
- java引入string类_Java基础教程——String类
String类 Java程序中的所有字符串字面值(如 "abc" )都是String的实例 字符串是常量(因为 String 对象是不可变的,所以可以共享) 字符串的本质是字符数组 ...
- java全局变量怎么定义_Java开发知识点:如何理解Java函数式编程?
Java是一种计算机编程语言,可用于编写桌面应用程序.Web应用程序.分布式系统和嵌入式系统应用程序等,是IT开发行业中最受欢迎的编程语言之一.想要学好Java必须要一步一个脚印打好基础.积攒实战经验 ...
- java入门第六天课程_Java基础知识——第六天
原标题:Java基础知识--第六天 在前面的第四天,已经简单的介绍下了Java中类的结构,今天就深入的说下类的深层结构. 在Java中,可以在同一个类中定义两个或多个共享相同名称的方法,只要它们的参数 ...
- java入门知识_Java基础知识杂文
1.基本概念 IO是主存和外部设备(硬盘.终端和网络等)拷贝数据的过程.IO是操作系统的底层功能实现,底层通过I/O指令进行完成. 所有语言运行时系统提供执行I/O较高级别的工具.(c的printfs ...
最新文章
- 网络推广中常见的网站建设细节中有哪些重点值得网络推广专员重视?
- C++ void类型指针的使用
- hive解决数据倾斜问题_八种解决 Spark 数据倾斜的方法
- spring-security-oauth2实现OAuth2.0服务
- tcp文件上传--多个客户端
- OpenCL、OpenGL 同时工作
- 服务器 独立显卡 显示不出来,dell服务器R720+独立显卡GTX1650,进不去系统,UEIF报错...
- Oracle数据库性能优化的艺术pdf
- 老罗Android开发视频教程(Android入门介绍)九集集合
- 树莓派从零开始学习记录
- 深度学习小笔记04-魏秀参《解析深度学习-卷积神经网络原理与视觉实践》
- 一文详解 Base64编码原理
- 显著性检验:P值和置信度
- OverLeaf(LaTeX在线编辑器)使用简介
- Android 高通8909 系统之路之 裁剪系统 一
- Java类加载的加载,验证,准备,解析,初始化小结
- 最新瑞芯微四核芯片RK3288开源开发板
- Linux 网络编程: daytime Service
- matlab怎么存盘,matlab怎么保存成word
- 洛谷日报 2020年3月前索引
热门文章
- 【分享】美图个性化Push AI探索之路(附交流视频和PPT下载链接)
- 【报告分享】数据资产化之路----数据资产的估值与行业实践.pdf
- Python正则表达式总结
- 【数据结构与算法基础】树的应用
- oracle12c加密ted,使用Oracle Wrap工具加密你的代码
- Linux能ping主机,但ping不了网关以及外网,显示包全丢失解决方案
- Leetcode:5.longest-palindromic-substring(最长回文子串)
- markdown语法简明笔记
- 【转载】Windows 10系统默认将画面显示比例调整至125%或150%,最高分辨率已经达到3840×2160(4K)这一级别。...
- 第四:RobotFramework+Allure2生成精美测试报告