计算机

131 篇文章 1 订阅

回文子串 从左往右和从右往左一样的字符串
递归算法的重要性
高电位和低电位来进行计算机的存储
比特 bit 位是计算机中最小的存储单位
字节水表示存储的最小单位
带宽的概念是传输的速度大小 bit/s
单位时间内传输的数据的大小

摩尔定律 18月翻一番

瓶颈:
1.晶体管大小限制 晶体管数量不断增加,因此其大小不断变小,如果不断持续变小,那么很快就会缩小到一个原子那么大
2.电泄露
3.散热 随着晶体管速度和密度的增加,会消耗更多的电力 和原子能的能量联系????

CPU芯片大小增大的困扰
如果增大,会需要更高的电压,会产生更多的热量,因此不能增大芯片的体积

摩尔定律失效之后…

量子计算机 生物计算机 光子计算机等

量子计算机:

1982年 费曼 提出
希望能够利用计算机去模拟量子世界的计算能力
解决方案:用可控的量子体系去进行模拟和计算
基本原理:
传统计算:
比特,保存一对零和一
N个比特,只能存储2的N次方个数中的一个二进制数
量子计算:
量子比特,可以同时保持多种状态
N个量子比特,可以同时存储2的N次方个二进制数

计算方面:
输入一个数据,完成一次运算,输出一个数据
量子:
输入很多个数据,同时计算多次运算,输出多个数据

300个量子比特,其承载的数据为2的300次方,数字非常巨大,据说超出了整个宇宙的所有原子总和

量子的保持和提取是具有一定的成功概率的,因此我们需要:
利用多个量子比特位进行冗余的计算,从而确定计算结果的正确
大约1000个物理量子比特就能够超越传统计算机的能力

实现量子计算的难点:
不能收到外界环境的干扰,只有与外界保持隔离才能够保持良好的相干性
只有能够与外界进行良好的耦合,才能够控制演化并且读出结果

努力:
给予核磁共振的系统
超导量子
量子井
光量子等

成就:
NIST 2009年
研制出一台具有两个量子位的可编程量子计算机

D-wave公司推出第一台商用量子计算机

潜在应用
语音搜索 行星大气 气候变化 图像搜索 行星撞击 病毒分析 大数据 星系碰撞 海啸模拟

利用人脑合并思维去进行量子计算机的计算
量子计算机需要人类的配合

计算机十五年周期规律

引领变革之人

程序运行的基本原理

EDVAC 冯诺依曼
存储程序式原理

java会自动清理垃圾,回收空间,回收垃圾的堆

编译和虚拟机
编译将高级代码转化为二进制机器语言代码
虚拟机为了应付不同的平台,使java代码能够在不同的平台上使用

封装 private public
setters getters 通过调用这两个函数,我们才能够对对象变量进行取用,因此我们并不能够随意取用变量的值,不能够随意修改。
男人欺负女人是本能,男人让着女人是本事。

多态和继承 可以让任何人舒适地进行修改程序以适应自己的需求。

接口是100%的纯抽象类 abstract

抽象类不能够被初始化从而创造出一个实例,就是不能被new

java注重引用变量的类型

interface 接口 其中的方法全都是抽象的 一定要以分号结尾

primitive主数据类型 引用数据类型

接口就是一种规范,可以让其它人知道你的对象使用了什么技能

创建一个对象
声明引用变量,创建对象,连接对象和引用
dog dogone= new dog();
构造函数会带有你在初始化对象时执行的程序代码,也就是新建一个对象时就会被执行,就算你自己没有写构造函数,编译器也会帮你写一个。

重载构造函数意味着你有一个以上的构造函数,且参数都不相同

构造函数:
public calss map entrend laala{
public map(){
super()
}
}
super必须写在函数的首行;
this()代表类本身 只能用到构造函数中,且只能够在第一行,因此,一个构造函数中不能够同时拥有this和super

3.5f 强制转化精度

