Java成长记录第二集--基础重点
第一篇写的博客给自己的学习路线立了个flag后,感觉现在学习的积极性大增,这也离不开那几位老铁们的互相鼓励。废话不多说,现在给出自己总结的Java基础部分所要重点注意的内容,对以后的开发工作也是很常用,至少我目前的感觉是这样的!对于基础的语法和数据类型,逻辑判断等相关的,如果是刚入门的话,推荐两个简单易懂的网站:菜鸟教程、w3cschool这里可以进行相关的基础知识的学习。既然是要学习,那编程工具当然是少不了的,除了常用的记事本、notepad++等,我想大家肯定都少不了要安装一款可以运行代码的编程工具吧。学习Java的肯定对eclipse和myeclipse不陌生,至于这两个有什么区别,我想度娘肯定比我解释的清除。不过慢慢的工作过程中,当我接触到intellij idea这款编程工具后,真的是如获至宝啊。想了解它有什么优势,同样找度娘,不在此篇博客范围内。
说了这么多,其实就是告诉大家要安装一款编程软件,后期可以随时进行代码的运行验证,这里还是建议大家先安装eclipse,因为idea里面的东西我自己都还没有完全搞懂呢(苦笑不得),这里推荐这位老铁的搭建教程:Java开发环境搭建。好了,这下真的要进入到这次的重要内容了!
1、Java的访问权限
Java中有四种访问权限:默认访问权限、public、private、protected
这四种访问权限中,只有默认访问权限和public才能修饰类(这里所说的类为外部类,对于内部类,四种权限都可以进行修饰),对于字段和方法,四种权限都可以进行修饰。
默认访问权限(字段或类前不加任何修饰符):用默认访问权限进行修饰,只能在同包中进行访问。
public:任何地方都可见(方法、字段、包)。
private:用private修饰的方法或字段只能在本类中进行访问。
protected:用protected修饰类的方法或字段,在同包中可以被访问,对于不同的包,只能通过继承对其方法或字段进行访问。
具体细节参考:http://www.cnblogs.com/dolphin0520/p/3734915.html,这篇博文中有详细解释。
2、开发过程中不得不面临的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
注:在重写equals方法时为什么要同时重写hashCode方法?
具体参考:http://www.cnblogs.com/happyPawpaw/p/3744971.html
重写hashCode方法,主要是为了维护hashCode方法的协定,该协定规定,相等的对象必须有相同的哈希码。
3、String、StringBuffer和StringBuilder的区别点在哪里、?
这三个对象在平时使用和面试中出现的频次非常的高。
要点:
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。
具体参考:
http://www.cnblogs.com/dolphin0520/p/3778589.html
http://blog.csdn.net/seu_calvin/article/details/52291082
http://www.importnew.com/14142.html
http://blog.csdn.net/bigtree_3721/article/details/74907670
http://blog.csdn.net/hzw19920329/article/details/51262925
4、集合类不得不掌握的东西
数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用。
集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用。
要点:
List有序集合,可以包含重复元素。
Set无序(TreeSet有序,二叉树排序),不能包含重复元素。
Map不能包含重复的键值,因为键值对。
注:参考博文中说,所有集合类都实现了Iterator接口,但是Map集合是没有实现该接口的。
集合中有几个重要的对象需要特别提出来:HashMap、Hashtable、ConcurrentHashMap
这里给出两位老铁总结比较详细的博客:
https://www.cnblogs.com/leeplogs/p/5891861.html
HashMap的实现原理,参考:http://www.cnblogs.com/xwdreamer/archive/2012/06/03/2532832.html
注:参考博文中说,所有集合类都实现了Iterator接口,但是Map集合是没有实现该接口的。
集合中有几个重要的对象需要特别提出来:HashMap、Hashtable、ConcurrentHashMap
HashMap的主要特点:
1)非同步的,也就说是非线程安全的,与Hashtable相反。
2)无序,允许null键和null值(HashTable不允许键或值为null),不能包含重复的键,但是重复的键是可以put进HashMap集合的。
3)继承自AbstractMap,并实现了Map接口。
4)在HashMap中扩容时,是非常耗性能的;HashMap默认数据容量大小为16,loadFactor(扩容因子默认值为0.75),当元素个数大于16*0.75=12时,就会进行扩容,扩大一倍:2*16=32。
5)HashMap线程不安全的具体体现,参考:http://www.importnew.com/22011.html
HashTable的实现原理,参考:https://www.cnblogs.com/wxgblogs/p/5559020.html
Hashtable的主要特点:
1)Hashtable是线程安全的。
2)无序,不允许null键或null值。
3)继承与Dictionary接口,也实现了Map接口。
4)Hashtable扩容时,扩大的容量为:2n*+1,扩大一倍并加1。Hashtable默认数据容量为11。
ConcurrentHashMap的实现原理,参考:
https://my.oschina.net/hosee/blog/639352
https://www.cnblogs.com/chengxiao/p/6842045.html
http://pettyandydog.com/2017/07/27/concurrentHashMap/
https://my.oschina.net/hosee/blog/675884
ConcurrentHashMap的主要特点:(基本上到目前没遇到过这个集合)
1)线程安全的,主要使用锁分离技术(分段锁)。
2)初始容量大小为16,默认并发度也为16。
3)由于使用分段锁技术,只有对于同一段数据操作,才会考虑线程同步。
4)无序,不允许null键或null值。(源码put函数可以得出该结论)
今天的博客就主要分享这几个吧,毕竟一口吃不了一个大胖子。还有点要说明一下,上述内容并不都是我自己写的,我没有那么好的文采。但这些东西绝对是我自己都认真看过之后才贴出来的,不喜勿喷,发这个的最初目的就是为了督促自己每天进步一点点就够了~by:lmyou
Java成长记录第二集--基础重点的更多相关文章
- Java成长第三集--基础重点详细说明
接上篇文章,继续阐述相关的重点基础知识,话不多说! 一.Java中equals()和“==”区别 1.对于8种基础数据类型,使用“=="比较值是否相等: 2.对于复合数据类型(类),使用eq ...
- 【小白的java成长系列】——面向对象基础
今天来说说java面向对象的知识点~事实上.java在其发展过程中可以成功.非常大一部分原因是其面向对象的思想~ 1.概念 如今来说面向对象思想.也不是什么新的知识点了,我们知道如今非常多语言都有面向 ...
- Java成长第四集--文本处理IO流
Java IO流在实际业务中使用的频率还是蛮高的,一些业务场景比如,文件的上传和导出,文件的读取等基本都是通过操作IO流来实现的,所以IO流是我们现在学习过程中必须要掌握的技能之一,熟练的使用IO流, ...
- Java成长第五集--面向对象设计的五大原则
S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则(Programming Priciple)的首字母缩写.以下图说明: 下面就个人的理解来说说这五大原则的含义到 ...
- Java基础知识二次学习-- 第二章 基础语法与递归补充
第二章 基础语法与递归补充 时间:2017年4月24日10:39:18 章节:02章_01节,02章_02节 视频长度:49:21 + 15:45 内容:标识符,关键字与数据类型 心得:由字母,下 ...
- Java基础重点指南
Java基础重点指南 每个人都有自己的学习方法,下面是我学完Java后总结的一些要点: 一:(了解)Java诞生于1995年,由Sun公司开发.它把源代码编译成“中间码”,然后通过“Java虚拟机”把 ...
- 20145330《Java程序设计》第二次实验报告
20145330<Java程序设计>第二次实验报告 实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承多态 3.初步掌握UM ...
- 20175211 2018-2019-2 《Java程序设计》第二周学习总结
目录 教材学习内容总结 第二章 第三章 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 其他(感悟.思考等,可选) 学习进度条 参考资料 教材学习内容总结 第二章 ...
- 20172325 2018-2019-1 《Java程序设计》第二周学习总结
20172325 2018-2019-1 <Java程序设计>第二周学习总结 教材学习内容总结 3.1集合 集合是一种聚集.组织了其他对象的对象.集合可以分为两大类:线性集合和非线性集合. ...
随机推荐
- Python3学习之路~9.4 队列、生产者消费者模型
一 队列queue 当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. 队列的作用:1.解耦,使程序直接实现松耦合 2.提高处理效率 列表与队列都是有顺序的,但是他们之间有一个很大的区别 ...
- DIV常用属性大全
目录 一.属性列表 二.常用属性 三.一些特殊效果 四.定位和控制 一.属性列表 color : #999999 文字颜色 font-family : 宋体 文字字型 font-size : 10pt ...
- Aleax prize (开放域聊天系统比赛)2018冠军论文阅读笔记
Abstract Gunrock是一种社交机器人,旨在让用户参与开放域的对话.我们使用大规模的用户交互数据来迭代地改进了我们的机器人,使其更具能力和人性化.在2018年Alexa奖的半决赛期间,我们的 ...
- Java——Collection集合
##Collection集合 1.Collection集合是单列集合 2.Collection是所有单列集合最顶层的接口,定义了所有单列集合的共性方法 任意的单列集合都可以使用Collection接口 ...
- 面试刷题17:线程两次start()会发生什么?
线程是并发编程的基础元素,是系统调度的最小单元,现代的jvm直接对应了内核线程.为了降低并发编程的门槛,go语言引入了协程. 你好,我是李福春,我在准备面试,今天的题目是? 一个线程两次调用start ...
- TensorFlow系列专题(五):BP算法原理
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/ ,学习更多的机器学习.深度学习的知识! 一.反向传播算法简介 二.前馈计算的过程 第一层隐藏层的计算 第 ...
- 图的深度优先搜索dfs
图的深度优先搜索: 1.将最初访问的顶点压入栈: 2.只要栈中仍有顶点,就循环进行下述操作: (1)访问栈顶部的顶点u: (2)从当前访问的顶点u 移动至顶点v 时,将v 压入栈.如果当前顶点u 不存 ...
- Jmeter 注册用户获取登录token值
1. 打开jemeter,新建一个测试计划,>线程组 >新建一个 登录的 Http 请求. 2.填上相应的值 3.新建一个消息头管理器> content-Type applicat ...
- mybatis 源码赏析(一)sql解析篇
本系列主要分为三部分,前两部分主要分析mybatis的实现原理,最后一部分结合spring,来看看mybtais是如何与spring结合的就是就是mybatis-spring的源码. 相较于sprin ...
- 在Ngnix中配置支持Websocket
使用SignalR实现Websocket实时数据传输时,前后端各自实现编码后,无法将Websocket调试通过.沮丧之时,负责配置网络代理的同事说,网络访问这块使用了Ngnix代理设置,可能是造成We ...