Java学习
文章平均质量分 84
Never_Blue
贵在中和,不争之争
展开
-
Typora —— MarkDown文本编辑器
什么是MarkDown?Markdown是一种可以使用普通文本编辑器编写的标记语言,属于轻量级的标记语言。MarkDown通过简单的标记语法,可以使普通文本内容具有一定的格式,比如字体加粗、标题排版、段落排版、图片引用、超链接引用等等。使得编辑者不再为文本的排版浪费时间,而是专注于文本本省,极大的减少了记录文字中所耗费的不必要的时间和精力。使用MarkDown编写的文档后缀为.md(markdown)。目前有很多的网站都可以使用markdown来编写文档或者在论坛及博客上发表消息,例如:CSDN、Git原创 2020-05-16 15:02:39 · 426 阅读 · 0 评论 -
常见Java集合实现细节——Set集合与Map集合
1、Set集合与Map集合 Set集合代表着元素无序、不可重复的集合,Map集合则表示由key-value对组成的集合,Map集合类似于关联数组。从表面上来看,它们之间的相似性很小,但是实际上Map集合和Set集合之间有很大的关系,可以说是,Map集合是Set集合的扩展。1、1 Set与Map之间的关系 仔细观察Map集合原创 2017-04-11 10:22:03 · 1074 阅读 · 0 评论 -
常见Java集合实现细节——Iterator迭代器
4、Iterator迭代器 Iterator是一个迭代器接口,专门用于迭代器各种Collection集合,包括Set集合和List集合。4、1 Iterator实现类与迭代器模式import java.util.ArrayDeque;import java.util.ArrayList;import java.util.EnumSet;import java.原创 2017-04-19 08:55:44 · 894 阅读 · 0 评论 -
Java表达式的陷阱——关于字符串的陷阱
1、关于字符串的陷阱 字符串是Java程序中使用最广泛的一种对象,虽然它具有简单易用的特征,但是实际使用字符串时也会有一些潜在的陷阱,这些陷阱往往会给实际开发带来潜在的困扰。1、1 JVM对字符串的处理 String str = new String("Java对象"); 对于上面常见的Java语句,常见的问题是,上面语句创建了几个字符串?答案是:上面的原创 2017-04-22 23:48:43 · 511 阅读 · 0 评论 -
常见Java集合实现细节——List集合与Map集合
2、 List集合与Map集合2、1 Map的values()方法 Map集合是一个关联数组,它包含两组值:一组是所有key组成的集合,因为Map集合的key不允许重复,而且Map不会保存key加入的顺序,因此这些key可以组成一个Set集合;另外一组是value组成的集合,因为Map集合value完全可以重复,而且Map可以根据key来获取对应的value,所以这些value原创 2017-04-13 10:31:01 · 4814 阅读 · 0 评论 -
Java表达式的陷阱——多线程的陷阱
6、多线程的陷阱 Java语言提供了非常优秀的多线程支持,使得开发者能以简单的代码来创建、启动多线程,而且Java语言内置了多线程支持极好地简化了多线程编程。虽然如此,Java多线程编程中依然存在一些容易混淆的陷阱。6、1 不要调用run()方法 从Java5开始,Java提供了三种方式来创建、启动多线程。继承Thread类创建线程类,重写run()原创 2017-04-25 09:22:49 · 695 阅读 · 0 评论 -
Java流程控制的陷阱——if语句和循环体的陷阱
3、if语句的陷阱3、1 else隐含的条件 else字面意义是“否则”,隐含的条件是前面条件都不符合,也就是else有一个隐含的条件,else if的条件是if显示条件和else隐式条件的交集。public class IfErrorTest { public static void main(String[] args) { int age = 45;原创 2017-04-26 10:20:43 · 590 阅读 · 0 评论 -
Java流程控制的陷阱——switch语句和标签陷阱
1、switch语句陷阱 switch语句是Java提供的一种重要的分支语句,它用于判断某个表达式的值,根据不同的值执行不同的分支语句。需要指出的是,Java的switch语句限制很多,而且还有非常容易出错的陷阱,使用时要非常的小心。1、1 default分支 switch语句之后可以包含一个default分支。default分支并不是无条件执行的分支,执行原创 2017-04-26 09:21:18 · 1015 阅读 · 0 评论 -
Java流程控制的陷阱——for循环和foreach循环的陷阱
5、for循环的陷阱5、1 分号的问题public class SemicolonRight { public static void main(String[] args) { for ( int j = 1 , i = 0 ; i < 5 && j < 20 ; i++ , j *=2 ) { System.out.println(i + "-->" + j); }原创 2017-04-26 11:27:04 · 1073 阅读 · 0 评论 -
常用的内部排序
1 排序概述 一旦将一个杂乱无章的记录重排成一组有序记录,就能够快速地从这组记录中找到目标记录。因此通常来说,排序的目的就是快速查找。 对于一个排序算法来说,一般从如下三个方面来衡量算法的优劣。时间复杂度:主要是分析关键字的比较次数和记录的移动次数。空间复杂度:分析排序算法中需要多少辅助内存。稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次原创 2017-05-03 09:54:23 · 540 阅读 · 0 评论 -
数组及其内存管理——使用数组
2、使用数组当数组引用变量指向一个有效的数组对象后,程序就可以使用数组引用变量访问对象。Java不允许直接访问堆内存中的数据,因此只能通过数组引用变量来访问数组。2、1 数组元素即变量当程序需要多个类型相同的变量时,就可以考虑数组来保存这些数据。无论是哪种类型的数组,其数组元素其实相当于一个普通变量。当通过索引来使用数组元素时,将该数组元素当成普通变量使用即可。import jav原创 2017-04-05 21:45:10 · 567 阅读 · 0 评论 -
对象及内存管理——实例变量与类变量
引言 Java内存管理分为:内存分配和内存回收。内存分配指的是创建Java对象时Java虚拟机为该对象在堆内存中所分配的内存空间;内存回收指的是当Java对象失去引用时,Java虚拟机会认为该对象为垃圾并自动清理该对象,最后回收该对象所占用的内存空间。1、实例变量与类变量 Java中局部变量可以分为以下三类形参:在方法签名中定义的局部变量,由调用方原创 2017-04-06 10:45:09 · 474 阅读 · 0 评论 -
对象及内存管理——父类构造器
2、 父类构造器 当创建任何Java对象时,程序总会先依次调用每个父类的非静态初始化块、构造器(总是从Object类开始)执行初始化,然后才调用本类的非静态初始化块、构造器执行初始化过程。2、1 隐式调用与显示调用 当调用某个类的构造器来创建Java对象时,系统总会先调用父类的费静态初始化块进行初始化。这个调用时隐式执行,而且父类的静态初始化块总是会被执原创 2017-04-07 11:16:14 · 364 阅读 · 0 评论 -
重写equals方法的建议
在Objdect类中,equals方法用于检测两个对象是否具有相同的引用。因此equals方法也常常被各种类重写,下面给出一些重写equals方法的建议:1)将参数命名为otherObject。2)比较this和otherObject是否引用同一个对象:if(this == otherObject) return true;3)比较otherObject是否为null,如果...原创 2018-12-25 13:40:26 · 174 阅读 · 0 评论 -
对象及内存管理——final修饰符
4、final修饰符final可以修饰变量,被final修饰的变量被赋值之后,不能重新赋值final可以修饰方法,被final修饰的方法不能被重写final可以修饰类,被final修饰的类不能派生子类4、1 final修饰变量 被final修饰的实例变量必须显示指定初始值,而且只能在如下三个位置指定初始值。定义final实例变量时指定初始值。非静原创 2017-04-09 19:24:40 · 436 阅读 · 0 评论 -
对象及内存管理——父类与子类实例的内存控制
3、父类与子类实例的内存控制 继承是面向对象的三大特征之一,也是Java语言的重要特性,而父子继承关系是Java编程中需要重点注意的地方。3、1 继承成员变量和继承方法的区别class Base { int count = 2; public void display() { System.out.println(this.count); }原创 2017-04-08 23:05:12 · 653 阅读 · 0 评论 -
数组及其内存管理——数组初始化
1、 数组初始化如果程序需要多个类型相同的变量时,就可以考虑定义一个数组。Java语言的数组变量时引用类型的变量,因此具有Java引用变量的特性。1、1 Java数组静态特性Java语言是典型的静态语言,因此Java数组是静态的,即当数组被初始化之后,其所占的内存空间、数组长度均是不可变的。Java程序中的数组必须经过初始化后才能够使用,所谓初始化,即创建实际的数组对象,也就是在内存中原创 2017-04-05 11:31:11 · 588 阅读 · 0 评论 -
面向对象的陷阱——非静态内部类的陷阱
3、非静态内部类的陷阱 内部类是Java提供的一个常用语法。内部类能提供更好的封装,而且它可以直接访问外部类的private成员,因此在一个特殊场合下更常用。3、1 非静态内部类的构造器public class Outer { public static void main(String[] args) throws Exception { new Outer().t原创 2017-05-02 19:48:05 · 484 阅读 · 0 评论 -
面向对象的陷阱——native方法的陷阱
4、native方法的陷阱 在Java方法定义中有一类特殊的方法:native方法。对于native方法而言,Java程序不会为该方法提供实现体。public class NativeTest { public native void info();} 使用native修饰的方法就像一个“抽象方法”,只有方法签名,没有方法体。从这个意义上来说,native关键字原创 2017-05-02 20:46:56 · 370 阅读 · 0 评论 -
Java的内存回收——Java的内存泄漏
2、Java的内存泄漏 什么是内存泄漏呢?程序运行过程中会不断分配内存空间,那些不再使用的内存空间应该即时被回收,从而保证系统可以再次使用这些内存空间,如果存在无用的内存没有被回收回来,那就是内存泄漏。 对于Java程序来说,所有不可达的对象都由垃圾回收机制负责回收,因此程序员不需要考虑这部分的内存泄漏。但如果程序中有一些Java对象,它们处于可达状态,但程序以后永原创 2017-04-20 16:29:48 · 370 阅读 · 0 评论 -
面向对象的陷阱——构造器的陷阱
2、构造器的陷阱 构造器是Java每个类都会提供的一个“特殊方法”。构造器负责对Java对象执行初始化操作,不管是定义实例变量时指定的初始值,还是在非静态初始化块中所执行的操作,实际上都会被提取到构造器中来执行。2、1 构造器返回类型 构造器不能声明返回值类型,也不能使用void声明构造器没有返回值。当为构造器声明添加任何返回值类型声明,或者添加void声明该构原创 2017-04-28 16:35:04 · 437 阅读 · 0 评论 -
算法——回朔法简介
回溯法简介及示例 回溯法是递归算法的一种特殊形式,回溯法的基本思想是:对一个包括很多结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法。当搜索到某个结点、发现无法再继续搜索下去时,就让搜索过程回溯(即退回)到该节点的前一个结点,继续搜索这个节点的其他尚未搜索的分支;如果发现这个节点也无法再继续搜索下去时,就让搜索过程回溯到这个结点的前一个结点继续这样的搜索原创 2017-05-12 11:31:04 · 1672 阅读 · 0 评论 -
Java表达式的陷阱——表达式类型的陷阱
2、表达式类型的陷阱 Java是一门强类型语言,不仅每个变量具有指定的数据类型,它的表达式也具有指定的数据类型。因此,使用表达式一定要注意它的数据类型。提示:强类型语言,通常具有以下两个基本特征。所有的变量必须先声明,然后才能使用,声明变量时必须指定该变量的数据类型。一旦某个变量的数据类型确定下来,那么这个变量将永远只能接受该类型的值,不能接受其他类型的值。2、原创 2017-04-23 16:44:29 · 508 阅读 · 0 评论 -
Java的内存回收——内存管理小技巧
4、内存管理小技巧4、1 尽量使用直接量 当需要使用字符串,还有Byte、Short、Integer、Long、Float、Double、Boolean、Character包装类的实例时,程序不应该采用new的方式来创建对象,而应该直接采用直接量来创建它们。 例如,程序需要"hello"字符串,应该采用如下代码: String str = "hell原创 2017-04-21 12:14:31 · 1056 阅读 · 0 评论 -
Java的内存回收——Java引用的种类
1、Java引用的种类 Java是面向对象的编程语言,一个Java程序往往需要创建大量的Java类,然后对各Java类创建大量的Java对象,再调用这些Java对象的属性和方法来操作它们。 程序员需要通过关键字new创建Java对象,既可以视作为Java对象申请内存空间,JVM会在堆内存中为每个对象分配空间;当一个Java对象失去引用时,JVM的垃圾回收机制会自动清原创 2017-04-19 10:38:53 · 533 阅读 · 0 评论 -
Java表达式的陷阱——输入法、注释字符和转义字符的陷阱
3、输入法、注释字符和转义字符的陷阱3、1 输入法导致的陷阱 对于Java语言而言,它使用空格、Tab制表符(半角状态)作为分隔符,因此一个Java程序中通常需要包含大量空格。但如果不小心把输入法切换到全角状态,那么输入的空格都会变成全角状态,编译该程序时将会提示"非法字符:\12288"的错误。注意:Java程序中通常不能包含全角字符,但Java程序的字符串和注释中完原创 2017-04-24 10:44:31 · 766 阅读 · 0 评论 -
Java的内存回收——垃圾回收机制
3、垃圾回收机制 垃圾回收机制主要完成以下两件事情。跟踪并监控每个Java对象,当某个对象处于不可达状态时,回收该对象所占用的内存空间。清理内存分配、回收过程中产生的内存碎片。 垃圾回收机制需要完成的这两方面工作工作量都不小,所以垃圾回收算法就成为了限制Java程序运行效率的重要因素。实现高效JVM的一个重要方面就是提供高效的垃圾回收机制,高效的垃圾回收原创 2017-04-20 18:39:29 · 448 阅读 · 0 评论 -
Java表达式的陷阱——泛型引起的错误
4、泛型引起的错误 泛型是Java5新增的知识点,它允许在使用Java类、调用方法时传入一个类型参数,这样就可以让Java类、调用方法动态地改变类型。4、1 原始类型变量的赋值 在严格的泛型程序中,使用带泛型声明的类时应该总是为止指定类型实参,但为了与之前版本Java代码保持一致,Java也允许使用带泛型声明的类时不指定类型参数。如果使用带泛型声明的类时没有传原创 2017-04-24 19:23:41 · 2837 阅读 · 0 评论 -
常见Java集合实现细节——ArrayList和LinkedList
3、ArrayList和LinkedList 在List集合的实现类中,主要有三个实现类:ArrayList、Vector、LinkedList。其中Vector还有一个Stack子类,这个Stack子类仅在Vector父类的基础之上增加了五个方法,这五个方法使得Vector扩展成为Stack。原创 2017-04-16 23:55:43 · 673 阅读 · 0 评论 -
Java表达式的陷阱——正则表达式的陷阱
5、正则表达式的陷阱public class StringSplit { public static void main(String[] args) { String str = "java.is.funny.hello.world"; String[] strArr = str.split("."); for ( String s : strArr ) { System原创 2017-04-24 21:29:23 · 507 阅读 · 0 评论 -
面向对象的陷阱——instanceof运算符的陷阱
1、instanceof运算符的陷阱 instanceof是一个非常简单的运算符。instanceof运算符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类(也可以是接口,可以把接口理解成一种特殊的类),它用于判断前面的对象是否是后面的类或其子类、实现类的实例。如果是,则返回true;否则,返回false。 根据Java语言规范,使用instance原创 2017-04-26 17:31:07 · 650 阅读 · 0 评论