Django框架-Form组件

一、DjangoForm组件介绍

我们之前在html页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。

与此同时我们在好多场景下都需要对用户的输入做校验,比如验证用户是否输入,输入的长度和格式等是否正确,如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息。

Django Form组件就实现了上面所述的功能。

1、生成页面可用的html标签(生成input框)

2、对用户提交的数据进行校验

3、错误信息的展示

4、保留上次的输入

缺点:只能生成form表单里面的内容,form标签需要自己建立,提交的按钮需要自己写,csrf_token也需要自己添加

二、form组件的字段和插件

创建form类时,主要涉及到【字段】和【插件】,字段用于对用户请求数据的验证,插件用于自动生成html

字段创建,默认为input框中的类型为text,可以通过插件来修改成按钮,多选框等等。

想通过插件修改,需要导入插件模块:from django.forms import widgets

1、字段

CharField(参数)  所有的字段都继承Field类,初始化都是TextFied,改变type都可以通过widgets改变

注:所有的字段类型都可以用CharField,然后通过widgets来修改

ChoiceField()   选择类的字段

通过widgets可改变为:widget = forms.widgets.radioSelect()

  radioSelect(单选按钮)

  Select(单选下拉)

  SelectMultiple(多选下拉)

  checkbox(单选方形按钮)

  checkboxSelectMultiple(多选方形按钮)

示例:如何使用choiseField字段,及使用数据库中的数据
class
LoginForm(forms.Form):...hobby = forms.fields.ChoiceField(# choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),choices= models.Hobby.object.all().values_list("id", "name")label="爱好",initial=[1, 3],widget=forms.widgets.CheckboxSelectMultiple()) # 上面choices就用到了从数据库中获取数据,但这种方式,每次更改数据库,都需要重启项目,前端才能更新信息

关于choice的注意事项

在使用选择标签字段时,需要注意choices的选项可以从数据库中获取,但时由于时静态字段,获取的值无法实时更新,即

中途向数据库中添加数据,前端不会实时更新,需要重启项目的问题,但重启项目明显不好,故可通过构造函数,每次查询时,都先去数据库中查一下使用的数据库中的字段。将如下的方法也放到类中即可。

方案一

   def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.fields['hobby3'].choices = models.Hobby.objects.all().values_list('id', 'name')

注:其中fields代表的是自定义form类中所有的字段
注:当定义了__init__方法,那么类中对应字段的choices就可以删掉了

方案二

from django import forms
from django.forms import fields
from django.forms import models as form_modelclass FInfo(forms.Form):authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())  # 多选# authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())  # 单选

DjangoForm所有的内置字段

Fieldrequired=True,               是否允许为空widget=None,                 HTML插件label=None,                  用于生成Label标签或显示内容initial=None,                初始值help_text='',                帮助信息(在标签旁边显示)error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'}validators=[],               自定义验证规则localize=False,              是否支持本地化disabled=False,              是否可以编辑label_suffix=None            Label内容后缀CharField(Field)max_length=None,             最大长度min_length=None,             最小长度strip=True                   是否移除用户输入空白IntegerField(Field)max_value=None,              最大值min_value=None,              最小值FloatField(IntegerField)...DecimalField(IntegerField)max_value=None,              最大值min_value=None,              最小值max_digits=None,             总长度decimal_places=None,         小数位长度BaseTemporalField(Field)input_formats=None          时间格式化   DateField(BaseTemporalField)    格式:2015-09-01
TimeField(BaseTemporalField)    格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12DurationField(Field)            时间间隔:%d %H:%M:%S.%f...RegexField(CharField)regex,                      自定制正则表达式max_length=None,            最大长度min_length=None,            最小长度error_message=None,         忽略,错误信息使用 error_messages={'invalid': '...'}EmailField(CharField)      ...FileField(Field)allow_empty_file=False     是否允许空文件ImageField(FileField)      ...注:需要PIL模块,pip3 install Pillow以上两个字典使用时,需要注意两点:- form表单中 enctype="multipart/form-data"- view函数中 obj = MyForm(request.POST, request.FILES)URLField(Field)...BooleanField(Field)  ...NullBooleanField(BooleanField)...ChoiceField(Field)...choices=(),                选项,如:choices = ((0,'上海'),(1,'北京'),)required=True,             是否必填widget=None,               插件,默认select插件label=None,                Label内容initial=None,              初始值help_text='',              帮助提示ModelChoiceField(ChoiceField)...                        django.forms.models.ModelChoiceFieldqueryset,                  # 查询数据库中的数据empty_label="---------",   # 默认空显示内容to_field_name=None,        # HTML中value的值对应的字段limit_choices_to=None      # ModelForm中对queryset二次筛选
     
