Java基础知识点(一)
前言:本篇随笔,主要记录Java的基础知识点,不管是用于项目或者面试中,笔者认为都非常有用,所以将持续更新......
1.Java的访问权限
Java中有四种访问权限:默认访问权限、public、private、protected
这四种访问权限中,只有默认访问权限和public才能修饰类(这里所说的类为外部类,对于内部类,四种权限都可以进行修饰),对于字段和方法,四种权限都可以进行修饰。
默认访问权限(字段或类前不加任何修饰符):用默认访问权限进行修饰,只能在同包中进行访问。
public:任何地方都可见(方法、字段、包)。
private:用private修饰的方法或字段只能在本类中进行访问。
protected:用protected修饰类的方法或字段,在同包中可以被访问,对于不同的包,只能通过继承对其方法或字段进行访问。
具体细节参考:http://www.cnblogs.com/dolphin0520/p/3734915.html,这篇博文中有详细解释。
2.Java中"=="与equals()方法的区别
1)对于8种基础数据类型,"=="比较值是否相等。
如果作用于引用类型的变量,则比较的是所指向对象的地址。
注:equals方法是不能作用与基础类型数据的,只能作用与引用类型数据。
2)对于equals方法:
如果equals方法未被重写,则比较的是引用类型变量所指向的对象地址。
对于String、Integer、Date等复写了equals方法的对象,则比较的是对象内容。
注:重写了equals方法的对象:String、8种基础类型的包装类、Date等,这里并未列举完。
具体参考:
https://www.cnblogs.com/wangjiangwu/p/5770634.html
http://www.cnblogs.com/dolphin0520/p/3592500.html
3.在重写equals方法,为什么有必要同时重写hashCode方法
具体参考:http://www.cnblogs.com/happyPawpaw/p/3744971.html
重写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方法。
String str1 = "abcd";
String str2 = new String("ab") + new String("cd");
System.out.println(str2.intern() == str1);
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。
将上述代码进行变形,形式如下:
String str2 = new String("ab") + new String("cd");
str2.intern();
String str1="abcd";
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行互换位置。形式如下:
String str2 = new String("ab") + new String("cd");
String str1 = "abcd";
str2.intern();
System.out.println(str2 == str1);
在jdk1.6与jdk1.7中都是输出false。
这个原理比较简单了,str2与str1,明显是两个不同的引用,str2指向堆,str1指向字符串常量池,所以为false。
具体参考:
http://www.cnblogs.com/dolphin0520/p/3778589.html
http://blog.csdn.net/seu_calvin/article/details/52291082
http://blog.csdn.net/bigtree_3721/article/details/74907670
http://blog.csdn.net/hzw19920329/article/details/51262925
5.关于集合类
具体细节参考这篇博文:https://www.cnblogs.com/leeplogs/p/5891861.html,总结得非常详细。
重点归纳:
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线程不安全的体现
#6.HashMap源码分析传送门:HashMap源码分析——基于jdk1.7
Hashtable:
#1.Hashtable是线程安全的。
#2.无序,不允许null键或null值。
#3.继承Dictionary接口,也实现了Map接口。
#4.Hashtable扩容时,扩大的容量为:2n*+1,扩大一倍并加1。Hashtable默认数据容量为11。
#5.Hashtable源码分析传送门:Hashtable源码分析
ConcurrentHashMap的实现原理,参考:
https://my.oschina.net/hosee/blog/639352
https://www.cnblogs.com/chengxiao/p/6842045.html
https://my.oschina.net/hosee/blog/675884
ConcurrentHashMap:
1)线程安全的,主要使用锁分离技术(分段锁)。
2)初始容量大小为16,默认并发度也为16。
3)由于使用分段锁技术,只有对于同一段数据操作,才会考虑线程同步。
4)无序,不允许null键或null值。(源码put函数可以得出该结论)
by Shawn Chen,2018.3.19日,下午。
相关内容
Java基础知识点(一)的更多相关文章
- Java基础知识点(四)
前言:记录Java基础知识点,方便熟悉与掌握. 1.面向对象的"六原则一法则" “六原则一法则”:单一职责原则.开闭原则.依赖倒转原则.里氏替换原则.接口隔离原则.合成聚合复用原则 ...
- Java基础知识点(三)
前言:准备将Java基础知识点总结成一个系列,用于平常复习并加深理解.每篇尽量做到短小精悍,便于阅读. 1.Math类中相关函数 Math.floor(x):返回不大于x的最大整数.eg:Math.f ...
- Java基础知识点(二)
前言:Java的基础知识点不能间断. 1.Array和ArrayList的区别 关于Array的用法,参看:http://blog.csdn.net/b_11111/article/details/5 ...
- Java基础知识点总结
前言 本文主要是我之前复习Java基础原理过程中写的Java基础知识点总结.Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其 ...
- JAVA基础知识点总结(全集)
1.JAVA简介 1.1java体系结构:j2se,javaweb,j2ee 1.2java特点:平台无关(虚拟机),垃圾回收(使得java更加稳定) 1.3 JDK与JRE,JDK:java开发环境 ...
- java基础知识点补充---二维数组
#java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...
- Java基础知识点
以下10点为JAVA 基础知识,后面将足以总结和完善以备面试 数据类型 (包装类,字符串,数组) 异常处理 Java IO和NIO 数据结构 (集合和容器 ) 多线程(并发) 网络通信(协议) 面向对 ...
- 如何学习java?Java基础知识点分享
面对未知的行业,人们的第一反应应该是:拒绝踏入.因为学习真的是一个痛苦的过程.想要真正了解一个行业,熟知一个行业,并熟练掌握某一技术,是真的需要时间和精力的.在学习Java基础知识期间,千锋小编疯狂为 ...
- Java 基础知识点
很多 Java 基础的东西都忘记了, 有必要再复习一些基本的知识点. 本文主要参考 https://github.com/Snailclimb/JavaGuide ================== ...
随机推荐
- Spring核心——设计模式与IoC
“Spring”——每一个Javaer开发者都绕不开的字眼,从21世纪第一个十年国内异常活跃的SSH框架,到现在以Spring Boot作为入口粘合了各种应用.Spring现在已经完成了从web入口到 ...
- Docker 系列三(容器管理).
一.运行容器 1.基于镜像新建一个容器并启动 : tomcat:8.0 -i:交互式操作 -t:终端 -rm:容器退出后随之将其删除,可以避免浪费空间 -p :端口映射 -d :容器在后台运行 指明了 ...
- pullMsg有感
开发功能过程中,始终会有些东西是确认的,比如美丑.业务是否合理.对错. 如果明知道不合理,却按照已有规定.框架.设计去开发,其实是不够职业. 好的做法是朝对的方向去push,并落地: 次之是去push ...
- 05-HTML-超链接标签
<html> <head> <title>超链接标签学习</title> <meta charset="utf-8"/&g ...
- BZOJ 1188: [HNOI2007]分裂游戏(multi-nim)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1386 Solved: 840[Submit][Status][Discuss] Descripti ...
- 洛谷P4302 [SCOI2003]字符串折叠(区间dp)
题意 题目链接 Sol 裸的区间dp. 转移的时候枚举一下断点.然后判断一下区间内的字符串是否循环即可 `cpp #include<bits/stdc++.h> #define Pair ...
- 洛谷P4926 [1007]倍杀测量者(差分约束)
题意 题目链接 Sol 题目中的两个限制条件相当于是 \[A_i \geqslant (K_i - T)B_i\] \[A_i(K_i + T) \geq B_i\] 我们需要让这两个至少有一个不满足 ...
- mybatis 通过实体类进行查询
如果使用实体类进行查询, 不管会不会使用到 主键, 都必须设置主键, 才能查询 <select id="selectByAppidAndServerCode" resultM ...
- 我喜欢 Google Flutter
在 Google I/O ’17 上,Google 向我们介绍了 Flutter —— 一款新的用于创建移动应用的开源库. 正如你所想的那样,Flutter 是能够帮助创建拥有漂亮 UI 界面的跨平台 ...
- leetcode-28.实现strStr()
leetcode-28.实现strStr() 题意 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字 ...