对象一定放在堆上
如果局部变量为primitive就存放在栈上
如果局部变量是对象引用变量,只有引用变量存放在堆上,对象本身仍然存放在堆上
实例变量存放在堆上,如果实例变量是一个对象引用变量,那么,引用变量和对象本身都存放在堆上。

实例变量:保存对象的状态
局部变量:保存方法的状态 栈变量 变量作用域

方法释放对象的引用三种情况:
1.方法结束
2.引用被赋值到其它的对象上
3.直接将引用设定为null

局部变量只生活在方法中
实例变量随着对象的生死而生死

静态方法 static 表示出不需要类实例的方法
public class math{
public static int min (inta,intb){
}
}

调用方式:
math.min(42,46);

静态变量为该变量所属类的成员所共享,静态变量只会有一份,而不是每个实例都会有自己的一份。
静态方法可以存取静态变量。

autoboxing

图形用户接口

事件处理与内部类别
任务:
制作按钮,绘制屏幕动画,现实jpeg功能,动画

Jframe是一个代表屏幕上windows的对象
swing组件
OS X(前称Mac OS X)是苹果公司为麦金塔电脑开发的专属操作系统。
widget装饰物,小部件
JFrame frame = new JFrame();
frame.getContentPane().add(button);
frame.setSize(500,400);
frame.setVisible(true);
button.addActionListener(this);
public void actionPerformed(ActionEvent event){button.setText(“clicked”)};

怎么确保当某事件发生时会调用指定的方法?
如果想要知道按钮的事件,就会监听事件的接口。
interface声明调用方法的地方
事件的对象
java.awt.event,看到一组的事件类
用户做出相应动作,事件源(按钮)就会产生事件对象。
一般你的程序会花费较多的时间当监听者而不是事件来源。

每个graphics对象的后面都有个graphics2D对象
public void paintComponent(graphics g) { }

Image image = new imageicon(“pic.jpg”).getimage();
g.drawimage(image,3,4,this)

调用graphics2D对象前,你必须把graphics对象转化为graphics2D对象
事件 图形

我们可以获得事件,也可以绘制图形

在获得时间时绘制图形:

超过一个以上的widget的frame
frame默认有五个区域可以安放widget,但是每个区域只能安置一项 能够安置包括面板在内的三项东西的面板
面板上放置面板
frame. getContentPane().add(borderlayout.CENTER,button);
java中面板和框架的区别
尝试两个按钮
解决办法:需要对两个按钮注册同一个监听口
查看事件对象实际上是哪个事件源发出的

内部类
一个类可以嵌套在另一个类的内部
内部类的定义是包含在外部类的括号中
内部类可以使用外部类的所有的方法和变量,就算是私有的也可以
class MyOutClass{
class MyinnerClass{
void go()
{
}
}
}
内部类的实例一定会绑定在外部类的实例上

1.创建外部类的实例
2.使用外部类的实例创建内部类的实例
3.外部对象和内部对象有着亲密的链接

创建内部类的实例
如果你从外部类程序代码中初始化内部的类,此内部对象会绑定在该外部对象上。
例如某个方法的程序代码会初始化内部的类,此内部对象会绑定在执行该方法的实例上。

当然你也可以从外部类以外的程序代码来初始化内部实例,但是这要使用特殊的语法。
例如:
class Foo{
public static void main (String[] args)
{
Myouter outerobj=new Myouter();
Myouter.Myinner innerobj=outerobj.new Myinner();

}
}

public class Twobuttons{
JFrame frame;
JLabel label;
public static void main(String[] args)
{
Towbuttons gui = new Twobuttons();
gui.go();
}
public void go {

}
}

内部类的作用:
提供在一个类中实现同一接口的多次机会。
例如:在GUI事件处理程序,如果你想要让三个按钮有不同的事件行为,就使用三个不同的类来分别实现 Actionlistener,也就是每个类实现自己的Actionperformed()方法。

内部的类可以搞定不同的继承层次
仿真器

