Python与Java

Python
1、基础数据结构
答:列表、元组、字典、集合、字符串;
可变类型(值改变,地址/ID不改):列表,字典;不可变类型(值改变,地址/ID改变):数值、元组、集合、布尔、字符串;
注:小数池: python中为了减少开辟内存造成的时间开销,对于三位内的整型数字类型数据,在开辟一块内存空间后,后面的三位内的整型数据都放到这个内存空间中,所以三位以内的整型数字类型的id值都是相同的。
2、函数参数
答:实参:常量、变量、表达式、函数等,函数调用时必须有确定的值;形参:只有被调用时才分配的内存单元,调用结束就释放,只能在函数内部有效;一般只能把实参传给形参,函数调用过程中形参值发生变化,但是实参不会变。
必备参数(位置参数):由实参传值给形参;命名关键字参数:通过定义关键字获取实参的值,与位置无关;默认参数:形参会有默认值,没有实参传值时使用默认值(可以在数据库连接,地址和端口,账号登录的地方使用);可变参数:*args:接收N个位置参数,并且会把位置参数转换成元组的形式,参数**kwargs:把N个关键字参数,转换成了字典。
3、装饰器(万物可对象,函数也是个对象)
答:python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。简单的说装饰器就是一个用来返回函数的函数。
闭包:函数嵌套、内部函数使用外部函数的变量、外部函数的返回值就是内部函数;
@语法只是将函数传入装饰器函数,并无神奇之处。
@functools.wraps(func),这是python提供的装饰器。它能把原函数的元信息拷贝到装饰器里面的 func 函数中。函数的元信息包括docstring、name、参数列表等等。可以尝试去除@functools.wraps(func),你会发现test.__name__的输出变成了wrapper。
4、内存管理机制
答:1、引用计数器:保存追踪内存中的对象被引用的次数记录;2、垃圾回收:垃圾收集器会清理不再被使用的内存。引用计数为0的会被清除,垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(当两个对象相互引用时,他们本身其他的引用为0) ;3、内存池机制:对内存的垃圾收集机制,是将不用的内存放到内存池而不是返回给操作系统。
Python中有分为大内存和小内存:(256K为界限分大小内存)大内存使用malloc(操作系统)进行分配,小内存使用内存池进行分配。
请求分配的内存在1~256字节之间就使用内存池管理系统进行分配,调用malloc函数分配内存,但是每次只会分配一块大小为256K的大块内存不会调用free函数释放内存,将该内存块留在内存池中以便下次使用。
经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。我们利用装饰器,可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
5、多线程
答:线程模块:_thread(函数式)、threading(推荐使用,用类来包装线程对象。)
函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程:_thread.start_new_thread ( function, args[, kwargs] )
function - 线程函数。
args - 传递给线程函数的参数,他必须是个tuple类型。
kwargs - 可选参数。
_thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于 threading 模块的功能还是比较有限的。

threading 模块除了包含 _thread 模块中的所有方法外,还提供的其他方法:

threading.currentThread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:

run(): 用以表示线程活动的方法。
start():启动线程活动。
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
isAlive(): 返回线程是否活动的。
getName(): 返回线程名。
setName(): 设置线程名
如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。
使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。
6、继承
答:继承(支持多继承):即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。(self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。)
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
init : 构造函数,在生成对象时调用
del : 析构函数,释放对象时使用
repr : 打印,转换
setitem : 按照索引赋值
getitem: 按照索引获取值
len: 获得长度
cmp: 比较运算
call: 函数调用
add: 加运算
sub: 减运算
mul: 乘运算
truediv: 除运算
mod: 求余运算
pow: 乘方
7、GCI编程
答:CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口。在你进行CGI编程前,确保您的Web服务器支持CGI及已经配置了CGI的处理程序。

