Java中的布尔与布尔值

时间:2010-09-16 16:20:19

标签: java boolean

Java中有Integerint的讨论。前者的默认值为null,而后者的默认值为0Boolean vs boolean怎么样?

我的应用中的变量可以包含0 / 1个值。我想使用boolean / Boolean,而不想使用int。我可以使用Boolean / boolean吗?

8 个答案:

答案 0 :(得分:228)

您可以改用Boolean / boolean

第一个是Object,第二个是原始类型。

  • 首先,您将获得更多有用的方法。

  • 考虑到内存费用,第二个便宜 第二个会为你节省更多内存,所以去吧

现在选择你的方式。

答案 1 :(得分:48)

Boolean 包装布尔基元类型。在JDK 5及更高版本中,Oracle(或Oracle收购之前的Sun)引入了autoboxing/unboxing,这基本上允许您这样做

boolean result = Boolean.TRUE;

Boolean result = true; 

基本上是编译器所做的,

Boolean result = Boolean.valueOf(true);

所以,对于你的回答,这是肯定的。

答案 2 :(得分:34)

我有点扩展提供的答案(因为到目前为止他们专注于他们的“自己的”/人工术语,专注于编写特定的语言,而不是照顾创建编程语言的场景背后的大局/ em>,一般情况下,即当类型安全与内存考虑因素有所不同时:)

int不是布尔

考虑

    boolean bar = true;      
    System.out.printf("Bar is %b\n", bar);
    System.out.printf("Bar is %d\n", (bar)?1:0);
    int baz = 1;       
    System.out.printf("Baz is %d\n", baz);
    System.out.printf("Baz is %b\n", baz);

带输出

    Bar is true
    Bar is 1
    Baz is 1
    Baz is true

第3行(bar)?1:0上的Java代码说明 bar boolean )无法隐式转换(转换)为 int 。我提出这个问题并不是为了说明JVM背后的实现细节,而是指出在低级别考虑因素(作为内存大小)方面,我们必须优先考虑值而不是类型安全性。特别是如果这种类型的安全性没有真正/完全使用,就像在布尔类型中那样以

的形式进行检查
  

如果值{在{0,1}中,则转换为布尔类型,否则抛出异常。

所有这些只是说明{0,1}< {-2 ^ 31,..,2 ^ 31 -1}。好像有点矫枉过正了吧?类型安全在用户定义的类型中非常重要,而不是隐式转换基元(尽管最后一个包含在第一个中)。

字节不是类型或位

请注意,在内存中,{0,1}范围内的变量仍将占用至少一个字节或一个字(xbits取决于寄存器的大小),除非特别注意(例如,在内存中很好地打包 - 8 “布尔”位转换成1个字节 - 来回转换。)

通过优先考虑类型安全性(如将值/包装到特定类型的盒子中)超过额外值包装(例如使用位移或算术),人们确实选择写入更少的代码而不是获得更多的内存。 (另一方面,人们总是可以定义一个自定义用户类型,这将促进所有转换不值得比布尔值。)

关键字与类型

最后,您的问题是关于关键字类型的比较。我认为通过使用/首选关键字(“标记为primitive)而不是类型(使用其他关键字 class ) 或换句话说

boolean foo = true;

VS

Boolean foo = true;

第一个“东西”(类型)不能扩展(子类)而不是没有理由。有效地,原始包装类的Java术语可以简单地转换为内联值(LITERAL或常量,只要它被编译器直接替换)可以推断替换,或者如果不是 - 仍然可以回退到包装值)。

由于微不足道,实现了优化:

  

“更少的运行时转换操作=>更快的速度。”

这就是为什么当实际的类型推断完成时,它可能(仍)最终在实例化包装类时必要时包含所有类型信息(或者转换/转换成这样的信息)。

因此,布尔布尔之间的区别正好在编译运行时中(有点远)但几乎与 instanceof getClass()相同。

最后,自动装箱比原语慢

请注意,Java可以autoboxing只是一个“语法糖”。它不会加快任何速度,只允许你编写更少的代码。而已。仍然执行铸造和包装到类型信息容器中。出于性能原因,选择算术,它总是会跳过使用类型信息创建类实例的额外内务处理来实现类型安全。缺乏类型安全性是您为获得性能而付出的代价。对于具有布尔值表达式类型安全的代码(当您编写较少且因此隐式代码时)将是至关重要的,例如对于if-then-else流量控制。

答案 3 :(得分:16)

您可以使用Boolean constants - Boolean.TRUEBoolean.FALSE代替01。如果原语是您所追求的,您可以创建类型为boolean的变量。这样您就不必创建新的Boolean对象。

