专业书67~115+杂七杂八

1 如何访问另一个类的属性或变量?

1.如果这两个类在同一个包中,
(1)如果这个变量为静态变量,直接用 类名.变量名 引用(如果有get 方法的话,最好用get方法获得)。
(2)如果这个变量为实例变量,先创建一个该类的对象,然后通过 对象名.变量名引用(如果有get 方法的话,最好用get方法获得)。
2.如果这两个类不在同一个包中,先引入该包。然后
(1)同1(1);
(2)同1(2)。


2 关于转义字符

System.out.println("a\u0022.length() +\u0022b".length());等价于System.out.println("a".length()+"b".length()); //u022是双引号的转义

转义符好:反斜杠不会计入到实际输出的字符中,也不会计数。


3 关于printf格式化输出

%nd,n为整数,表示输出一个占位符为n的整数;

%.2f,表示输出一个堡垒两位小数的浮点数


4 抽奖问题

比如共有10个奖品,编号从1到10,先有10个人依次抽奖,则应保证每个人应在未抽的奖品中继续抽奖。方法:建立一个整型数组,a[9],且a[i]=i,生成[0,1)的随机数r,x=r*10即抽中的随机一个奖品编号,抽完使得a[x]=n-1,并n自减,再进行下一轮抽奖;即用最大的编号覆盖已抽的编号,再去除最大的编号


5 throws跟在方法的声明后,throw写在方法内


6 generics 泛型 目前已知用list举例,不懂,用<>别是的就是泛型

https://www.zhihu.com/search?type=content&q=%E6%B3%9B%E5%9E%8B

是因为泛型 List 和 List 编译后都被擦除了,变成了一样的原生类型 List,擦除动作导致这两个方法的特征签名变得一模一样,在 Class 类文件结构一文中讲过,Class 文件中不能存在特征签名相同的方法。”


Class 文件中不能存在特征签名相同的方法


7 autoboxing

把一个基本类型包装成一个类,一个是可以使这个类型具有很多可以调用的方法。二个是Java向面像对象语言的靠近。其实Java还不算是很纯的面向对象的语言。真正的面向对象,是没有基本数据类型的。它只有一种类型,就是对象。三个是在泛型中,基本类型是不可以做泛型参数的。如:List <int> list = new ArrayList<int> ();这是不合法的。你只能这个样写List<Integer> list = new ArrayList<Integer> ();也就是要用int型的包装类类型来解决基本类型不可以做泛型参数的问题 。
一名话,包装类有更多的方法和用途, 而这是基本类型没有的!!!
 
8 关于linked list的一段代码的用途,假设该链表以null终结,则下述代码表示删除最后一个
x=first.

while(x.next.next!=null){

x=x.next;

}

x.next=null;


9 Java用户空间?

引用:http://www.cnblogs.com/orientsun/archive/2012/07/25/2608532.html

通过 java 命令执行 class 程序或者启动基于 Java 的中间件(Weblogic、Workshop、Eclipse、SQL Developer)时,Java运行时会创建一个操作系统进程,就像运行基于C的程序时一样,可以通过JPS命令查看到。

作为操作系统进程,Java 运行时面临着与其他进程完全相同的内存限制:操作系统架构提供的可寻址地址空间和用户空间。

操 作系统架构提供的可寻址地址空间,由处理器的位数决定,32 位提供了 2^32 的可寻址范围,也就是 4,294,967,296 位,或者说 4GB。而 64 位处理器的可寻址范围明显增大:2^64,也就是 18,446,744,073,709,551,616,或者说 16 exabyte(百亿亿字节)。

地址空间被划分为用户空间和内核空间。内核是主要的操作系统程序和C运行时,包含用于连接计算机硬件、调度程序以及提供联网和虚拟内存等服务的逻辑和基于C的进程(JVM)。除去内核空间就是用户空间,用户空间才是 Java 进程实际运行时使用的内存

默认情况下,32 位 Windows 拥有 2GB 用户空间和 2GB 内核空间。在一些 Windows 版本上,通过向启动配置添加 /3GB 开关并使用 /LARGEADDRESSAWARE 开关重新链接应用程序,可以将这种平衡调整为 3GB 用户空间和 1GB 内核空间。在 32 位 Linux 上,默认设置为 3GB 用户空间和 1GB 内核空间。一些 Linux 分发版提供了一个hugemem内核,支持 4GB 用户空间。为了实现这种配置,将进行系统调用时使用的地址空间分配给内核。通过这种方式增加用户空间会减慢系统调用,因为每次进行系统调用时,操作系统必须在地址空间之间复制数据并重置进程地址-空间映射。

下图为一个32 位 Java 进程的内存布局:

 

可寻址的地址空间总共有 4GB,OS 和 C 运行时大约占用了其中的 1GB,Java 堆占用了将近 2GB,本机堆占用了其他部分。请注意,JVM 本身也要占用内存,就像 OS 内核和 C 运行时一样。

注意:

1. 上文提到的可寻址空间即指最大地址空间。

2. 对于2GB的用户空间,理论上Java堆内存最大为1.75G,但一旦Java线程的堆达到1.75G,那么就会出现本地堆的Out-Of-Memory错误,所以实际上Java堆的最大可使用内存为1.5G。

参考http://www.ibm.com/developerworks/cn/java/j-codetoheap/#iratings


10 数组增加元素的时间复杂度

方法一“double stack”:

设初始数组大小为1,或总长度为1,每插入一个元素前判断数组是否已满,若满则扩大一倍(即double一次,具体为先重建一个数组,把原数组的元素拷贝过来),然后填充直至再次变“满”,即:

初始大小:1

double1次(拷贝原来的1个元素至新的翻倍后的数组),填充1个,数组变满,大小:2

再double1次(拷贝原来的2个元素至新的翻倍后的数组),填充2个,数组变满,大小:4

再double1次(拷贝原来的4个元素至新的翻倍后的数组),填充4个,数组变满,大小:8

……

可见每次操作主要浪费的时间在新建数组、拷贝和填充(或说赋值),如果总共添加了N个元素,时间复杂度成比例于~N(这个N不懂,是否代表判断数组是否已满的次数?)+2+4+……+N~3N;


方法二:利用linked-list来操作


方法三:每增加一个元素,就重新建立一个相应的增大的数组,拷贝、复制,是最不建议用的方法


方法一均摊了时间成本(amortized cost),所以对频繁增加元素的情况比较适用,而且内存占用较小?方法二对于添加个别元素更适用,但是效率低(要不断回收垃圾?)


11 什么是inner class?

http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值