8、网络编程
答:Python 提供了两个级别访问的网络服务:
低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。(Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。)
高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。
我们用 socket() 函数来创建套接字,语法格式如下:socket.socket([family[, type[, proto]]])
family: 套接字家族可以是 AF_UNIX 或者 AF_INET
type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填默认为0.
https://www.runoob.com/python3/python3-socket.html
9、问题集
Python中的面向对象(类函数,静态函数,实例化函数)
列表和元组的区别
怎么遍历字典:items
问self:self 代表的是类的实例,代表当前对象的地址
类的init函数:构造函数,初始化类,每当调用类的时候,就会自动执行这个函数
7、类之间的继承
8、构造函数
Java
1、回收机制
答:JVM分5个区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区,其中程序计数器,虚拟机栈、本地方法栈三个区域随线程而生随线程而灭,所以回收机制的主要区域是堆区和方法区。
重点:确定哪些对象可以被回收,哪些还不能回收?
方法:1、引用计数器,对实例对象的引用进行计数。2可达性分析:可达性分析基本思路是把所有引用的对象想象成一棵树,从树的根结点 GC Roots 出发,持续遍历找出所有连接的树枝对象,这些对象则被称为“可达”对象,或称“存活”对象。不能到达的则被可回收对象。Java 里可以作为GC Roots虚拟机栈(帧栈中的本地变量表)中引用的对象。方法区中静态属性引用的对象。方法区中常量引用的对象。本地方法栈中 JNI 引用的对象。
清理:1、标记-清理
对象死亡(被回收)前的最后一次挣扎
在可达性分析算法中不可达的对象并不是被马上回收,要真正回收要经历过两次标记过程。
第一次标记:在对对象进行可达性分析后发现没有与 GC ROOT 相连的引用链,就会被第一次标记。
第二次标记:在第一次标记后,如果对象有执行 finalize() 方法,如果在执行 finalize() 方法后没有重新与上面所说的引用链建立关系,就会被第二次标记。
第二次被标记的对象就会真的被回收,如果 finalize() 方法执行后重新连上引用链就不会被回收
2、多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态存在的三个必要条件:继承、重写、父类引用指向子类对象(引用还是指向基类)
比如Parent p = new Child();
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是基类与派生类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
(1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
(2)方法重写是在派生类存在方法与基类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
(3)方法重载是一个类的多态性表现,而方法重写是派生类与基类的一种多态性表现。
优点:1. 消除类型之间的耦合关系 2. 可替换性3. 可扩充性4. 接口性5. 灵活性6. 简化性
3、HashMap 底层实现,引入红黑树的目的

数组+链表+红黑树(不是绝对平衡的二叉树)(当链表超过8时候,将链表转成红黑树)

为什么不使用二叉排序树?
问题主要出现在二叉排序树在添加元素的时候极端情况下会出现线性结构。单分支树。

为什么不使用平衡二叉树呢?
红黑树不追求"完全平衡",即不像AVL那样要求节点的 |balFact| <= 1,它只要求部分达到平衡,但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。
就插入节点导致树失衡的情况,AVL和RB-Tree都是最多两次树旋转来实现复衡rebalance,旋转的量级是O(1);删除节点导致失衡,AVL需要维护从被删除节点到根节点root这条路径上所有节点的平衡,旋转的量级为O(logN),而RB-Tree最多只需要旋转3次实现复衡,只需O(1),所以说RB-Tree删除节点的rebalance的效率更高,开销更小!
AVL的结构相较于RB-Tree更为平衡,插入和删除引起失衡,如2所述,RB-Tree复衡效率更高;当然,由于AVL高度平衡,因此AVL的Search效率更高啦。针对插入和删除节点导致失衡后的rebalance操作,红黑树能够提供一个比较"便宜"的解决方案,降低开销,是对search,insert ,以及delete效率的折衷,总体来说,RB-Tree的统计性能高于AVL.
故引入RB-Tree是功能、性能、空间开销的折中结果。

6、hashtable与Hashmap区别

答:1、HashMap是非同步的,而Hashtable是同步的,这意味着哈希表线程安全,可以在多个线程之间共享,但是HashMap如果没有适当的同步,就不能在多个线程之间共享。2、处理空值不同,table抛出异常,map可以存在空值;3、HashMap只支持Iterator(迭代器)遍历Hashtable支持Iterator(迭代器)和Enumeration(枚举器)两种方式遍历;4、HashMap是“从前向后”的遍历数组,Hashtable是“从后往前”的遍历数组;5、map有自己哈希定义方式,table没有。
7、str对象可以被继承吗?
答:不可以,因为被final关键字修饰了
Final关键字:被修饰的变量和方法不可以再被继承,

8、Java的框架
SSM (SSH)springboot(可以加+SSM的M(可以将变量与数据库属性分离),有自己配置好的约定,优点:约定大于配置,内嵌Tomcat )第一字母前端(spring正向获取数据、接收返回的数据)、逻辑层(接收前断传来的数据,调用第三层的封装函数)、数据库交互(封装操作函数)
框架主要是一种思想。
Spring Code、 Spring boot
9、Java中有八种基本数据类型
分别为:byte-1字节、short-2字节、int-4字节、long-8字节、char-2字节、float-4字节、double-8字节、boolean-1/8字节按1字节处理

有可变字符串:stringbuffer stringbuilder(线程不安全,单进程可用性能好)

10、ArrayList与Linklist区别
答:1、ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2、对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3、对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

ArrayList是一个可以处理变长数组的类型,这里不局限于“数”组,ArrayList是一个泛型类,可以存放任意类型的对象。由于ArrayList的所有方法都是默认在单一线程下进行的,因此ArrayList不具有线程安全性。
LinkedList可以看做为一个双向链表,所有的操作都可以认为是一个双向链表的操作,因为它实现了Deque接口和List接口。同样,LinkedList也是线程不安全的,如果在并发环境下使用它,同样用Colletions类中的静态方法synchronizedList()对LinkedList进行调用即可。
Java的进程加载机制

内存泄漏、溢出:发生在堆里,泄露:实例对象没有人用了,但是没有被回收。溢出:新建对象内存不足
减少避免内存泄漏主要思想是:1 千万不要出现对象废弃了但是依然存在引用导致不能释放的情况
2 不要申请不可预期的内存
3 避免循环中出现申请内存的操作
4 尽量复用对象 减少运行期间产生垃圾的情况,降低gc频率的同时也减少内存泄漏的可能性。

JVM如何加载Class文件
Class Loader:依据特定格式,加载class文件到内存
Execution Engine:对命令进行解析
Native Interface:融合不同开发语言的原生库为Java用。
Runtime Data Area: JVM内存空间结构模型。
Python与Java的区别
1、动态类型和静态类型
Java和Python之间最大的区别之一就是两种语言处理变量的方式。Java强迫你在第一次声明变量时就定义其类型并且不允许你在后面的程序中更改它的类型。这就是静态类型。与之相反,Python不许声明时定义变量类型,可以改变一个变量的类型,例如可以把整型替换为字符串。
但是不要因此以为Python是一个弱类型语言,因为不需要指定类型,还可以随时改变,事实上,Python是强类型语言,变量所绑定的对象在对象创建初期就确定好了类型,永远不可能被改变。同样,Java也是一个强类型语言。

2、Python中一切皆对象
在Python中,不论是数值(整型、浮点型),字符串,字典,元组对象,还是他们所对应的类型,以及函数,模块等你所能看到的都是对象,他们的祖先是PyObject。而Java中至少函数,基本数据类型都不算对象。

3、可移植性
Java的可移植性更强,它可以用于开发平台独立的应用。这是Java相较于Python的优势之一,任何可以运用Java虚拟机的电脑或者移动设备都可以运行Java的应用,而不管你在哪里运行Python的程序你都需要一个编译器来将Python代码转化为你特定的操作系统可理解的代码。这是因为大部分设备已经安装了Java虚拟机,所以Java程序员可以自信的说他们的应用几乎对所有用户都可用。

4、Java和Python的应用领域
Java主要用于商业逻辑强的领域,如商城系统,金融,保险等传统数据库事务领域,通过类似ssh框架事务代码,对商业数据库,如oralce,db2,sql server等支持较好,软件工程理念较强,适合软件工程式的多人开发模式。Python主要用于web数据分析,科学计算,金融分析,信号分析,图像算法,数学计算,统计分析,算法建模,服务器运维,自动化操作,快速开发理念强,适合快速开发团队或个人敏捷模式。

你可能感兴趣的:(总结归纳,python,java,编程语言)