Java数据类型
包装类型
为了让基本类型也具有对象的特征,就出现了包装类型(比如在使用集合类型Collection时就一定要使用包装类型而非基本类型)
因为容器都是装object的,这时就需要这些基本类型的包装类了。
区别:
1. 声明方式不同:包装类型需要使用new关键字来在堆空间中分配存储空间;
2. 存储方式以及位置不同:基本类型是直接将变量存储在栈中,而包装类是将对象放在堆中,通过引用来使用;
3. 默认值不同,基本类型都有默认值,int是0 、boolean是false;包装类型的默认值是null;
4. 使用方式不同:基本类型直接赋值使用;包装类型可当做对象来使用;
short s1=1
s1=s1+1 × 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再
赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
s1+=1 √ 由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
a++和++a
&和&&的区别
&和&& 都可以用作逻辑“与”的运算符,当运算符两遍表达式的结果都没true时,整个运算结果才为true,否则为false;
&&还具有短路的功能,对于if( d!=null && d.equals("11") ),当d为null时,后面的表达式不会执行,整个运算返回false;
将&&改为& ,则会执行后面表达式,抛出NullPointerException异常;
&还可以用作位运算符(“与”运算)↓↓
位运算符 & 、| 和 ^
按位与运算符 & : 按二进制位进行“与”运算 。
规则:两位同时为“1”,结果才为“1”,否则为0;比如5 & 7=5
按为或运算符 | : 按二进制位进行“或”运算 。
规则:两位只要有一个为“1”,其值为“1”,否则为“0”
3 | 5 即 011 | 101 = 111 3 | 5=7
按为异或运算符 ^ : 按二进制位进行“异或”运算。
规则:两位不同时,为“1”,否则为 “0”
5 ^ 7 即 101 | 111 = 010 5 ^ 7=2
switch选择结构可使用的数据类型的数据
基本类型中,没有boolean、
浮点类型(double和float)和
长类型long,
.相应的包装类型也没有。
外加String和enum。
try{}里有return时,与finally执行顺序
==和equals
1)对于 ==
如果作用于基本数据类型得变量,比较的是其存储的“值“是否相等;
如果作用于包装类型的变量,比较的是所指对象的内存空间地址;
2)对于 equals
equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象;
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
String重写的equals方法:
String s = "hello"和String s = new String("hello"); 的区别
在JAVA虚拟机(JVM)中存在着一个字符串池(常量池),其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。
String s = new String("hello"); 可能创建两个对象也可能创建一个对象。如果常量池中有hello
字符串常量的话,则仅
仅在堆中创建一个对象。如果常量池中没有hello
对象,则堆上和常量池都需要创建。
String s = "hello" 这样创建的对象,JVM会直接检查字符串常量池是否已有"hello"字符串对象,如没有,就
分配一个内存存放"hello",如有了,则直接将字符串常量池中的地址返回给栈。
(没有new,没有堆的操作)
String s="a"+"b"+"c"+"d"
所以,String s="a"+"b"+"c"+"d"创建一个对象
String、StringBuffer和StringBuilder区别
1)可变与不可变
String底层使用一个不可变的字符串数组 所以内容不可变;
StringBuffer和StringBuilder都继承了AbstractStringBuilder底层的可变字符串数组 所以内容可变;
首先栈中的"str1"变量指向堆中的“123”对象,栈中的"str2"变量指向堆中的“456”对象,当执行到str1=str1+str2时,系统重新
在堆中new一个更大的数组出来,然后将"123"和"456"都复制进去,然后栈中的"str1"指向这个新new出来的数组;
所谓的不可变是指:它没有在原数组“123”上进行修改,而是新建了个更大数组进行扩展,也就是说,这时候堆里还是有“123”
这个对象数组存在的,只不过这个时候"str1"变量不在指向"123"这个数组了,而是指向了新new出来的数组,这就是和StringBuffered
的区别,后者是在原数组上进行修改,改变了原数组的值,StringBuffered不是通过新new一个数组去复制,而是在原数组基础上进行扩展。
2)线程安全
String线程安全;
StringBuffer线程安全,效率较低,StringBuffer的大部分方法用synchronized修饰,具有同步锁,多个线程只能互斥地调用这些方法。
StringBuilder线程不安全,效率较高;
集合
①List、Set
Queue接口与List、Set同一级别,都继承了Collection接口
LinkedList既可以实现Queue接口,也可以实现List接口;
LinkedList实现了Queue接口,Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果
是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法)。
----List 有序,可重复(这里的有序指的是按照放入的顺序进行存储。如按照顺序把1,2,3存入List,
那么,从List中遍历出来的顺序也是1,2,3)
· ArrayList 点击详解(源自公众号:Java知音) -----查询快,增删慢,效率高,线程不安全。
· LinkedList 点击详解(源自公众号:Java知音) -----查询慢,增删快,效率高,线程不安全。
· Vector ----- 底层结构是数组,查询快,增删慢,线程安全(synchronized),效率低。
对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
对于新增和删除操作add和remove,LinkedList优于ArrayList,因为ArrayList要移动数据。
----Set 唯一,不一定无序
· HashSet(无序,唯一,可为null) 底层是采用HashMap实现的(HashMap是Java中用哈希表实现的一种Map),也就是说
HashSet 底层数据结构其实是哈希表。
保证唯一性:hashCode()和equals()
· LinkedHashSet (存储有序,唯一,可为null) 底层数据结构是链表和哈希表
链表保证元素有序;哈希表保证元素唯一
· TreeSet (有序,唯一,不可为) 底层数据结构是采用TreeMap(红黑树)实现的
自然排序、比较器排序(点击查看:TreeSet的两种排序比较)
List<String> arrayList = new ArrayList<String>(); arrayList.add("1,"); arrayList.add("2,"); arrayList.add("3,"); arrayList.add("4,"); arrayList.add("5"); System.out.println("ArrayList:=========================="); for(String arrList : arrayList){ System.out.print(arrList); } System.out.println(""); List<String> linkedList = new LinkedList<String>(); linkedList.add("1,"); linkedList.add("2,"); linkedList.add("3,"); linkedList.add("4,"); linkedList.add("5"); System.out.println("LinkedList:==========================="); for(String linkList : linkedList){ System.out.print(linkList); } System.out.println(""); Set<String> hashSet = new HashSet<String>(); hashSet.add("1,"); hashSet.add("2,"); hashSet.add("3,"); hashSet.add("4,"); hashSet.add("5"); System.out.println("HashSet:=============================="); for(String hashst: hashSet){ System.out.print(hashst); } System.out.println(""); Set<String> linkedHashSet = new LinkedHashSet<String>(); linkedHashSet.add("1,"); linkedHashSet.add("2,"); linkedHashSet.add("3,"); linkedHashSet.add("4,"); linkedHashSet.add("5"); System.out.println("LinkedHashSet:========================="); for(String linkedst : linkedHashSet){ System.out.print(linkedst); } System.out.println(""); Set<String> treeSet = new TreeSet<String>(); treeSet.add("1,"); treeSet.add("2,"); treeSet.add("3,"); treeSet.add("4,"); treeSet.add("5"); System.out.println("TreeSet:=============================="); for(String treest : treeSet){ System.out.print(treest); }