`
abcxo
  • 浏览: 32310 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

thinking in java 学习笔记2

阅读更多

 

 

我想了挺久,觉得还是需要写一下笔记,在java中,有许多基础知识是非常重要的,希望志同道合的同志能够一起交流,我的qq是282325694,欢迎讨论,好吧,其实thinking in java这本书我个人不推荐刚入门的同志看,因为里面的内容还是挺需要深究的,比如说里面的一些设计模式或者面向对象的东西,可能初学者认为这很麻烦,但是作者的功力的确深厚,好吧,我看见这么厚的一本书,我泪崩了,不过没关系,努力学。。。绪论我们就不谈了,第一章,我个人还是觉得最后再详看。这样效果好像比较好,我们从第二章开始...

 



第二章 一切都是对象(everything is an object)


这一章介绍了java的基础知识


注:类是对某种具有相同特性的事物的抽象,对象就是类的实例化(实例和对象的意思是一样的,叫法不同而已),例如动物-狗


.用引用操纵对象


在c++里面是用指针的,而java取消了这个,为什么呢,我个人的看法是指针危险,容易内存溢出,
那么引用和指针的区别是什么呢,


1.我觉得引用和指针是同一个东西,不过java把指针封装或者限制修改了一下,是引用失去了一些指针的功能,例如不能相加等操作,当然带来的好处也是很多的,使引用更加适合java语言,引用必须初始化,指针可以不用,但是引用有时候会发生一些常见的错误,就是空指针异常,因为null,没有指向任何对象,你若要去其长度什么的,肯定就会错误啦..
java的引用是放在堆栈的,提高了速度,而new的对象是放在堆的,提高了灵活性,但是速度减弱..

 


.关于String对象


1.String的对象可以放在两个地方,第一个就是堆栈,和普通变量一样,第二个就是堆heap
String str=“hello”,这个是放在堆栈,因为这是放在常量池里面,注:常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。
而String str=new String(hello);在编译期不能确定,故放在堆;
.每一种基本类型都有相应的包装类, 注:char类型为2字节,为了兼容unicode
对于int ,float等基本类型,对于的有包装类Integer Float,为什么要有包装类,首先java是面向对象的,一切结束对象的思想,对于这些基本类型,一个实际的作用是在作为参数时,若不能满足对象的参数条件,可以包装类包装,这就有很大的好处了,java se5及以上提供了自动装箱,自动拆箱.
有两个重要的高精度类,就是BigInteger与BigDecimal,他们无对应的基本类型,关于具体用法可以百度..


.java 数组(以后章节详细讲)


.对象作用域


c++运行重复定义变量,但是java不允许,因为这会导致程序混乱
java对象的作用域在{}之间,出了这个范围就无法使用了
对于java对象,不需要手动销毁,因为java有提供垃圾回收器(以后详解),c++经常容易内存泄露
.类的创建,与c++的类似
注:类的成员变量,可不用手动初始化,java会自动初始化,及全部位置为0,boolean b,b的值为false
局部变量必须初始化,否则会报错,c++会得到任意值,
方法签名是指:方法名与参数列表
int x=a.f(); 这种调用方法的行为被称为发送消息给对象,消息是f(),对象是a;

.static关键字
只有一份存储空间,可以直接类引用,static的作用常用来扮演牧羊人的角色.管理一些实例群

这一章需要注意的一些内容就这么多,其他的概念就是一些只需要记住的一些常识,例如注释与嵌入式文档
我们平时用的有//  ,/*这两种, 而java提供了一种工具方便我们编写文档,javadoc,具体用法可以百度,
语法就是/**     */这样,还有一个常用的@注释,也可以用html标签,我个人偏向于@标签,@author
注:javadoc只为public 和protected进行文档注释,private若想要,可用-private

 

 

.编程风格java,类名首字母大写,若几个单词,不需要用下划线,单词首字母大写,例如 class AllTheMan

这种风格叫做驼峰风格,变量方法,均采用,不过首字母小写,其他单词字母大写,int actorName;

 

注:java的编译过程与性能优化,引用网络资源 http://developer.51cto.com/art/201107/277718.htm

 

对于服务器端的应用程序,由于不大涉及到界面设计和程序的频繁重启,Java的性能问题看似不大明显,从而一些Java的技术,如JSP,Servlet,EJB等在服务器端编程方面得到了很大的应用,但实际上,Java的性能问题在服务器端依然存在。下面来讨论Java的性能和执行效率。

一.关于性能的基本知识

1.性能的定义

在我们讨论怎样提高Java的性能之前,我们需要明白“性能“的真正含义。我们一般定义如下五个方面作为评判性能的标准。

1) 运算的性能----哪一个算法的执行性能最好

2) 内存的分配----程序需要分配多少内存,运行时的效率和性能最高。

3) 启动的时间----程序启动需要多少时间。

4) 程序的可伸缩性-----程序在用户负载过重的情况下的表现。

5) 性能的认识------用户怎样才能认识到程序的性能。

对于不同的应用程序,对性能的要求也不同。例如,大部分的应用程序在启动时需要较长的时间,从而对启动时间的要求有所降低;服务器端的应用程序通常都分配有较大的内存空间,所以对内存的要求也有所降低。但是,这并不是所这两方面的性能可以被忽略。其次,算法的性能对于那些把商务逻辑运用到事务性操作的应用程序来讲非常重要。总的来讲,对应用程序的要求将决定对各个性能的优先级。

2.怎样才能提高JAVA的性能

提高JAVA的性能,一般考虑如下的四个主要方面:

(1) 程序设计的方法和模式

一个良好的设计能提高程序的性能,这一点不仅适用于JAVA,也适用也任何的编程语言。因为它充分利用了各种资源,如内存,CPU,高速缓存,对象缓冲池及多线程,从而设计出高性能和可伸缩性强的系统。

当然,为了提高程序的性能而改变原来的设计是比较困难的,但是,程序性能的重要性常常要高于设计上带来的变化。因此,在编程开始之前就应该有一个好的设计模型和方法。

(2) JAVA布署的环境。

JAVA布署的环境就是指用来解释和执行JAVA字节码的技术,一般有如下五种。即解释指令技术(Interpreter Technology),及时编译的技术(Just In Time Compilier Technology), 适应性优化技术(Adaptive Optimization Technology), 动态优化,提前编译为机器码的技术(Dynamic Optimization,Ahead Of Time Technology)和编译为机器码的技术(Translator Technology). 
这些技术一般都通过优化线程模型,调整堆和栈的大小来优化JAVA的性能。

在考虑提高JAVA的性能时,首先要找到影响JAVA性能的瓶颈(BottleNecks),在确认了设计的合理性后,应该调整JAVA布署的环境,通过改变一些参数来提高JAVA应用程序的性能。

(3) JAVA应用程序的实现

当讨论应用程序的性能问题时,大多数的程序员都会考虑程序的代码,这当然是对的,当更重要的是要找到影响程序性能的瓶颈代码。为了找到这些瓶颈代码,我们一般会使用一些辅助的工具,如Jprobe,Optimizit,Vtune以及一些分析的工具如TowerJ Performance等。这些辅助的工具能跟踪应用程序中执行每个函数或方法所消耗掉的时间,从而改善程序的性能。

(4) 硬件和操作系统

为了提高JAVA应用程序的性能,而采用跟快的CPU和更多的内存,并认为这是提高程序性能的唯一方法,但事实并非如此。实践经验和事实证明,只有遭到了应用程序性能的瓶颈,从而采取适当得方法,如设计模式,布署的环境,操作系统的调整,才是最有效的。

3.程序中通常的性能瓶颈。

所有的应用程序都存在性能瓶颈,为了提高应用程序的性能,就要尽可能的减少程序的瓶颈。以下是在JAVA程序中经常存在的性能瓶颈。

了解了这些瓶颈后,就可以有针对性的减少这些瓶颈,从而提高JAVA应用程序的性能

4. 提高JAVA程序性能的步骤

为了提高JAVA程序的性能,需要遵循如下的六个步骤。

a) 明确对性能的具体要求

在实施一个项目之前,必须要明确该项目对于程序性能的具体要求,如:这个应用程序要支持5000个并发的用户,并且响应时间要在5秒钟之内。但同时也要明白对于性能的要求不应该同对程序的其他要求冲突。

b) 了解当前程序的性能

你应该了解你的应用程序的性能同项目所要求性能之间的差距。通常的指标是单位时间内的处理数和响应时间,有时还会比较CPU和内存的利用率。

c) 找到程序的性能瓶颈

为了发现程序中的性能瓶颈,通常会使用一些分析工具,如:TowerJ Application Performance Analyzer或VTune来察看和分析程序堆栈中各个元素的消耗时间,从而正确的找到并改正引起性能降低的瓶颈代码,从而提高程序的性能。这些工具还能发现诸如过多的异常处理,垃圾回收等潜在的问题。

d) 采取适当的措施来提高性能

找到了引起程序性能降低的瓶颈代码后,我们就可以用前面介绍过的提高性能的四个方面,即设计模式,JAVA代码的实现,布署JAVA的环境和操作系统来提高应用程序的性能。具体内容将在下面的内容中作详细说明。

e) 只进行某一方面的修改来提高性能

一次只改变可能引起性能降低的某一方面,然后观察程序的性能是否有所提高,而不应该一次改变多个方面,因为这样你将不知道到底哪个方面的改变提高了程序的性能,哪个方面没有,即不能知道程序瓶颈在哪。 
f) 返回到步骤c,继续作类似的工作,一直达到要求的性能为止。

二. JAVA布署的环境和编译技术

开发JAVA应用程序时,首先把JAVA的源程序编译为与平台无关的字节码。这些字节码就可以被各种基于JVM的技术所执行。这些技术主要分为两个大类。即基于解释的技术和基于提前编译为本地码的技术。
具体可分为如下的五类:

a) 解释指令技术

其结构图和执行过程如下:

JAVA的编译器首先把JAVA源文件编译为字节码。这些字节码对于JAVA虚拟机(JVM)来讲就是机器的指令码。然后,JAVA的解释器不断的循环取出字节码进行解释并执行。

这样做的优点是可以实现JAVA语言的跨平台,同时生成的字节码也比较紧凑。JAVA的一些优点,如安全性,动态性都得保持;但缺点是省生成的字节码没有经过什么优化,同全部编译好的本地码相比,速度比较慢。

b) 及时编译技术(Just In Time)

及时编译技术是为了解决指令解释技术效率比较低,速度比较慢的情况下提出的。

其主要变化是在JAVA程序执行之前,又JIT编译器把JAVA的字节码编译为机器码。从而在程序运行时直接执行机器码,而不用对字节码进行解释。同时对代码也进行了部分的优化。

这样做的优点是大大提高了JAVA程序的性能。同时,由于编译的结果并不在程序运行间保存,因此也节约了存储空间了加载程序的时间;缺点是由于JIT编译器对所有的代码都想优化,因此也浪费了很多的时间。

IBM和SUN公司都提供了相关的JIT产品。

c) 适应性优化技术(Adaptive Optimization Technology)

同JIT技术相比,适应性优化技术并不对所有的字节码进行优化。它会跟踪程序运行的成个过程,从而发现需要优化的代码,对代码进行动态的优化。对优化的代码,采取80/20的策略。从理论上讲,程序运行的时间越长,代码就越优化。其结构图如下: 
其优点是适应性优化技术充分利用了程序执行时的信息,发行程序的性能瓶颈,从而提高程序的性能;其缺点是在进行优化时可能会选择不当,发而降低了程序的性能。

其主要产品又IBM,SUN的HotSpot.

d) 动态优化,提前编译为机器码的技术(Dynamic Optimization,Ahead Of Time)

动态优化技术充分利用了JAVA源码编译,字节码编译,动态编译和静态编译的技术。其输入时JAVA的原码或字节码,而输出是经过高度优化的可执行代码和个来动态库的混合(Window中是DLL文件,UNIX中是共享库.a .so文件)。

其优点是能大大提高程序的性能;缺点是破坏了JAVA的可移植性,也对JAVA的安全带来了一定的隐患。

其主要产品是TowerJ3.0. 

 

 

 

通过使用一些前面介绍过的辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。

下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。

1.对象的生成和大小的调整。

JAVA程序设计中一个普遍的问题就是没有好好的利用JAVA语言本身提供的函数,从而常常会生成大量的对象(或实例)。由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。

例1:关于String ,StringBuffer,+和append

JAVA语言提供了对于String类型变量的操作。但如果使用不当,会给程序的性能带来影响。如下面的语句:

  1. String name=new String(“HuangWeiFeng”);   
  2. System.out.println(name+”is my name”);  

 

看似已经很精简了,其实并非如此。为了生成二进制的代码,要进行如下的步骤和操作。

(1) 生成新的字符串 new String(STR_1);

(2) 复制该字符串。

(3) 加载字符串常量”HuangWeiFeng”(STR_2);

(4) 调用字符串的构架器(Constructor);

(5) 保存该字符串到数组中(从位置0开始)

(6) 从java.io.PrintStream类中得到静态的out变量

(7) 生成新的字符串缓冲变量new StringBuffer(STR_BUF_1);

(8) 复制该字符串缓冲变量

(9) 调用字符串缓冲的构架器(Constructor);

(10) 保存该字符串缓冲到数组中(从位置1开始)

(11) 以STR_1为参数,调用字符串缓冲(StringBuffer)类中的append方法。

(12) 加载字符串常量”is my name”(STR_3);

(13) 以STR_3为参数,调用字符串缓冲(StringBuffer)类中的append方法。

(14) 对于STR_BUF_1执行toString命令。

(15) 调用out变量中的println方法,输出结果。

由此可以看出,这两行简单的代码,就生成了STR_1,STR_2,STR_3,STR_4和STR_BUF_1五个对象变量。这些生成的类的实例一般都存放在堆中。堆要对所有类的超类,类的实例进行初始化,同时还要调用类极其每个超类的构架器。而这些操作都是非常消耗系统资源的。因此,对对象的生成进行限制,是完全有必要的。

经修改,上面的代码可以用如下的代码来替换。

  1. StringBuffer name=new StringBuffer(“HuangWeiFeng”);   
  2. System.out.println(name.append(“is my name.”).toString());  

 

系统将进行如下的操作。

(1) 生成新的字符串缓冲变量new StringBuffer(STR_BUF_1);

(2) 复制该字符串缓冲变量

(3) 加载字符串常量”HuangWeiFeng”(STR_1);

(4) 调用字符串缓冲的构架器(Constructor);

(5) 保存该字符串缓冲到数组中(从位置1开始)

(6) 从java.io.PrintStream类中得到静态的out变量

(7) 加载STR_BUF_1;

(8) 加载字符串常量”is my name”(STR_2);

(9) 以STR_2为参数,调用字符串缓冲(StringBuffer)实例中的append方法。

(10) 对于STR_BUF_1执行toString命令。(STR_3)

(11)调用out变量中的println方法,输出结果。

由此可以看出,经过改进后的代码只生成了四个对象变量:STR_1,STR_2,STR_3和STR_BUF_1.你可能觉得少生成一个对象不会对程序的性能有很大的提高。但下面的代码段2的执行速度将是代码段1的2倍。因为代码段1生成了八个对象,而代码段2只生成了四个对象。

代码段1:

  1. String name= new StringBuffer(“HuangWeiFeng”);   
  2. name+=”is my”;   
  3. name+=”name”;  

 

代码段2:

  1. StringBuffer name=new StringBuffer(“HuangWeiFeng”);   
  2. name.append(“is my”);   
  3. name.append(“name.”).toString();  

 

因此,充分的利用JAVA提供的库函数来优化程序,对提高JAVA程序的性能时非常重要的.其注意点主要有如下几方面;

(1) 尽可能的使用静态变量(Static Class Variables)

如果类中的变量不会随他的实例而变化,就可以定义为静态变量,从而使他所有的实例都共享这个变量。 
例:

  1. public class foo   
  2. {   
  3. SomeObject so=new SomeObject();   
  4. }  

 

就可以定义为:

  1. public class foo   
  2. {   
  3. static SomeObject so=new SomeObject();   
  4. }  

(2)不要对已生成的对象作过多的改变。

对于一些类(如:String类)来讲,宁愿在重新生成一个新的对象实例,而不应该修改已经生成的对象实例。

例:

  1. String name=”Huang”;   
  2. name=”Wei”;   
  3. name=”Feng”;  

 

上述代码生成了三个String类型的对象实例。而前两个马上就需要系统进行垃圾回收处理。如果要对字符串进行连接的操作,性能将得更差。因为系统将不得为此生成更多得临时变量。如上例1所示。

(3) 生成对象时,要分配给它合理的空间和大小

JAVA中的很多类都有它的默认的空间分配大小。对于StringBuffer类来讲,默认的分配空间大小是16个字符。如果在程序中使用StringBuffer的空间大小不是16个字符,那么就必须进行正确的初始化。

(4) 避免生成不太使用或生命周期短的对象或变量。

对于这种情况,因该定义一个对象缓冲池。以为管理一个对象缓冲池的开销要比频繁的生成和回收对象的开销小的多。

(5) 只在对象作用范围内进行初始化。

JAVA允许在代码的任何地方定义和初始化对象。这样,就可以只在对象作用的范围内进行初始化。从而节约系统的开销。

例:

  1. SomeObject so=new SomeObject();   
  2. If(x==1) then   
  3. {   
  4. Foo=so.getXX();   
  5. }   
  6. 可以修改为:   
  7. if(x==1) then   
  8. {   
  9. SomeObject so=new SomeObject();   
  10. Foo=so.getXX();   
  11. }  

2.异常(Exceptions)

JAVA语言中提供了try/catch来发方便用户捕捉异常,进行异常的处理。但是如果使用不当,也会给JAVA程序的性能带来影响。因此,要注意以下两点。

(1) 避免对应用程序的逻辑使用try/catch

如果可以用if,while等逻辑语句来处理,那么就尽可能的不用try/catch语句

(2) 重用异常

在必须要进行异常的处理时,要尽可能的重用已经存在的异常对象。以为在异常的处理中,生成一个异常对象要消耗掉大部分的时间。

3. 线程(Threading)

一个高性能的应用程序中一般都会用到线程。因为线程能充分利用系统的资源。在其他线程因为等待硬盘或网络读写而 时,程序能继续处理和运行。但是对线程运用不当,也会影响程序的性能。

例2:正确使用Vector类

Vector主要用来保存各种类型的对象(包括相同类型和不同类型的对象)。但是在一些情况下使用会给程序带来性能上的影响。这主要是由Vector类的两个特点所决定的。第一,Vector提供了线程的安全保护功能。即使Vector类中的许多方法同步。但是如果你已经确认你的应用程序是单线程,这些方法的同步就完全不必要了。第二,在Vector查找存储的各种对象时,常常要花很多的时间进行类型的匹配。而当这些对象都是同一类型时,这些匹配就完全不必要了。因此,有必要设计一个单线程的,保存特定类型对象的类或集合来替代Vector类.用来替换的程序如下(StringVector.java):

  1. public class StringVector   
  2. {   
  3. private String [] data;   
  4. private int count;   
  5. public StringVector() { this(10); // default size is 10 }   
  6. public StringVector(int initialSize)   
  7. {   
  8. data = new String[initialSize];   
  9. }   
  10. public void add(String str)   
  11. {   
  12. // ignore null strings   
  13. if(str == null) { return; }   
  14. ensureCapacity(count + 1);   
  15. data[count++] = str;   
  16. }   
  17.  
  18. private void ensureCapacity(int minCapacity)   
  19. {   
  20. int oldCapacity = data.length;   
  21. if (minCapacity > oldCapacity)   
  22. {   
  23. String oldData[] = data;   
  24. int newCapacity = oldCapacity * 2;   
  25. data = new String[newCapacity];   
  26. System.arraycopy(oldData, 0, data, 0, count);   
  27. }   
  28. }   
  29. public void remove(String str)   
  30. {   
  31. if(str == null) { return // ignore null str }   
  32. for(int i = 0; i < count; i++)   
  33. {   
  34. // check for a match   
  35. if(data[i].equals(str))   
  36. {   
  37. System.arraycopy(data,i+1,data,i,count-1); // copy data   
  38. // allow previously valid array element be gc'd   
  39. data[--count] = null;   
  40. return;   
  41. }   
  42. }   
  43. }   
  44. public final String getStringAt(int index) {   
  45. if(index < 0) { return null; }   
  46. else if(index > count)   
  47. {   
  48. return null// index is > # strings   
  49. }   
  50. else { return data[index]; // index is good }   
  51. }   
  52. /* * * * * * * * * * * * * * * *StringVector.java * * * * * * * * * * * * * * * * */   
  53. 因此,代码:   
  54. Vector Strings=new Vecto 

 

希望通过本文的介绍,能能对你有帮助。

 

 

java美女第一期

1

 

分享到:
评论
2 楼 jay.zhong 2012-04-08  
师兄威武!
1 楼 wangen2009 2012-04-04  

相关推荐

    Thinking in Java 自学笔记——第二章 一切皆对象

    Thinking in Java 自学笔记——第二章 一切皆对象 个人原创,不喜勿喷。

    Thinking in java学习笔记

    这是我经过半年的认真研读《thinking in java》这本书的读书笔记,涉及到从容器一章开始的所有后续章节的内容,只有把握我笔记中的内容我想你就差不多弄懂了&lt;thinking in java&gt;这本书的精华

    Thinking In java学习笔记

    这是我看Thinking in java 做的笔记,和大家分享下,如有不明白的的地方可与我私信,或者直接问度娘。

    Java学习笔记.pdf

    我的学习笔记的书本课程来自于:《Thinking in Java》和《Head First Java》 视频课程主要来自于:廖雪峰老师《Java 基础课程》 如涉及版权侵犯请联系我更正。 初来乍到,文笔稚嫩,学识浅薄,请多指教。

    java基础补足和thinking In Java学习.rar

    JAVA学习日记---Thinking in Java学习笔记 第5章总结 第五章 初始化与清理 5.1 用构造器确保初始化 1.构造器命名必须与类名相同 2.构造器也是方法,满足方法的各种特征,无参数的构造器称为默认构造器,默认构造...

    《Thinking+in+Java》读书笔记共38页.pd

    《Thinking+in+Java》读书笔记共38页.pdf.zip

    恒生电子JAVA笔试试题-Thinking-In-Java-Notes:ThinkinginJava学习笔记

    Java》学习笔记 [TOC] 阅读计划 章节列表 对象导论 一切都是对象 操作符 控制执行流程 初始化与清理 访问权限控制 复用类 多态 接口 内部类 持有对象 通过异常处理错误 字符串 类型信息 泛型 数组 容器深入研究 Java...

    Thinking in Java

    在学习java的适合看看!有学习笔记,经过整理的。

    Thinking_in_Java(第四版_).rar

    学习笔记

    java学习资料/笔记整理(二)

    java学习资料/笔记整理,含java语言入门中文版、JDK1.4.2手册、JSP由浅入深、Think In Java(中英文)、Thinking_in_Java_chinese_version、精通swing程序设计等8个编译的HTML帮助文档....

    windows10上安装mysql详细图文教程.pdf

    我的学习笔记的书本课程来自于:《Thinking in Java》和《Head First Java》 视频课程主要来自于:廖雪峰老师《Java 基础课程》 如涉及版权侵犯请联系我更正。 初来乍到,文笔稚嫩,学识浅薄,请多指教。

    java日常学习资料整理

    该资源包含了本人学习java时的笔记整理,还包含华为编程规范,以及thinking in java等多方面的学习资料,对于java从业者来说javaAPI文档以及经典书目必须要读,另外为了更具实践性还附了java实验指导书,希望对于...

    String学习笔记

    自己写的java学习笔记,有完整的体系结构,有思维导图帮助理解和记忆

    Tomcat安装、配置和部署笔记 - 辛伯达 - 博客园.pdf

    我的学习笔记的书本课程来自于:《Thinking in Java》和《Head First Java》 视频课程主要来自于:廖雪峰老师《Java 基础课程》 如涉及版权侵犯请联系我更正。 初来乍到,文笔稚嫩,学识浅薄,请多指教。

    5本java学习用书

    找了5本学习java的好书和一些例子代码和大家分享,希望能够对您能有所帮助。

    thinking-in-spring:春天学习笔记

    春天思考 春天学习笔记

    java软件笔试题-MyNotebook:我大学时期的笔记本

    2:设计模式与架构 part 3:编程语言 & 前端 & 机器学习 C++笔记 part 4: 数据结构与算法 part 5: 笔试/面试 part 6:专业基础 输入URL到页面加载完成的过程 part 7:读书笔记 thinking in java effective java ...

    thinking-in-spring:学春天

    春天学习笔记 Bean初始化 BeanDefinitionBuilder 新的GenericBeanDefinition Bean的命名(非强制性) BeanNameGenerator AnnotationBeanNameGenerator Bean的别名(一般XML配置) 别名 BeanDefinition的注册 ...

    java-study:JAVA示例,关于并发和缓存

    [目录]用法一个包含...Thinking in Java》一书的源代码书行动中的Java并发有效的Java(第二) Java 8实战用Java思考(第四)深度JVM Java网络编程博客笔记包和类的名称设法具有描述性,但可能违反了建议的名称样式。

Global site tag (gtag.js) - Google Analytics