ModelMultipleChoiceField(ModelChoiceField)...                        django.forms.models.ModelMultipleChoiceFieldTypedChoiceField(ChoiceField)coerce = lambda val: val   对选中的值进行一次转换empty_value= ''            空值的默认值MultipleChoiceField(ChoiceField)...TypedMultipleChoiceField(MultipleChoiceField)coerce = lambda val: val   对选中的每一个值进行一次转换empty_value= ''            空值的默认值ComboField(Field)fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])MultiValueField(Field)PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用SplitDateTimeField(MultiValueField)input_date_formats=None,   格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']input_time_formats=None    格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']FilePathField(ChoiceField)     文件选项,目录下文件显示在页面中path,                      文件夹路径match=None,                正则匹配recursive=False,           递归下面的文件夹allow_files=True,          允许文件allow_folders=False,       允许文件夹required=True,widget=None,label=None,initial=None,help_text=''GenericIPAddressFieldprotocol='both',           both,ipv4,ipv6支持的IP格式unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用SlugField(CharField)           数字,字母,下划线,减号(连字符)...UUIDField(CharField)           uuid类型
Django Form内置字段

2、参数

label       显示的文本,如input框前的“用户名:”

initail       初始化的值,即默认值

required    是否必填,required=True

help_text   在input框后的提示信息

error_messages ={"min_length": '太短了',"required": '此数字必须填写'}  定义字段,验证不通过时提示的错误信息,格式为字典   

widget = forms.widgets.PasswrodInput(attrs={'class': "form_contronl"})    加插件,可以改变input框的类型,也可以为input标签加各种属性,如class,style等等。

validators = [验证器1,]   里面可以时django默认的验证器,也可以自己定义验证方法,然后放入其中

 3、验证

1、djangoForm组件字段验证顺序

form_obj.is_vaild()==> 通过则将字段加入clean_data字典集合中,如果不通过,则报错,不会将对应字段名加入到字典中,故后面自定义的方法是拿不到字段的

    |

django自己的clean(self) 方法  

    |

自定义的clean_字段名 的方法 ==>  系统会通过反射检索是否自定义以clean_开头的方法,如果有就执行

    |

自定义的clean(self) 方法  ==> 这个方法是全局的,对所有的字段校验,本质是复写django的clean方法

2、form校验的几种方式

  validators = [验证器1,] 

  2.1、内置的验证

    max_length/min_length

    required

  2.2、自定义验证器

    方式一、    

  • from django.core.Validators import RegexCalidator      有很多这样的类,这个是正则验证的模块validators=[RegexValidator(r'^[a-zA-Z][a-zA-Z0-9_@]{4,18}', '4~18个字符,首字符为字母')]格式为:前部分为正则,后半部分为提示信息

    方式二、       

  • # 定义函数
    from
    django.core.exceptions import ValidationErrordef validator_check(value):# 定义方法,设计规则,用于验证if 'sex' in value:raise ValidationError('含有非法字符')

    然后在类中的字段 validators中调用方法即可,validators = [validator_check] # 不用加括号

  2.3、利用钩子函数自定义验证

 

    钩子,框架级别的东西,流程过程中,预留一些空白,有,就进行验证,没有就过

 

    钩子函数,利用反射hasattr,拿到方法的字符串,有就执行,没有就过

 

    局部:单独为某个字段设置             

  • clean_字段名(self):通过校验:返回当前校验的值   【for循环校验】不通过:raise ValidationError('不通过')  报错为什么报错? 因为源码中通过try捕获到错误,放入到err_diact中,继续执行其它的程序

    全局:所有的字段都校验完了,才回执行,里面只有通过的字段

  • clean(self):通过校验:返回 self.cleaned_data不通过:self.add_error('re_wd', '两次密码不一致')raise ValidationError('不通过')  报错

 

PS:form表单中,如果在form标签中加入属性novalidate ,则前端不会做校验。

三、定义一个form组件

1、创建

  可在视图中创建,但最好在app下单独建立一个py文件,如myform.py

  1.1、导入模块 from  django  import  forms

  1.2、定义form类,继承forms.Form(只能定义若干个数据库表中的字段)  或 forms.Models(可批量定义)

  1.3、定义字段(可以是数据库中的,那么值就需要通过orm操作获取数据库中的值)

  示例:   