答案 4 :(得分:3)

基本上布尔值表示基本数据类型,其中布尔值表示引用数据类型。这个故事是在Java想要成为纯粹面向对象的时候开始的,它提供了包装类概念来过度使用原始数据类型。

setOnClickListener

public class Home extends ActionBarActivity { String htmlText = "<html><body style=\"text-align:justify\"> %s </body></Html>"; //HOME SECTION TextView txt1,txt2,txt3,txt4,txt5,txt6; WebView webview1,webview2,webview3; WebSettings websetting; Button btnhowtouse,btnteacher, btn_addlocation, btn_student_parents; Dialog dialog; TextView txt_howtouse,txtdialog1,txtdialog2,txtdialog3,txtdialog4,txtdialog5,txtdialog6,txtdialog7,txtdialog8,txtdialog9,txtdialog10,txtdialog11, txtdialog12,txtdialog13,txtdialog14,txtdialog15,txtdialog16,txtdialog17,txtdialog18,txtdialog19,txtdialog20,txtdialog21,txtdialog22,txtdialog23; ImageView imgcross; Toolbar toolbar; int groupid; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_usecoop); toolbar=(Toolbar)findViewById(R.id.toolbar); try { setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); } catch (Exception e) { } btnhowtouse=(Button)findViewById(R.id.btn_howtouse); btnteacher=(Button)findViewById(R.id.btn_teacherlocator); btn_addlocation=(Button)findViewById(R.id.btn_addlocation); btn_student_parents=(Button)findViewById(R.id.btn_student_parents); Intent it=getIntent(); groupid=it.getIntExtra("Groupid", 0); Toast.makeText(Home.this, "Goupid"+groupid, Toast.LENGTH_LONG).show(); if(groupid==4) { btnteacher.setVisibility(View.VISIBLE); btn_student_parents.setVisibility(View.GONE); btn_addlocation.setVisibility(View.GONE); } else if(groupid==3) { btn_student_parents.setVisibility(View.VISIBLE); btnteacher.setVisibility(View.GONE); btn_addlocation.setVisibility(View.GONE); } else { btn_addlocation.setVisibility(View.VISIBLE); btnteacher.setVisibility(View.GONE); btn_student_parents.setVisibility(View.GONE); } btn_student_parents.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(Home.this, "Clicked Student parents", Toast.LENGTH_LONG).show(); Intent it=new Intent(Home.this,TeacherLocator.class); startActivity(it); } }); btnteacher.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent it=new Intent(Home.this,TeacherLocator.class); startActivity(it); } }); btn_addlocation.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(Home.this, "Currently you are not able to add location", Toast.LENGTH_LONG).show(); } }); txt1=(TextView)findViewById(R.id.txt_home1); txt2=(TextView)findViewById(R.id.txt_home2); txt3=(TextView)findViewById(R.id.txt_home3); txt4=(TextView)findViewById(R.id.txt_home4); txt5=(TextView)findViewById(R.id.txt_home5); txt6=(TextView)findViewById(R.id.txt_home6); webview1=(WebView)findViewById(R.id.web_view1); webview2=(WebView)findViewById(R.id.web_view2); webview3=(WebView)findViewById(R.id.web_view3); txt2.setText("Text1"); txt4.setText("Text2"); txt6.setText("Text3"); websetting=webview1.getSettings(); websetting=webview2.getSettings(); websetting=webview3.getSettings(); webview1.loadData(String.format(htmlText, txt2.getText()), "text/html", "utf-8"); webview2.loadData(String.format(htmlText, txt4.getText()), "text/html", "utf-8"); webview3.loadData(String.format(htmlText, txt6.getText()), "text/html", "utf-8"); btnhowtouse.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dialog=new Dialog(Home.this); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.dilogusecoop); dialog.setCancelable(true); dialog.show(); imgcross=(ImageView)dialog.findViewById(R.id.img_corss); imgcross.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); txt_howtouse=(TextView)dialog.findViewById(R.id.txt_howtouse); txtdialog1=(TextView)dialog.findViewById(R.id.txt_1); txtdialog2=(TextView)dialog.findViewById(R.id.txt_2); txtdialog3=(TextView)dialog.findViewById(R.id.txt_3); txtdialog4=(TextView)dialog.findViewById(R.id.txt_4); txtdialog5=(TextView)dialog.findViewById(R.id.txt_5); txtdialog6=(TextView)dialog.findViewById(R.id.txt_6); txtdialog7=(TextView)dialog.findViewById(R.id.txt_7); txtdialog8=(TextView)dialog.findViewById(R.id.txt_8); txtdialog9=(TextView)dialog.findViewById(R.id.txt_9); txtdialog10=(TextView)dialog.findViewById(R.id.txt_10); txtdialog11=(TextView)dialog.findViewById(R.id.txt_11); txtdialog12=(TextView)dialog.findViewById(R.id.txt_12); txtdialog13=(TextView)dialog.findViewById(R.id.txt_13); txtdialog14=(TextView)dialog.findViewById(R.id.txt_14); txtdialog15=(TextView)dialog.findViewById(R.id.txt_15); txtdialog16=(TextView)dialog.findViewById(R.id.txt_16); txtdialog17=(TextView)dialog.findViewById(R.id.txt_17); txtdialog18=(TextView)dialog.findViewById(R.id.txt_18); txtdialog19=(TextView)dialog.findViewById(R.id.txt_19); txtdialog20=(TextView)dialog.findViewById(R.id.txt_20); txtdialog21=(TextView)dialog.findViewById(R.id.txt_21); txtdialog22=(TextView)dialog.findViewById(R.id.txt_22); txtdialog23=(TextView)dialog.findViewById(R.id.txt_23); } }); } } This is my layout please help me find out this problem. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" > <include android:id="@+id/toolbar" layout="@layout/toolbar" /> <Button android:id="@+id/btn_howtouse" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="5dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:background="#4385F5" android:textColor="#ffffff" android:text="How To Locator" /> <Button android:id="@+id/btn_teacherlocator" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginBottom="5dp" android:background="#4385F5" android:textColor="#ffffff" android:text="Teacher Locator" android:layout_above="@+id/btn_howtouse" /> <Button android:id="@+id/btn_student_parents" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginBottom="5dp" android:background="#4385F5" android:textColor="#ffffff" android:text="Parents/Students Locator" android:visibility="gone" android:layout_above="@+id/btn_howtouse" /> <Button android:id="@+id/btn_addlocation" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginBottom="5dp" android:background="#4385F5" android:textColor="#ffffff" android:text="Add Location" android:visibility="gone" android:layout_above="@+id/btn_howtouse" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="5dp" android:layout_below="@+id/toolbar" android:layout_above="@+id/btn_teacherlocator" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" > <TextView android:id="@+id/txt_home1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginTop="5dp" android:text="Home" android:textSize="25sp" android:textStyle="bold" /> <WebView android:id="@+id/web_view1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/txt_home1" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginTop="5dp" /> <TextView android:id="@+id/txt_home2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/txt_home1" /> <TextView android:id="@+id/txt_home3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/web_view1" android:layout_marginLeft="5dp" android:layout_marginTop="5dp" android:textColor="#000000" android:textStyle="bold" android:textSize="20sp" android:text="What is Education?" /> <WebView android:id="@+id/web_view2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/txt_home3" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginTop="5dp" /> <TextView android:id="@+id/txt_home4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/txt_home3" /> <TextView android:id="@+id/txt_home5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/web_view2" android:layout_marginLeft="5dp" android:layout_marginTop="5dp" android:textColor="#000000" android:textStyle="bold" android:textSize="20sp" android:text="What are the benefits of Education?" /> <WebView android:id="@+id/web_view3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/txt_home5" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginTop="5dp" /> <TextView android:id="@+id/txt_home6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/txt_home5" /> </RelativeLayout> </ScrollView> </RelativeLayout> boolean b1; Boolean b2; 不相同。

答案 5 :(得分:1)

一个观察结果:(尽管这可以认为是副作用)

布尔是原始变量可以说是或否。

布尔值是一个对象(它可以表示是或否或“不知道”,即null)

答案 6 :(得分:0)

您可以使用布尔值/布尔值。简单是要走的路。 如果您不需要特定的api(集合,流等),并且无法预料到将需要它们,请使用它的原始版本(布尔值)。

  1. 使用基元可以保证您不会传递空值。
    您不会陷入这样的陷阱。下面的代码抛出NullPointerException(来自:Booleans, conditional operators and autoboxing):

    public static void main(String[] args) throws Exception { Boolean b = true ? returnsNull() : false; // NPE on this line. System.out.println(b); } public static Boolean returnsNull() { return null; }

  2. 在需要对象时使用布尔值,例如:

    • 布尔流,
    • 可选
    • 布尔值的集合

答案 7 :(得分:0)

Boolean 是线程安全的,因此您也可以考虑这个因素以及答案中列出的所有其他因素