使用一个类把基本数据类型包装起来,这个类称为包装类。这个类中可以定义一些方法,用于操作基本数据类型。
package lch;
public class fangfa {
public static void main(String[] args){
//构造方法:
Integer i1 = new Integer(5);
int n1 = i1.intValue();
//静态方法:
Integer i2 = Integer.valueOf(3);
}
}
package lch;
import java.util.ArrayList;
public class fangfa {
public static void main(String[] args){
//自动装箱:
Integer i1 = 5;
//自动拆箱:
int n1 = i1 + 4;
System.out.println(n1);
ArrayList<Integer> list1 = new ArrayList<>();
//自动装箱:
list1.add(1);
list1.add(2);
}
}
package lch;
public class fangfa {
public static void main(String[] args){
//基本数据类型转字符串:
int n1 = 4;
String str1 = n1 + "";
String str2 = Integer.toString(n1);
String str3 = String.valueOf(n1);
//字符串转基本数据类型:
String str4 = "1234";
int n2 = Integer.parseInt(str4);
}
}
集合是Java提供的一种容器,可以存储多个元素。
集合的长度是可以变化的。
集合存储的都是对象,且对象的类型可以不一致。
List接口:Vector集合,ArrayList集合,Linkedlist集合。
有序,允许重复,有索引。
Set接口:TreeSet集合,HashSet集合,LinkedHashSet集合。
不允许重复,无索引。
package lch;
import java.util.ArrayList;
import java.util.Collection;
public class fangfa {
public static void main(String[] args){
Collection<String> c1 = new ArrayList<>();
System.out.println(c1);
c1.add("abc");
c1.clear();
c1.add("abc");
c1.remove("abd");
System.out.println(c1.contains("abc"));
System.out.println(c1.isEmpty());
System.out.println(c1.size());
c1.add("abc");
c1.add("abc");
String[] str = new String[6];
c1.toArray(str);
System.out.println(str[0]);
}
}
迭代是Collection集合元素的通用获取方式。
Iterator是一个接口,不能直接使用。需要使用Collection中的iterator方法。
.next()
方法自带步进效果。
package lch;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class fangfa {
public static void main(String[] args){
Collection<String> c1 = new ArrayList<>();
c1.add("aaa");
c1.add("bbb");
c1.add("ccc");
Iterator<String> it1 = c1.iterator();
while(it1.hasNext()){
System.out.println(it1.next());
}
}
}
JDK1.5之后的新特性。
所有的单列集合都可以使用增强for循环。
package lch;
import java.util.ArrayList;
import java.util.Collection;
public class fangfa {
public static void main(String[] args){
int[] a = {
1,2,3,4,5};
for(int i : a){
System.out.println(i);
}
Collection<String> c1 = new ArrayList<>();
c1.add("aaa");
c1.add("bbb");
c1.add("ccc");
for(String it : c1){
System.out.println(it);
}
}
}
创建集合,不使用泛型:
好处:集合不使用泛型,默认的类型就是Object类,可以存储任意类型的数据。
坏处:不安全,会引发异常。
package lch;
import java.util.ArrayList;
import java.util.Iterator;
public class fangfa {
public static void main(String[] args){
ArrayList list = new ArrayList();
list.add(1);
list.add("abc");
Iterator it= list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
这样写就不能使用String特有的方法。
创建集合,使用泛型:
好处:避免了类型转换的麻烦。把运行期异常提前到了编译期。
坏处:泛型是什么类型就只能存储什么类型。
package lch;
public class Person<E> {
public E name;
}
package lch;
public class fangfa {
public static void main(String[] args){
Person<Integer> p1 = new Person<>();
p1.name = 12321;
System.out.println(p1.name);
}
}
package lch;
public class Person {
public <E> E method1(E a){
return a;
}
}
package lch;
public class fangfa {
public static void main(String[] args){
Person p1 = new Person();
System.out.println(p1.method1(5));
System.out.println(p1.method1("qdqwed"));
}
}
package lch;
public interface MyInterfaceAbstract<I> {
abstract void method(I i);
}
package lch;
public class MyInterfaceImpl implements MyInterfaceAbstract<String>{
@Override
public void method(String str1) {
System.out.println(str1);
}
}
package lch;
public interface MyInterfaceAbstract<I> {
abstract void method(I i);
}
package lch;
public class MyInterfaceImpl<I> implements MyInterfaceAbstract<I>{
@Override
public void method(I i) {
System.out.println(i);
}
}
当不知道使用什么类型时,可以使用?
来表示未知通配符。只能使用Object类中的共性方法,集合中元素自身方法无法使用。
不能创建对象使用,只能作为方法的参数使用。
package lch;
import java.util.ArrayList;
import java.util.Iterator;
public class fangfa {
public static void main(String[] args){
ArrayList<Integer> a1 = new ArrayList<>();
a1.add(1);
a1.add(2);
a1.add(3);
ArrayList<String> a2 = new ArrayList<>();
a2.add("a");
a2.add("b");
a2.add("c");
printlist(a1);
printlist(a2);
}
public static void printlist(ArrayList<?> list){
Iterator<?> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
泛型的上限:? extneds E
代表使用的泛型必须是E类型的子类或本身
泛型的下限:? super E
代表使用的泛型必须是E类型的父类或本身
List三大特点:
1.有序;
2.有索引;
3.允许重复元素。
底层是数组结构。多线程实现。
增删的底层原理是把元素复制到一个新的数组中去。
底层是链表结构。
package lch;
import java.util.Iterator;
import java.util.LinkedList;
public class fangfa {
public static void main(String[] args){
LinkedList<Integer> list1 = new LinkedList<>();
list1.add(3);
list1.add(4);
list1.add(5);
list1.addFirst(2);
list1.addLast(6);
list1.remove(2);
Iterator it = list1.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
底层结构也是数组,但是是单线程的,速度较慢。
不允许重复元素,无索引。
底层是一个哈希表,查询快。
package lch;
import java.util.HashSet;
import java.util.Iterator;
public class fangfa {
public static void main(String[] args){
HashSet<Integer> set1 = new HashSet<>();
set1.add(4);
set1.add(2);
set1.add(3);
Iterator it = set1.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
for(Integer i:set1){
System.out.println(i);
}
}
}
在Object类有一个int hashCode()
方法,可以获取对象的哈希值,等于地址的10进制值。
package lch;
public class fangfa {
public static void main(String[] args){
Person p1 = new Person();
System.out.println(p1.hashCode());
Animal a1 = new Animal();
System.out.println(a1.hashCode());
}
}
JDK1.8之前:数组+链表
JDK1.8之后:数组+链表,超过8位的链表会转化为红黑树
Set在使用add方法时会调用hashCode()方法和equals()方法,来判断是否重复。
必须重写hashCode和equals方法,否则不能去重。
package lch;
import java.util.Objects;
public class Animal {
Animal(){
}
Animal(String name, int age){
this.age = age;
this.name = name;
}
private String name;
private int age;
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Animal animal = (Animal) o;
return age == animal.age &&
Objects.equals(name, animal.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
package lch;
import java.util.HashSet;
import java.util.Iterator;
public class fangfa {
public static void main(String[] args){
Animal a1 = new Animal("a", 1);
Animal a2 = new Animal("a", 1);
Animal a3 = new Animal("b", 1);
Animal a4 = new Animal("a", 2);
HashSet<Animal> set1 = new HashSet<>();
set1.add(a1);
set1.add(a2);
set1.add(a3);
set1.add(a4);
Iterator it = set1.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
继承了HashSet集合。底层是哈希表+链表。链表用来记录元素存储顺序,保证元素有序。
package lch;
import java.util.*;
public class fangfa {
public static void main(String[] args){
HashSet<Integer> s1 = new HashSet<>();
LinkedHashSet<Integer> s2 = new LinkedHashSet<>();
s1.add(1);
s1.add(3);
s1.add(2);
s2.add(1);
s2.add(3);
s2.add(2);
Iterator it1 = s1.iterator();
Iterator it2 = s2.iterator();
while(it1.hasNext()){
System.out.println(it1.next());
}
System.out.println();
while(it2.hasNext()){
System.out.println(it2.next());
}
}
}
参数列表数据类型确定但个数不确定时可以使用。
可变参数底层是一个数组,传递参数个数可以是0个,1个或多个。
一个方法的参数列表只能有一个可变参数,且必须写在参数列表末尾。
格式:修饰符 返回值类型 方法名(参数类型...形参名){}
package lch;
public class fangfa {
public static void main(String[] args){
int[] a = {
1,3,5,3,5,3,2,3,6};
System.out.println(method1(a));
System.out.println(method2(a));
}
public static int method1(int...a){
int sum = 0;
for(int i:a) {
sum += i;
}
return sum;
}
public static int method2(int a[]){
int sum = 0;
for(int i:a) {
sum += i;
}
return sum;
}
}