from django import forms
from django.forms import widgets  # 插件的意思,就是改变【字段】input的类型,如checkbox等等
from django.core.validators import RegexValidator  # 用于校验,正则class MyForms(forms.Form):username = forms.CharField(label='用户名',help_text='人生库端4444',   # input框右边的提示语min_length=4,initial='不能小于5个字符',error_messages={'min_length': '长度不符合规则'},widget=widgets.TextInput(attrs={'class': 'form-control'}),validators=[RegexValidator(r'^[a-zA-Z][a-zA-Z0-9_@]{4,18}', '4~18个字符,首字符为字母')])password = forms.CharField(label='密码',# 密码默认明文显示,可通过插件修改widget=widgets.PasswordInput(attrs={'class': 'form-control'}),hobby2 = forms.ChoiceField(label='love:下拉多选', initial=3, choices=((1, 'lan'), (2, 'qiu'), (3, 'dd')),widget=widgets.SelectMultiple(attrs={'class': 'form-control'})  # 下拉多选
                               )
)

 2、使用

  2.1、后端使用:views.py  

  • from app_name.myform import MyFormdef view_func(request):form_obj = MyForm()   实例化if request.method == 'POSt':form_obj = MyForm(request.POST)   将接收到的数据传进去form_obj.is_vaild()     做校验,后台自动完成form_obj.cleaned_data    字典,已经通过校验的所有字段,没有通过,不会放入到里面return render(request, 'index.html' , {'form_obj': form_obj})注:两次实例化变量名都为form_obj这样优化代码,不然post请求验证不过,返回错误信息,还要写一个return。

  2.2、前端使用  

  • {{form_obj}} 直接生成所有的字段,不过没有格式

    {{form_obj.name.lable_tag}} 直接生成一个lable的标签

    {{form_obj.as_p}} 所有的字段生成input框,每个input外面时p标签生成的html代码如下以as_p为例:
    <P><lable for='{{form_obj.name.id_for_label}}'>{{form_obj.name.label}}</lable><input></p>{{form_obj.as_table/as_ui}}{{form_obj.name}} name字段生成的input框,框的类型type和定义时charField定义有关{{form_obj.name.label}} name的标签显示的文字,如用户名{{form_obj.name.id_for_label}} input框的id,用于与label标签的for关联{{form_obj.name.errors}} 该字段后台验证返回来的所有的错误{{form_obj.name.errors.0}} 该字段后台验证返回来的所有的错误的第一个错误,所有的错误放在一个字典中{{form_obj.errors}} form表单的所有的错误

四、应用bootstrap样式,如何使用form组件

方式一:一个一个字段写

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css"><title>login</title>
</head>
<body>
<div class="container"><div class="row"><form action="/login2/" method="post" novalidate class="form-horizontal">{% csrf_token %}<div class="form-group"><label for="{{ form_obj.username.id_for_label }}"class="col-md-2 control-label">{{ form_obj.username.label }}</label><div class="col-md-10">{{ form_obj.username }}<span class="help-block">{{ form_obj.username.errors.0 }}</span></div></div><div class="form-group"><label for="{{ form_obj.pwd.id_for_label }}" class="col-md-2 control-label">{{ form_obj.pwd.label }}</label><div class="col-md-10">{{ form_obj.pwd }}<span class="help-block">{{ form_obj.pwd.errors.0 }}</span></div></div><div class="form-group"><label class="col-md-2 control-label">{{ form_obj.gender.label }}</label><div class="col-md-10"><div class="radio">{% for radio in form_obj.gender %}<label for="{{ radio.id_for_label }}">{{ radio.tag }}{{ radio.choice_label }}</label>{% endfor %}</div></div></div><div class="form-group"><div class="col-md-offset-2 col-md-10"><button type="submit" class="btn btn-default">注册</button></div></div></form></div>
</div><script src="/static/jquery-3.2.1.min.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
</body>
</html>

 方式二:通过for循环,直接通过field即可

<div class="panel panel-primary"><div class="panel-heading ">编辑页面</div><div class="panel-body"><form class="form-horizontal " method="post">{% csrf_token %}{% for field in customer_form_obj %}<div class="form-group "><label for="{{ field.id_for_label }}" class="col-sm-2 control-label">{{ field.label }}</label><div class="col-sm-10 ">{{ field }}</div><span class="help-block">{{ field.errors.0 }}</span></div>{% endfor %}<button type="submit" class="btn btn-lg btn-success btn-block center-block">提交</button></form></div>
</div>

五、form组件批量添加样式

可通过重写form类的init方法来实现。 