以内部类执行动画效果

监听非GUI的事件 比如:MIDI
制作一系列的MIDI信息/事件来播放任意的钢琴音
对事件注册一个监听者
开始sequecer的播放操作
每当监听者的事件处理程序被调用时,就开始执行动作。
ControllerEvent

每个事件都要有的操作:
创建信息实例
shortMessage first = new shortMessage();
调用setMessage()
first.setMessage(192,1,instrument,0)
制作信息的MidiEvent实例
MidiEvent noteOn=new MidiEvent(first,1)
把事件加到track(轨道)上
track.add(noteOn);

P420 运用Swing
很容易写也会很难控制的主要原因是布局管理器
Swing组件,是比我们之前所称之为widget更为正确的术语,他们就是你会放置在GUI上面的东西。
组件可以嵌套
创建GUI四个步骤:
创建window(JFrame)
JFrame frame = new JFrame();
创建组件;
JButton button = new JButton(“click me”);
把组件加到frame上
frame.getconteng
python
布局管理器用来控制所关联组件上携带的其他组件。
JPanel

不同的布局管理器有不同的策略

世界三大首席管理器
borderlayout flowlayout boxlayout

最常用的组件:
textfield textarea checkbox list

序列化和文件的输入输出
保存对象 对象可以被序列化也可以展开
如果只有自己写的程序会用到这些数据:
1.用序列化
如果程序需要被其他程序使用:
2.写一个纯文本文件。用其他程序可以解析的特殊字符写到文件中。

当然可以将数据存进任何格式中。
基本的输入输出技巧:
把数据写到某处,这可能是个磁盘上的文件,或者来自网络的串流。

存储状态:

序列化文件是很难让一般人阅读的,但他比纯文本文件更容易让程序恢复这三种人物的状态,也比较安全。

将序列化对象写入文件:
1.创建出FileOutputStream
2.创建ObjectOutputStream
3.写入对象
4.关闭ObjectOutputStream
将串流连接起来代表来源与目的地的连接。

对象被序列化的时候发生了什么?
序列化的对象保存了实例变量的值,因此之后可以在堆上带回一模一样的实例。
对象的状态是什么?有什么需要保存?

当对象被序列化时,被该对象引用的实例变量也会被序列化。且所有被引用的对象也会被序列化,最棒的是这些操作都是自动进行的。
如果要让类能够被序列化,就实现Serializable
Serialiazable接口又被称为market或者tag之类的标记用接口,因为此接口并没有什么方法需要去实现的。
它的唯一目的就是有实现它的类是能够被序列化的。

序列化是全有或全无的

如果某实例变量不能或不应该被序列化,就把它标记为transient(瞬时)的。如果你需要序列化程序能够跳过某个实例变量,就把他标记成transient的变量。

为什么有些变量不能序列化?
1.可能设计者再设计的时候忘记实现Serializable
2.或者动态数据只可以在执行时求出而不能或者不必存储。 无法将网络联机之类的东西保存下来。

解序列化 Deserialization : 还原对象
步骤:
1.创建FileinputStream
2.创建ObjectinputStream
3.读取对象
4.转换对象类型
5.关闭ObjectinputStream

有一种机制可以让类使用URL来指定位置

将字符串写入到文本文件

fileWriter.writer(“the first save in file text”);

java.io.File class 这个类代表磁盘上的文件,但并不是文件中的内容。
file对象代表特定文件的地址,但不是文件本身。
可以对file文件对象做出的操作:
创建出表现存盘文件的File对象
建立新的目录
列出目录下的内容
取得文件或目录的绝对路径
删除文件或目录
缓冲区的奥妙之处

序列化的识别
如果你将对象序列化,则必须要有该类才能还原和使用该对象
老狗变不出新把戏
serialVersionUID 类的版本识别ID
将 serialVersionUID 放在class中,让类在演化中还维持相同的ID
使用serialver工具来取得版本ID
存储BeatBox节奏

