
Java未分类
文章平均质量分 74
Java未分类
上了年纪的牛马
十几年开发经验,长期扎根于一线开发与系统架构设计,团队中的灵魂人物。
展开
-
Java 打印星号图案和数字图案
在 Java 中打印图案是一项常见的编程任务,尤其在初学阶段。通过以特定方式排列符号或数字,可以形成各种设计或形状。这些图案不仅有助于解决问题,还能培养算法思维能力。本文将讨论如何在 Java 中打印图案,并探索一些最常见的图案类型。原创 2024-11-12 19:57:37 · 855 阅读 · 0 评论 -
如何对 com.alibaba.fastjson.JSONObject 进行排序和逆序操作
当使用时,默认情况下它是基于HashMap实现的,这意味着键值对的顺序是不确定的。如果您需要确保键值对按照插入顺序保持一致,那么使用是一种有效的方法。以下代码示例,展示了如何创建一个基于的JSONObject这段代码首先导入了和。然后在main方法中创建了一个实例,并将其作为参数传递给JSONObject的构造函数。这样创建出来的JSONObject将会保留键值对的插入顺序。接着,通过put方法向JSONObject中添加键值对。最后,使用方法将JSONObject转换成字符串形式并打印出来。原创 2024-10-29 11:20:55 · 551 阅读 · 0 评论 -
关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
一、前言最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实...问题大致是这样的,“在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?”;我当时的想法:方法中的局部变量在运行的时候,是存在JAVA栈中的,方法运行结束,局部变量也就都弹光了,理论上单线程的话是不会有问题的,我之所以不知道,是因为不清楚在JAVA内存模型中,一个线程对应一个栈,还是...原创 2016-01-26 14:24:00 · 34 阅读 · 0 评论 -
共享资源访问
什么是共享资源先了解下JAVA程序在运行时内存的分布,由以下部分组成堆:所有线程共享一个堆;存放的都是new 出来的对象;方法区:所有线程共享一个方法区;里面存放的内容有点杂,可以认为是除堆和栈中的其它东西(如类信息,静态变量,常量,代码等);程序计数器:也叫PC,存放下一条指令所在单元的地址的地方;JAVA栈:每个线程都有一个自己的JAVA栈;存放的一般是方法的局部变量,方法出口信...原创 2016-03-24 19:35:00 · 35 阅读 · 0 评论 -
终结任务
线程状态新建状态线程被创建时,会短暂的处于这种状态。处于这种状态的线程已经分配了必须的系统资源,有资格获得cpu时间了,等待调度器把它转变为可运行状态或阻塞状态;就绪状态在这种状态下,只要调度器把时间片分配给线程,就可以马上运行;阻塞状态线程因为某个条件未满足,阻止了它的运行;这种状态会被调度器忽略,直到条件满足时,转为就绪状态;死亡状态线程运行结束或被中断后的状态;该状态不能被...原创 2016-03-27 13:38:00 · 34 阅读 · 0 评论 -
基本线程机制
基本线程机制一个程序可以被划分为多个独立的任务,每个独立的任务可以由线程来驱动执行;一个进程可以包含若干个线程,即拥有若干个并发执行的任务,在程序运行时,CPU时间被划分成片段分配给所有的线程;在单处理器的机器上使用多线程可以提高性能的原因在于任务阻塞;为机器增加处理器可以显著加快使用多线程程序的运行速度;使用线程机制使程序更加透明、可扩展,代码不需要知道它是运行在单处理器还是多处理器...原创 2016-03-23 11:11:00 · 72 阅读 · 0 评论 -
JAVA同步容器和并发容器
同步容器类同步容器类的创建在早期的JDK中,有两种现成的实现,Vector和Hashtable,可以直接new对象获取;在JDK1.2中,引入了同步封装类,可以由Collections.synchronizedXxxx等方法创建;同步容器类的问题同步容器类虽然都是线程安全的,但是在某些情况下(复合操作),仍然需要加锁来保护;常见复合操作如下:迭代:反复访问元素,直到遍历完全部元素...原创 2016-04-05 15:17:00 · 31 阅读 · 0 评论 -
jstack简单使用,定位死循环、线程阻塞、死锁等问题
当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的jstack工具去定位;废话不说,直接上例子吧,在window平台上的;死循环写个死循环的程序如下:package concurrency;public class Test { public static void main(String[] args) throws Interrup...原创 2016-04-11 10:48:00 · 71 阅读 · 0 评论 -
线程同步工具类
写在前面同步工具类主要包括闭锁(如CountDownLatch),栅栏(如CyclicBarrier),信号量(如Semaphore)和阻塞队列(如LinkedBlockingQueue)等;使用同步工具类可以协调线程的控制流;同步工具类封装了一些状态,这些状态决定线程是继续执行还是等待,此外同步工具类还提供了修改状态的方法;下面将简单介绍以上同步工具类;闭锁可以让一个线程等待一组事...原创 2016-04-06 11:45:00 · 36 阅读 · 0 评论 -
JAVA中的字符串小结
String字符串是只读的,不可变的查看String类的源码,可以发现String类是被final关键字修饰的;另外还可以看下String类源码中的其它方法实现,随便举个可以修改String值的方法,如字符串拼接方法concat(String str),返回的是一个全新的String对象,而不是在原有的String对象上做修改,代码如下: public String concat(...原创 2016-03-31 11:21:00 · 28 阅读 · 0 评论 -
类加载机制
什么是类加载器负责读取 Java 字节代码,并转换成java.lang.Class类的一个实例;类加载器与类的”相同“判断类加载器除了用于加载类外,还可用于确定类在Java虚拟机中的唯一性。即便是同样的字节代码,被不同的类加载器加载之后所得到的类,也是不同的。通俗一点来讲,要判断两个类是否“相同”,前提是这两个类必须被同一个类加载器加载,否则这个两个类不“相同”。这里指的“相同”,包括...原创 2016-04-15 09:54:00 · 34 阅读 · 0 评论 -
10个关于Java异常的常见问题
这篇文章总结了十个经常被问到的JAVA异常问题;1.检查型异常VS非检查型异常简单的说,检查型异常是指需要在方法中自己捕获异常处理或者声明抛出异常由调用者去捕获处理;非检查型异常指那些不能解决的异常,如除0,空指针等;检查型异常非常重要,因为你希望使用你API接口的人知道如何处理这些异常;举个例子,IOException是非常常见的检查型异常,RuntimeException是非检查型...原创 2016-05-12 14:26:00 · 32 阅读 · 0 评论 -
sun.misc.Unsafe的理解
前言以下sun.misc.Unsafe源码和demo基于jdk1.7;最近在看J.U.C里的源码,很多都用到了sun.misc.Unsafe这个类,一知半解,看起来总感觉有点不尽兴,所以打算对Unsafe的源码及使用做个分析;另外,网上找了份c++的源代码natUnsafe.cc(可惜比较老,Copyright (C) 2006, 2007年的,没找到新的),也就是sun.misc.Uns...原创 2016-04-14 17:09:00 · 32 阅读 · 0 评论 -
怎样高效判断数组中是否包含某个特定值
前言怎样判断一个无序数组是否包含某个特定值呢?这在JAVA中是一个非常实用的操作,在Stack Overflow问答网站中也同样是一个热门问题;要完成这个判断,可以通过若干种不同的方式来实现,每种实现方式对应的时间复杂读有很大的不同;接下来,我将展示四种不同的实现方式,以及这四种方式对应的时间开销。四种不同方式来检查数组是否包含某个值1、使用List: public sta...原创 2016-05-12 11:08:00 · 42 阅读 · 0 评论 -
JAVA中的注解小结
以下内容参考java编程思想-4,jdk版本为jdk5.0,有点老-_-|||什么是注解JAVA SE5引入,也称元数据,可以直接添加到代码中,用来完整描述程序所需的信息,而这些信息是无法用Java来表达的;内置注解jdk5.0中内置了三种标准注解和四种元注解;三种标准注解,定义在java.lang中:@Override //表示子类方法覆盖父类方法@Deprecated //已...原创 2016-03-28 15:24:00 · 31 阅读 · 0 评论 -
为什么成员属性不会被重写
本篇文章将展示一个基本的面向对象概念-属性隐藏。Java中的成员属性能被重写吗?让我们先看以下代码示例,创建了两个Sub对象,并将其引用分别赋给SUb类和其父类Super;package simplejava;class Super { String s = "Super";}class Sub extends Super { String s = "Sub";...原创 2016-05-12 15:27:00 · 31 阅读 · 0 评论 -
AtomicInteger源码注释
AtomicInteger源码在java.util.concurrent.atomic包下提供了大量的原子类,这里以AtomicInteger源码为例,添加了一些注释,个人理解,供参考;其中比较重要的一个概念是CAS操作,现代CPU已广泛支持,在JDK的AtomicInteger类中是调用了Unsafe类的compareAndSwapInt方法实现的,代码(jdk1.7.0_79)如下:...原创 2016-04-05 22:15:00 · 26 阅读 · 0 评论 -
字节流InputStream/OutputStream
字节流InputStream/OutputStream本篇将对JAVA I/O流中的字节流InputStream/OutputStream做个简单的概括:总得来说,每个字节流类都有一个对应的用途,如下:ByteArrayInputStream/ByteArrayOutputStream //字节数组相关FileInputStream/FileOutputStream...原创 2016-04-08 14:49:00 · 42 阅读 · 0 评论 -
字符输出流Writer简要概括
偷个懒,直接参考上篇字符输入流Reader的形式,其实Reader和Writer本来就大同小异;字符输出流Writer本篇将对JAVA I/O流中的字符输出流Writer做个简单的概括:总得来说,每个字符输出流类都有一个对应的用途,如下:字符输出流基类:Writer字节流转字符流:OutputStreamWriter //往字节输出流中写字符字符文件写入...原创 2016-04-07 23:46:00 · 34 阅读 · 0 评论 -
字符输入流Reader简要概括
字符输入流Reader组成结构本篇将对JAVA I/O流中的字符输入流Reader做个简单的概括:总得来说,每个字符输入流类都有一个对应的用途,如下:字符流基类:Reader字节流转字符流:InputStreamReader //读取字节输入流中的字符字符文件读取相关:FileReader //读取文件...原创 2016-04-07 17:40:00 · 31 阅读 · 0 评论 -
JAVA NIO中的Channels和Buffers
前言Channels和Buffers是JAVA NIO里面比较重要的两个概念,NIO正是基于Channels和Buffers进行数据操作,且数据总是从Channels读取到Buffers,或者从Buffers写入到Channels。通道(Channel)NIO中的通道与IO中的流类似,不过流是单向的,而通道是双向的。例如InputStream、OutputStream等都是单向的,一个流只...原创 2016-04-09 22:08:00 · 54 阅读 · 0 评论 -
JAVA中的枚举小结
枚举将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用;枚举基本特性以下代码是枚举的简单使用:使用values方法返回enum实例的数组使用ordinal方法返回每个enum实例的次序,从0开始使用compareTo方法比较两个enum实例使用==来比较enum实例使用getDeclaringClass方法返回enum实例所属的enum类使用valueOf方法根...原创 2016-03-29 22:42:00 · 26 阅读 · 0 评论 -
Java中的Atomic包
Atomic包的作用方便程序员在多线程环境下,无锁的进行原子操作Atomic包核心Atomic包里的类基本都是使用Unsafe实现的包装类,核心操作是CAS原子操作;关于CAScompare and swap,比较和替换技术,将预期值与当前变量的值比较(compare),如果相等则使用新值替换(swap)当前变量,否则不作操作;现代CPU已广泛支持CAS指令,如果不支持,那么JVM将...原创 2016-04-10 22:22:00 · 39 阅读 · 0 评论 -
Java字符串中常见的10个问题
下面是Java中10个最常见的关于字符串的问题。怎样比较字符串?使用==还是equals()简单的说,“==”用于判断引用是否相等,equals()用于判断值是否相等。除非你要比较两个字符串是否是同一个对象,否则你应该使用equals()方法。如果你知道字符串驻留的概念会更好。对于敏感信息优先使用字符数组而不是字符串字符串是不可变的,意味着一旦被创建,他们就会一直存在直到垃圾回收器回收它...原创 2016-05-17 23:36:00 · 33 阅读 · 0 评论 -
Java中静态类型检查是如何进行的
以下内容来自维基百科,关于静态类型检查和动态类型检查的解释:静态类型检查:基于程序的源代码来验证类型安全的过程;动态类型检查:在程序运行期间验证类型安全的过程;Java使用静态类型检查在编译期间分析程序,确保没有类型错误。基本的思想是不要让类型错误在运行期间发生。以下代码是一个例子,理解了他,你会更好的理解Java静态类型检查是如何工作的。代码示例假定我们有如下类,A和B,B继承...原创 2016-05-18 09:18:00 · 37 阅读 · 0 评论 -
面试问题-使用Java线程做数学运算
这是一个展示如何使用join()方法的例子。问题:使用Java多线程计算表达式1*2/(1+2)的值。解决方案:使用一个线程做加法运算,另一个线程做乘法运算,还有一个主线程main做除法运算。由于线程之间不需要通讯,所以我们只需要考虑线程的执行顺序。在main线程中,我们让加法运算线程和乘法运算线程join到主线程,join()方法的作用是使main方法等待,直到调用join的线程执行...原创 2016-05-18 09:36:00 · 34 阅读 · 0 评论 -
字符串是通过“引用”传递的
这是Java中一个很经典的问题,在stack-overflow上有很多类似的问题,然而很多回答都是错的或者回答不完整;如果你不深入思考的话,会认为这个问题很简单,但是当你深入下去,会发现这个问题很容易让人产生困惑。一段有趣且让人困惑的代码package simplejava;public class Q14 { public static void change(String...原创 2016-05-15 12:11:00 · 45 阅读 · 0 评论 -
Java成员的访问权限控制
Java中的访问权限控制包含两个部分:类的访问权限控制类成员的访问权限控制对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限);对于类成员来说,访问权限控制修饰符可以是public,protected, package private(无修饰符), or private。以下表格总结了类成员中不同访问权限控制修饰符对应的访问级别:注:这里的SubCl...原创 2016-05-13 09:14:00 · 34 阅读 · 0 评论 -
FileOutputStream VS FileWriter
当我们使用Java往文件写入数据的时候,我们有两种方式,使用FileOutputStream或FileWriter。FileOutputStream:File fout = new File(file_location_string);FileOutputStream fos = new FileOutputStream(fout);BufferedWriter out = new B...原创 2016-05-16 09:17:00 · 31 阅读 · 0 评论 -
关于JAVA中子类和父类的构造方法
本篇文章总结了一些关于Java构造方法的常见问题。为什么创建了一个子类对象会调用其父类的构造方法如下代码示例:package simplejava;class Super { String s; public Super() { System.out.println("Super"); }}class Sub extends Super ...原创 2016-05-12 16:35:00 · 44 阅读 · 0 评论 -
Java内存泄露简述
Java的一个最显著的优势是内存管理。你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收。然而,情况并不是这样简单,内存泄露还是经常会在Java应用程序中出现。本篇文章将介绍什么是内存泄露,为什么会发生,以及怎样阻止内存泄露。什么是内存泄露内存泄露的定义:对于应用程序来说,当对象已经不再被使用,但是Java的垃圾回收器不能回收它们的时候,就产生了内存泄露。...原创 2016-05-13 17:25:00 · 38 阅读 · 0 评论 -
深入理解“HelloWorld”小程序
对于每个Java程序员来说,HelloWorld是一个再熟悉不过的程序。它很简单,但是这段简单的代码能指引我们去深入理解一些复杂的概念。这篇文章,我将探索我们能从这段简单的代码中学到什么。如果你对HelloWorld有独到的理解,请留下你的评论。HelloWorld.javapublic class HelloWorld { /** * @param args ...原创 2016-05-17 20:22:00 · 60 阅读 · 0 评论 -
equals()和hashCode()之间的关系
在Java的基类java.lang.Object中有两个非常重要的方法:public boolean equals(Object obj)public int hashCode()对这两个方法的理解非常重要,特别是当用户自己定义对象,并将其存入到Map中的时候;然而,即便是高级开发人员,有时候也搞不清楚如何正确的使用它们;在这篇文章,我首先会展示一种常见的错误示例,然后解释如何正确...原创 2016-05-13 15:11:00 · 33 阅读 · 0 评论 -
【译】Java中的枚举
前言译文链接:http://www.programcreek.com/2014/01/java-enum-examples/Java中的枚举跟其它普通类很像,在其内部包含了一堆预先定义好的对象集合;下面是若干个关于枚举的例子,可以帮助我们更好的使用枚举类型;一个简单的例子package simplejava;enum Color { RED, YELLOW, BLUE; ...原创 2016-05-12 18:53:00 · 28 阅读 · 0 评论 -
HashSet vs TreeSet vs LinkedHashSet
使用Set集合的主要原因是因为Set集合里面没有重复的元素。Set集合有三个常见的实现类:HashSet,TreeSet,LinkedHashSet。什么时候,选择哪一个使用非常重要。简单的说,如果你关注性能,应该使用HashSet;如果你需要一个有序的Set集合,应该使用TreeSet;如果你需要一个Set集合保存了原始的元素插入顺序,应该使用LinkedHashSet。Set接口Set接...原创 2016-05-16 10:02:00 · 36 阅读 · 0 评论 -
Java编译器如何生成重载和覆盖方法代码
下面是一个很简单的例子,关于Java中的多态:方法重载和方法覆盖;多态指的是方法在不同的时刻表现出不同的形式;在编译期间,这被叫做方法重载;方法重载允许相关的方法被同一个方法名字调用,这有时候被叫做ad-hoc polymorphism;package simplejava;class A { public void M(int i) { System.out....原创 2016-05-14 22:48:00 · 39 阅读 · 0 评论 -
为什么Java中字符串是不可变的
前言在Java中,字符串是一个不可变的类,一个不可变的类指的是它的实例对象不能被修改,所有关于这个对象的信息在这个对象被创建时已初始化且不能被改变。不可变类有很多优势,这篇文章总结了字符串类之所以被设计成不可变类的原因,涉及内存模型,线程同步,数据结构等知识。字符串常量池的需求字符串常量池是方法区中的一块特别存储区域。当需要创建一个字符串时,如果它的值在字符串常量池中已存在,那么常量池中...原创 2016-05-18 10:20:00 · 44 阅读 · 0 评论 -
Java集合框架的接口和类层次关系结构图
Collection和Collections的区别首先要说的是,"Collection" 和 "Collections"是两个不同的概念;如下图所示,"Collection"是集合类(Collection)的顶级接口,然而”Collections“是一个提供了一系列静态方法的集合工具类;Collection的类层次结构图Map的类层次结构图总结代码示例package s...原创 2016-05-13 09:40:00 · 46 阅读 · 0 评论 -
Java Maps的9个常见问题
一般来说,Map是一种由键值对组成的数据结构,其中键(key)在Map中是不能重复的;本篇文章总结了9个最常见的问题(关于Java Map及其实现类);出于简单考虑,在代码例子中我将不使用泛型,因此,我将仅仅写上Map而不是写上Map<K, V>,且Map中的Key和Value都是可以比较的,意味着K和V都实现了Comparable接口;1.Map转List在Java中,Ma...原创 2016-05-13 13:53:00 · 50 阅读 · 0 评论 -
Java数组在内存中是如何存放的
Java中有两种类型的数组:基本数据类型数组;对象数组;当一个对象使用关键字“new”创建时,会在堆上分配内存空间,然后返回对象的引用,这对数组来说也是一样的,因为数组也是一个对象;一维数组int[] arr = new int[3];在以上代码中,arr变量存放了数组对象的引用;如果你创建了空间大小为10的整形数组,情况是一样的,一个数组对象所占的空间在堆上被分配,然后返回...原创 2016-05-13 16:03:00 · 33 阅读 · 0 评论