class LoginForm(forms.Form):username = forms.CharField(min_length=8,label="用户名",initial="张三",error_messages={"required": "不能为空","invalid": "格式错误","min_length": "用户名最短8位"}...def __init__(self, *args, **kwargs):super(LoginForm, self).__init__(*args, **kwargs)for field in iter(self.fields):self.fields[field].widget.attrs.update({'class': 'form-control'})
批量添加样式

如何限制Form中下来框中值的选取范围?

1.  可以将model的实例以参数instance=obj传入,在form组件中引用self.instance 来操作orm,进行限制

2. 在post请求时,data= request.POST ,instance=obj 

- views.py
# 客户的增删改查
def customer_change(request, edit_id=None):"""要求添加完成后还回到之前的页面"""if re.match('^/del_customer/(\d+)/$', request.path_info):check_obj = models.Customer.objects.filter(id=edit_id)if not check_obj:return HttpResponse("目标不存在,非法操作")check_obj.delete()next_url = request.GET.get('next_url', '')return redirect(next_url)msg = ""edit_obj = models.Customer.objects.filter(id=edit_id).first()customer_form_obj = forms.CustomerForm(instance=edit_obj)if request.method == "POST":next_url = request.GET.get('next_url', '')customer_form_obj = forms.CustomerForm(data=request.POST, instance=edit_obj)if customer_form_obj.is_valid():customer_form_obj.save()return redirect(to=next_url)else:msg = "请按要求填写信息"- forms.py
class ConsultRecordForm(BaseStyle):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 限制添加客户跟进记录,只能选择自己的客户self.fields['customer'].widget.choices = [(i.id, i) for i in self.instance.consultant.customers.all()]# 限制添加客户记录,销售下拉只能是自己self.fields['consultant'].widget.choices = [(self.instance.consultant.id, self.instance.consultant), ]class Meta:model = models.ConsultRecordfields = '__all__'exclude = ['delete_status']widgets = {'consultant': forms.widgets.Select()}

六、ModelForm

form与model的终极结合,可直接使用models中的所有字段

class BookForm(forms.ModelForm):class Meta:model = models.Bookfields = "__all__"labels = {"title": "书名","price": "价格"}widgets = {"password": forms.widgets.PasswordInput(attrs={"class": "c1"}),}

class Meta:下常用参数:

model = models.Student  # 对应的Model中的类
fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段
exclude = None  # 排除的字段
labels = None  # 提示信息
help_texts = None  # 帮助提示信息
widgets = None  # 自定义插件
error_messages = None  # 自定义错误信息

转载于:https://www.cnblogs.com/sunxiuwen/p/9741998.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间=k的个数)...

取板粗 好东西来的 1.&#xff08;HDOJ2665&#xff09;http://acm.hdu.edu.cn/showproblem.php?pid2665 &#xff08;POJ2104&#xff09;http://poj.org/problem?id2104 &#xff08;POJ2761&#xff09;http://poj.org/problem?id2761 题意&#xff1a;求区间第K大&…

分享Spring Cloud分布式微服务架构图

分布式、微服务、云架构JAVA语言开发、跨平台、高性能、高可用、安全、服务化、模块化、组件化、驱动式开发模式 从现在开始&#xff0c;我这边会将近期研发的springcloud微服务云架构的搭建过程和精髓记录下来&#xff0c;帮助更多有兴趣研发spring cloud框架的朋友&#xff0…

Lyft Level 5 Challenge 2018 - Elimination Round翻车记

打猝死场感觉非常作死。 A&#xff1a;判一下起点和终点是否在其两侧即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() {int x0,…

mysql用户的权限分配

2019独角兽企业重金招聘Python工程师标准>>> 因今天在分配数据库权限的时候&#xff0c;同事反映账户不能使用函数&#xff0c;遂搜集资料总结了一番关于mysql用户的权限分配。 MySQL 赋予用户权限命令的简单格式可概括为&#xff1a; grant 权限 on 数据库对象 to …

小米360口水战背后:国产手机第三态诞生

摘要&#xff1a;按照双方公布的配置信息&#xff0c;小米手机青春版为1.2G H z双核处理器&#xff0c;华为闪耀为1G H z双核。种向市场投入海量推广资金&#xff0c;以换取产品上的高利润&#xff0c;代表为步步高、金立、O PPO。南都制图&#xff1a;宋小伟 互联网入侵通信业…

线段与多边形的关系

转自周见智 介绍 最近项目中要用到有关几何&#xff08;Geometry&#xff09;方面的知识&#xff0c;程序需要判断给定的一条线段&#xff08;Segment&#xff09;与指定多边形&#xff08;Polygon&#xff09;的位置关系。这种关系分为三种&#xff1a;多边形包含线段、多边形…

解决,文件上传到 ftp 服务器,中文出现乱码问题

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 上传到 ftp 服务器&#xff0c;中文出现乱码解决&#xff0c;之前文件名 “ 网关信息 ” 始终不能正确显示&#xff0c;尝试了多种编码…

常用负载均衡策略分析

背景 一般生产环境单机所能承受的QPS压力为2w左右&#xff0c;过大的压力会导致服务器爆炸。即便是单机能够撑住2w QPS&#xff0c;一般也不会这么做&#xff0c;生产环境一般会预留50%的冗余能力&#xff0c;防止QPS因为某个热门的活动而爆炸。当QPS超过单机所能承受的压力时&…

解决- SecureCRT上运行 linux vim 命令中文出现乱码

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 乱码如图&#xff1a; 这个问题是CRT的编码设置造成的&#xff0c;改一下设置就可以了&#xff1a; 1. 在当前连接上右键选择最后一个 2…

linux中操作数据库的使用命令记录

1&#xff0c;mysql 查看数据库表编码格式&#xff1a; show create table widget; 修改数据库表编码格式&#xff1a; alter table widget default character set utf8; 修改数据库表中某字段的编码格式&#xff1a; alter table widget change widget_name widget_name varc…

ICC Scenario Definition

现代先进工艺下的后端设计都是在 MCMM 情况下设计的&#xff0c;所谓 MCMM 就是 muti-corner muti-mode&#xff0c;用于芯片的不同工作模式和工作条件。 后端设计过程中&#xff0c;需要保证芯片在所有工作模式和工作条件下都能正常工作&#xff0c;工作模式一般只有几种&…

持续集成与持续部署宝典Part 2:创建持续集成流水线

2019独角兽企业重金招聘Python工程师标准>>> 在本系列文章中&#xff0c;我们将探讨在容器时代如何在基于Docker的环境中创建连贯的工作流程和流水线来简化大规模项目的部署。另外&#xff0c;我们还将详细介绍如何利用Docker和Rancher自动化处理这些工作流。 在上文…

64 装饰器函数: 母版 csrf防御机制 cookie

主要内容: 1: 装饰器函数 a: 原理: 在不改变原函数的代码和调用方式的情况下, 给函数动态的添加功能 b: 实例: 装饰器的原理: def yue(tools):print(使用%s约一约 % tools) def wrapper(fn):def inner(*args, **kwargs):print(先准备好钱)fn(*args, **kwargs)return inner yue …

Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 方案一&#xff1a;用Eclipse自带的Export功能 步骤1&#xff1a;准备主清单文件 “MANIFEST.MF”&#xff0c; 由于是打包引用了第三…

一个判断session是否过期的小技巧

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Session一直是我们做web项目经常使用的&#xff0c;以前没太注意&#xff0c;这次又细致的看了下&#xff01; 1.session其实就是一个Ma…

jQuery基础-事件

只能添加一个处理函数&#xff0c;后面的会覆盖前面 会有兼容性差异 冒泡 会依次检查父元素 截获冒泡 或者 最大的缺陷 并且在IE和NetSpace里面分别为冒泡和捕获两种 多个处理函数 依次执行 捕获--->自己--->冒泡 true 只捕获&#xff0c;不冒泡 false 只冒泡 从父元素的…

别的AI还在打游戏,这个AI已经当上“超级马里奥”游戏策划了|GECCO最佳论文

AI打游戏已经不是什么新鲜事了&#xff0c;“沉迷”Dota 2、星际争霸、LOL的AI一个接一个的出现。 但是你也许不知道&#xff0c;相比这些“游戏玩家”AI&#xff0c;还有一位优秀的AI&#xff0c;直接当起了“游戏策划”&#xff0c;做的还是脍炙人口的“超级马里奥”。 &…

单点登录的三种实现方式

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 单点登录SSO&#xff08;Single Sign On&#xff09;说得简单点就是在一个多系统共存的环境下&#xff0c;用户在一处登录后&#xff0c;…

java对象占用内存大小?

一个不包含任何内部成员变量的空Object大约占33byte&#xff0c;若增加成员变量&#xff0c;则增加相应大小的内存占用。 测算方式&#xff1a;设置jvm的堆大小为1m&#xff0c;在堆中不停new不含任何成员变量的OOMObject对象&#xff0c;直到堆内存溢出。如下图&#xff0c;在…

Java程序员面试中的多线程问题

很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework)&#xff0c;理解核心线程概念时&#xff0c;娴熟的实际经验是必需的。这篇文章收集了 Java 线程方面一些典型的问题&#xff0c;这些问题经常被高级工程师所问到。 0.Java 中多线程同步是什…