网络与线程
网络联机
socket连接外面的世界
连接,传送与接收
要让客户端能够工作,必须做好三件事:
1.如何建立客户端与服务器之间的初始连接
2.如何传送信息到服务器
3.如何接受来自服务器的信息
TCP/IP协议原理
javaAPI的网络功能包 java.net
建立socket连接
socket是代表两个机器之间的网络连接对象
IP地址和端口
socket chatSocket = new socket (“196.164.1.103”,5000)
0----1023保留给已知的特定服务器使用
所以一般我们从1024之后挑选
搜索已知TCP端口来查找端口号

使用BufferedReader从Socket上读取数据
用串流通过socket连接来沟通
1.建立对服务器的socker连接
socket chatSocket = new socket (“196.164.1.103”,5000)
2.建立连接到Socket上底层输入串流的连接InputStreamReader
InputStreamReader stream =new InputStreamReader (chartSocket.getInputStream());
3.建立BufferedReader来读取
ufferedReader reader = new ufferedReader(stream);
String message = reader.readline();
用PrintWriter写数据到Socket

线程 thread类
java中类名的首字母为大写
java.lang.Thread
Thread t = new Thread();
t.start();

线程调度器

不能只在单一的机器上测试多线程程序

线程会产生并发性问题,会引发竞争状态,从而引发数据的损毁。
两个或者以上的程序存取单一对象的数据

对象的锁
每个对象都有锁,大部分时间都没有锁上,并且你可以假设有个虚拟的钥匙 随时在旁。
对象的锁只会在有同步化的方法上起作用。
丢失更新信息令人闻风丧胆
利用同步机制让方法原子化
public synchronized void increment()
{
int i =balance;
balance = i +1;
}
一旦进入了线程我们必须确保在其他线程进入方法 之前所有的步骤都完成

同步化是有巨大代价的,
1.进入同步化的方法的程序会查询钥匙等性能上的损耗
2.同步化会让你的程序因为要同步运行的问题而慢下来。
3.可能会导致死锁问题
可以使用synchronized来修饰一行或数行的指令
死锁会发生是两个线程都互相持有对方所等待的东西,所以两个线程只好停下来去等,一直等。

java Thread 此书专门讲解多线程可能遇到的问题

sleep()静态方法可能会抛出InterruptedException异常,所以要包含在try catch块中。

需要一个命令列来启动服务器,需要另一个命令列来启动客户端

每个被载入的类也有锁,也就是如果有三个对象在堆上,那么就会有四个锁出现
线程优先级可以对调度器产生影响,但是也没有绝对的保证。

集合与泛型
数据结构
ArrayList
TreeSet 以有序状态保持并可防止重复
HashMap 可用成对的name/value来保存和取出
LinkedList 针对经常插入或删除中间元素所设计的高效率集合
HashSet 防止重复的集合,可快速找寻相符的元素
LinkedHashMap P553

数据结构

包,jar存档文件和部署
发布程序

本机部署
Executable Jar
Java Web Start

1,本机
2.两者之间的组合
3.远程

编译时使用-d选项可以将源代码和类文件分离
把程序包进Jar java Archive pkzip格式的文件

%cd Myproject/source
%javac -d …/classes MyApp.java
UNIX tar命令
jar是用来整理的工具
JAR是集合起来的文件
可执行的JAR表示用户不需要把文件抽出来就能运行

关键在于创建出manifest文件,它会带有JAR的信息,告诉虚拟机哪个类含有main()这个方法

创建可执行的JAR
1.确定所有的类文件都在classes目录下
2.创建manifest.txt来描述哪个类带有main()方法
3.执行jar工具来创建带有所有类以及manifest的JAR文件
P585

执行JAR
%cd Myproject/source
%java -jar app1.jar
-jar是告诉java虚拟机所给的是个JAR

