- 浏览: 17898 次
- 性别:
- 来自: 北京
文章列表
概述 : 了解虚拟机如何执行程序, 虚拟机怎样运行一个Class文件的概念模型, 可以更好的理解怎样写出优秀的代码
一 : 类文件结构
无关性基石: 《Java虚拟机规范》对class文件的定制的规范, 成为了JVM语言无关性的基石, 即只要满足规范, 不限制语言种类, 编译器能够将语言转换为满足虚拟机规范的的字节码文件即可, 实现语言无关性的基础是虚拟机和字节码的存储格式
JVM语言无关性
class文件结构 :
类型
名称
数量
含义
u4(代表4个字节的无符号数) ...
1.当前对象是否为垃圾(垃圾确认机制)
运行时区域中的程序计数器. 虚拟机栈, 本地方法栈都是随着线程而灭, 不需要过多考虑回收问题, 而且基本上内存大小的分配也都是编译器就已知的(暂不考虑JIT的优化)
堆和方法区是线程共 ...
对象的创建过程
1.当虚拟机遇到new指令时, 首先将去检查这个指令参数能否定位到常量池对应的类的符号引用, 并检查这个符号代表的类是否被加载验证解析过, 如果没有先执行上述过程
2.类加载检查通过后, 接下来虚拟机将为新生对象分配内存, 对象所需的内存大小在类加载完成后便可完全确定
3. 对象在堆中分配内存的方式分为两种, 指针碰撞和空闲列表, 取决于你采用的垃圾收集器的算法实现是否有内存碎片化情况出现, Serial和ParNew等带Compact过程的收集时, 采用的分配算法是指针碰撞, 而是用CMS这种基于Mark-Sweep算法的收集时, 通常采用空闲列表
4.由于堆中大部分 ...
java与C++之间有一堵内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里的人却想出来。 --摘自《深入理解Java虚拟机》
C++认为内存很重要,所以一定要给人管理,java同样认为内存很重要,所以一定不能给人管理。 --忘了哪看来的
计算机的世界中,所有问题都可以通过引入一个中间角色来解决(jvm就是典型)。
a.为什么做内存划分?
java进程下的占用的一块内存,划分成5个逻辑空间,对每一块做特定的处理数据方式和内存管理方式,会大大提升内存效率。
b.划分情况
上边提 ...
1.注解(Annotation):
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,如果没加则没有标记,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无标记,有什么标记,就去干相应的事.标记可以加在包,类,字段,方法,方法的参数以及局部变量上,看java.lang包,可看到JDK中提供的最基本的annotation.
三种基本注解:
@SuppressWarnings("deprecation")
@Deprecated
@Override
public class AnnotationTest {
...
1.完数
如果一个数恰好等于其因子之和,这个数就称为完数.
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
求10000以内的所有完数的过程:
(1)用n去除以1-n之间的所有整数,将能整除的被除数累加.
(2)最后判断个因子之和是否等于数n,若相等,则数n为完数,输出该数和各个因子.
public static void main(String[] args) {
int i, j, sum;
sum = 0;
for (i = 1; i <= 1000; i++) {
for (j = 1; j < i; j ...
简单查找:
顺序查找:
从线性表的一端开始,依次将每个记录的关键字与给定值进行比较,若某个记录的关键字等于给定值,表示查找成功,返回记录序号;若将线性表中所有记录都比较完,扔未找到关键字与给定值相等的记录,则表示查找失败,返回 一个失败值.
public class QuerySearch {
public static int[] Data = { 65, 21, 92, 11, 55, 42, 89, 8, 5, 9, 81, 33, 28, 89, 90, 28, 122, 76, 30, 7 };
public static int COU ...
排序概念:
1.内部排序:
工具类中定义交换数组元素、生成数据源等方法(用于下面的排序):
import java.util.Random;
public class SortUtil {
// 通过数组下标交换元素位置
public static void swap(int[] data, int i, int j) {
int tem ...
一、线性结构
1.最简单的结构:线性表
线性表具有以下特征:
- 有且只有一个"首元素";
- 有且只有一个"末元素";
- 除末元素之外,其余元素均有唯一的后继元素;
- 除首元素之外,其余元素均有唯一的前去元素;
对于线性表主要可进行以下操作:
- 添加节点 - 插入节点 - 删除节点 - 查找节点 - 遍历节点 - 统计节点数
2.先进先出的结构:队列
队列是一种特殊的线性表,队列是按照"先进先出"(First In First ...
回溯算法(又叫试探算法)
为了求得问题的解,先选择某一种可能情况进行试探,在试探过程中,一旦发现原来的选择的假设情况是错误的,就退回一步重新选择,继续向前试探,如此反复进行,直至得到解或者证明无解.
实例:生成彩票号码组合.
假设有一种彩票,每注由7个1-29的数字组成,且这7个数字不能相同,编写程序生成所有的号码组合.
Java代码描述:
public class Test {
public static int MAXN = 7; //设置每一组彩票的位数
public static int NUM = 29; //设置组成彩票的数字
p ...
贪婪算法基本思路:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能块地求得更好的解.当达到算法中的某一步不能再继续前进时,就停止算法,给出近似解.
-不能保证最后的解释最优的;
-不能用来求最大或者最小解的问题;
-只能求满足某些约束条件的可行解得范围.
实例:换零钱
Java代码描述
public class Test {
static int MAXN = 9;
static int[] parvalue = {10000,5000,1000,500,200,100,50,20,10};
static int[] num = ne ...
class StringDemo{
public static void main(String[] args){
/*
String s=new String();
String s="";
//以上两句话均创建空串
*/
String s1="abc";//s1是一个类类型(引用)变量,"abc"是一个对象
//字符串最大特点:一旦被初始化就不可以被改变.(指的是该字符串对象)
//s1="haha&qu ...
使用分治算法设计程序时,一般可以按以下步骤进行:
(1)分解:将要求的问题划分成若干规模较小的同类问题;
(2)求解:当子问题划分的足够小时,用较简单的方法解决;
(3)合并:按求解问题的要求,将子问题的解逐层合并,即可构成最终的解.
实例:乒乓球比赛赛程安排
根据分治算法的思想,我们应该将问题进行拆分成规模较小的同类问题.
循环赛日程4人
循环赛日程2人
...
算法思路:
递归算法,就是一种直接或者间接地调用自身的算法.递归算法的具体实现过程一般通过函数或者子过程来完成,在函数或子过程的内部,编写代码直接或者间接地调用自己,即可完成递归操作.
这里列举出求阶乘和数制转换的递归操作实例.
实例1:求阶乘
public static int jiecheng(int i) {
if(i!=1){
return i*jiecheng(i-1);
}
return 1;
}
public static void main(String[] args) {
Syst ...
枚举(穷举)法
枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:
(1):可预先确定候选答案的数量;
(2):候选答案的范围在求解之前必须有一个确定的集合.
实例1:填数游戏.
Java代码描述 ...