变量相加和常量相加的区别
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
> b1和b2是两个变量,变量里面存储的值都是变化的,所以在程序运行中JVM是无法判断里面具体的值.
> byte类型的变量在进行运算的时候,会自动类型提升为int类型.
byte b4 = 3 + 4;
> 3和4都是常量,java有常量优化机制,就是在编译的的时候直接把3和4的结果赋值给b4了.
进行混合运算的时候,byte,short,char不会相互转换,都会自动类型提升为int类型.
其他类型进行混合运算的是小的数据类型提升为大的.
byte,short,char -- int -- long -- float -- double
>它们底层的存储结构不同.
>float表示的数据范围比long的范围要大.
Java语言中的字符char可以存储一个中文汉字吗?为什么?
可以.因为Java语言采用的是Unicode编码,Unicode编码中的每个字符占用两个字节,而中文也是占的两个字节.
算术运算符
+,-,*,/,%,++,--
%运算符:
|a|<|b|为a |a|=|b|为0,或是|b|的倍数. %运算符结果的符号只和左边有关系,与右边无关.
任何一个正整数%2结果不是0就是1可以用来当作切换条件.
什么时候使用switch,什么时候使用if
判断固定值的时候使用switch.
判断范围或者是区间的时候使用if. 如果区间范围很小,也可以使用switch.
数据结构之数组和链表
数组:查询快修改也快,增删慢.
链表:查询慢,修改也慢,增删快.
类和对象
类:是一组相关的属性和行为的集合.
对象:是该类事物的具体体现.
接口:标准的规范、功能的实现
Collection接口:
Set/List:
a:List,有序可重复可通过索引访问 Set,无序不重复无索引
>b:List中采用顺序的方式加入元素,而HashSet中的内容是属于散列存放的.
HashSet判断唯一的依据是:(元素类型)的hashCode()和equals()的返回结果.
规则是:先根据[HashCode()]判断添加的新元素与集合内旧元素的hashCode值,不同则不同;相同,再根据[equals()]判断比较结果,返回true则相同,返回false则不同.
?如果两个元素的equals()返回true,但它们的hashCode()返回值不等,添加成功./重写hashCode()原则:当两个对象的equals()返回为true时,这两个对象的hashCode()的返回值也应相等.
>>:LinkedHashSet迭代Set中的全部元素有很好的优点.
>>:TreeSet:自然排序.
>:在各种list中,最好把ArrayList作为缺省选择.
>:如何确定HashSet对象在HashSet中的存储位置?当在集合中存入一个元素时,HashSet会调用该对象的hashCode()来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置.
for增强的底层为迭代.set的底层为map.
map Set<K> for(K) map
>>删除集合中的值:Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
whhile(it.hasNext()){
syso(it.next());
it.remove();
}
Set<Person> set = new HashSet<Person>();
set.add(new Person("张三", 23));
set.add(new Person("李四", 24));
set.add(new Person("王五", 34));
for(Person p:set){
System.out.println(p.name+p.age);
}
boolean add(E e) /boolean remove(O o) /Iterator<E> iterator()
递归:反复向栈内存存入新的方法.
Map接口:
具有映射关系的集合(key,value).
异常:
一:创建异常
二:抛出异常
三:处理异常(1:try/catch 2:声明抛出异常)
//线程池
ExecutorService threadPool = Executors.newFixedThreadPool(30);
try{
ServerSocket ss = new ServerSocket(8080);
while(true){
Socket socket = ss.accept();
Runnable target = new ServerRunnable(socket);
threadPool.submit(target);
}
}catch(Exception e){}
数组和集合的区别
区别1 : 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值.
集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象.
区别2 : 数组长度是固定的,不能自动增长.
集合的长度的是可变的,可以根据元素的增加而增长.
数组和集合什么时候用?
1,如果元素个数是固定的推荐用数组.
2,如果元素个数不是固定的推荐用集合.
迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,
那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,
这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,
第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可.
泛型概述和基本使用
提高安全性(将运行期的错误转换到编译期).省去强转的麻烦.<>中放的必须是引用数据类型.前后的泛型必须一致.
继承Thread和实现Runnable接口的区别
继承Thread
直接使用Thread类中的方法,代码简单.但如果已经有了父类,就不能用这种方法.直接继承Thread不能共享同一资源.
实现Runnable接口
自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现的.它也可以共享同一资源.是不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂.