(1)
设定两个变量a,b.如何不通过第三方变量使得两两变量交换
int a=a+b;
int b=a-b
int a=a-b;
总结:这个做法可以减少栈的空间,并且这个不断利用更新的值进行运算,不错的思想(不添加,则保留),可是可读性较差
(2)
集合遍历的其中一种方法
ArrayList a=new ArrayList();
a.add(0,30);
a.add(1, 15);
Iterator it1 = a.iterator();
while(it1.hasNext()){
System.out.println(it1.next());
}
(3)
fail-fast机制出现于两种场景,第一种是单线程情况下,使用Iterator对集合进行增加和删除操作(Java底层对集合增加和删改加入了一个变量用来记录删除和
添加记录数,以此判断是否对集合进行增加和删除操作)
第二种是多线程情况下去对集合进行操作
解决方案:第一种情况就是遍历集合的时候不要增加和删除操作
第二种情况使用对应的copyonwrite容器来保障线程安全(CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。)
(4)
HashMap是一个基于数组的数据结构,不过这个数组的类型是一个实体
存储下标获取的方式先是hash(key.hashCode()),然后和数组的长度减去一来进行和运算来获取下标索引(不採用与运算是因为和运算更快)
一旦HashMap的equal方法被重写,那麽对应的hashCode()方法也需要被重写。(这是基于原则,因为判断equal有一部分是需要判断Hashcode的)
(5)
Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是为了让其可序列化。
当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象,要不然序列化后干嘛呢,所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。
(6)
webService是一个远程调用平台,基于Soap协议,通过wsdl文件格式以及查找对应的UDID来获取连接(要暴露方法出去和访问的时候需要加上wsdl后缀)。写好服务端的代码后,通过cmd运行对应指令会自动生成客户端的代码
具体参考 https://www.cnblogs.com/fengwenzhee/p/6915606.html
(7)
服务器端,首先是服务器初始化Socket,然后是与端口进行绑定(blind()),端口创建ServerSocket进行监听(listen()),然后调用阻塞(accept()),等待客户端连接。与客户端发生连接后,会进行相关的读写操作(read(),write()),最后调用close()关闭连接。
(8)
访问修饰符权限如下所示:
(9)
switch语句后的控制表达式只能是short、char、int、long整数类型和枚举类型,不能是float,double和boolean类型。String类型是java7开始支持。
(10)
ThreadLocal不是继承自Thread
ThreadLocal没有进行数据共享,除非同步
ThreadLocal是采用哈希表的方式来为每个线程都提供一个变量的副本
ThreadLocal保证各个线程间数据安全,每个线程的数据不会被另外线程访问和破坏
(11)
String str1="hello";
String str2="he"+ new String("llo");
System.out.println(str1==str2);
答案是false
原因是String str1="hello"; 这样创建字符串是存在于常量池中
String str2=new String("hello"); str2存在于堆中,
==是验证两个对象是否是一个(内存地址是否相同)一个在堆中,一个在常量池中,内存地址不一致
(12)
list和set都是接口
ArrayList和linkedlist类是实现了List接口,而不是继承
AbstractSet类实现Set接口
(13)
(不定项选择题) 在Java中下面Class的声明哪些是错误的?
A public abstract final class Test { abstract void method(); }
B public abstract class Test { abstract final void method(); }
C public abstract class Test { abstract void method() { } }
D public class Test { final void method() { } }
答案:ABC
A、final修饰的类为终态类,不能被继承,而 抽象类是必须被继承的才有其意义的,因此,final是不能用来修饰抽象类的。
B、 final修饰的方法为终态方法,不能被重写。而继承抽象类,必须重写其方法。
C中定义的抽象方法没有实体时候,大括号必须省略。抽象类可以没有抽象方法
(14)
HashMap根据key的hashCode值来保存value,需要注意的是,HashMap不保证遍历的顺序和插入的顺序是一致的。HashMap允许有一条记录的key为null,但是对值是否为null不做要求。HashTable类是线程安全的,它使用synchronize来做线程安全,全局只有一把锁,在线程竞争比较激烈的情况下hashtable的效率是比较低下的。因为当一个线程访问hashtable的同步方法时,其他线程再次尝试访问的时候,会进入阻塞或者轮询状态,比如当线程1使用put进行元素添加的时候,线程2不但不能使用put来添加元素,而且不能使用get获取元素。所以,竞争会越来越激烈。相比之下,ConcurrentHashMap使用了分段锁技术来提高了并发度,不在同一段的数据互相不影响,多个线程对多个不同的段的操作是不会相互影响的。每个段使用一把锁。所以在需要线程安全的业务场景下,推荐使用ConcurrentHashMap,而HashTable不建议在新的代码中使用,如果需要线程安全,则使用ConcurrentHashMap,否则使用HashMap就足够了。