首先JAVA字节码.class文件是通过JVM解释执行的,JVM解释的时候对于 Hot代码会通过JIT生成相应的机器码,就是说只有一部分代码(Hot代码)才会生成机器码(指令)。然后机器码就是机器指令,就是某种CPU的指令集,操作系统的机器指令没有这种说法,.exe是一种可执行文件格式,实际上就是PE格式,和linux系统的ELF文件都是从COFF演变而来的,这些文件格式里面有一个段叫做代码段,代码段里面存有程序被编译后的机器指令。

准确来说虚拟机解释执行字节码是译成cpu可执行的操作指令,这种转换每次执行字节码时都会进行,会有性能损耗。为了提高效率,避免性能损耗,引入JIT即时编译对应用中执行频率高的代码即热点代码缓存其编译后的操作指令后。这样就不用进行解析,而是直接执行。另外所谓机器码、操作系统的机器码的叫法应该是指操作系统的执行指令吧。 .exe是一种可执行文件格式,C,C++, C#这种程序编译后会生成这种可执行文件。

把类包进包中
用包防止类名称的冲突
包的名称就像是类的全名,技术上称为fully-qualified name
java API有这些包结构

防止包命名冲突

Sun建议
反向使用domiain的包名称
com.headfirstjava.projects.Chart

把类包进包中
1.选择包名称
2.在类中加入包名称
每个源文件只能有一个包指令
package com.headfirstjava 包名称
你需要将源文件放在包名称的目录下,将源文件和类都做出相对应的结构
3.设定相对应的目录结构

编译与执行包
加上-d选项来编译

以包创建可执行的JAR
我创建可执行的JAR
1.确定所有的类文件都放在class目录下正确相对应的包结构中
2. 创建minifest.txt描述哪个类带有main()
3.执行jar工具来创建带有目录结构与manifest的JAR文件
-cvmf

条列和解压的jar命令
1.将JAR内容列出
jar -tf packEx.jar
2.Extract the contents of a JAR
jar -xf packEx.jar

META-NIF

Java Web Start (JWS)工作方式

1.客户端点击某个网页上JWS应用程序的链接
2.Web服务器收到请求发出.jnlp文件给客户端的浏览器 .jnlp文件是个描述应用程序可执行文件JAR文件的XML文件
3.浏览器启动JWS
4.Web服务器发送.jar文件
5.JWS取得JAR并调用指定的main()来启动应用程序

创建与部署JWS的步骤

1.将程序制作成可执行的JAR
2.编写.jnlp文件(java network lanuch protocol)
3.把.jnlp与JAR文件放到Web服务器
4.对Web服务器设定新的mime类型
5.设定网页连接到.jnlp文件

applet 无法独立于浏览器之外,是网页的一部分而不是单独的
浏览器会使用Java的plug-in来执行applet

分布式计算
RMI 远程程序调控技术、

创建远程服务:
1.创建Remote接口
远程的接口定义了客户端可以远程调用的方法,它是个作为服务的多态化类。stub和服务都会实现此接口
2.实现Remote
这是真正执行的类。它实现出定义在该接口上的方法,它是客户端会调用的对象
3.用mric产生stub与skeleton
4.启动RMI registry rmiregistry就像是电话簿,用户会从此取得代理
5.启动远程服务

创建远程接口:
1.继承java.rmi.Remote
Remote是一个标记性的接口,意味着没有方法
2.声明所有的方法都会抛出RemoteException
3.确定参数和返回值都是primitive主数据类型或Serializable

extends 继承

servlet 是放在HTTP Web服务器上面运行的Java程序 是完全在HTTP服务器上运行的java程序
servlet用来处理与用户交互的网页程序

ISP
创建并执行servlet的步骤
1.找出可以存放servlet的地方
2.取得servlet.jar并添加到classpath 上
3.通过extend过HttpServlet来编写servlet的类
4.编写HTML来调用servlet
5.给服务器设定HTML网页和servlet

EJB enterprise javabeans

jini

RMI
JSP
EJB
j2EE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值